Android/Development Tips

Android/Development Tips

Proguard 로 난독화 된 코드 복호화

앱 개발을 하다보면, Proguard 를 적용하게 되고 이로인해, 간혹 crashlytics 혹은 google console 에 난독화가 적용된 코드가 전달 되는 경우가 있습니다.(AAB를 적용하게되면, Mapping 파일을 따로 추가하지 않아도 되지만, 난독화된 코드들이 Crashlytics 에 기록되는 경우가 있었습니다.) 따라서 해당 코드라인을 수정하려면 de-obfucated 가 필수 입니다! 매번 잊어버려서 이후에 참고할 수 있게 블로그에 정리해둡니다. 1. $ANDROID_SDK_DIRECTORY/tools/proguard/bin/proguardgui.sh 실행 ANDROID_SDK_DIRECTORY 는 안드로이드 스튜디오를 켜고, local.properties 의 sdk.dir 를 참고하시면..

Android/Development Tips

Bitmap, contentUri 를 Retrofit RequestBody 에 담을 때 Tips

보통 Retrofit 를 통해 RequestBody 를 만들어 서버로 보낼 때, Bitmap -> file 저장 -> file 을 RequestBody 로 변경하여 서버로 보내는 예제들이 간혹 보입니다. contentUri 도 마찬가지로 file 로 저장하고 RequestBody 로 변경하여 서버로 보내곤합니다. 그리고 코드도 올바르게 동작합니다. 하지만 해당 과정에는 파일로 저장할 필요가 없는 케이스도 있습니다. 해당 케이스의 경우 아마 위의 방식을 사용하면 이후에 파일을 삭제하는 로직 혹은 버전이 올라가면 해당 파일을 포함한 폴더를 비워주는 작업들이 필요하게 됩니다. 이런 경우 불필요한 파일 IO 작업을 생략할 수 있는 방법들이 있습니다. 1. Bitmap 의 경우 class BitmapRequest..

Android/Development Tips

Hilt 수박 겉핥기

www.youtube.com/watch?v=gkUCs6YWzEY 앞으로 Hilt 를 사용할 것 같은 느낌이 강하게 들어, 드로이드 나이츠 2020 옥수환님이 발표하신 영상 보면서 정리해봤습니다 Dependency Injection(의존성 주입) 이란 ? - 생성자 또는 메세드 등을 통해 외부로부터 생성된 객체를 전달받는 행위 의존성 주입의 특징? - 클래시간 결합도를 느슨하게 만든다 - 인터페이스 기반으로 설계되며, 코드를 유연하게 변경 가능하도록 한다 - Stub 또는 Mock 객체를 사용하여 단위 테스트를 하기가 더욱 쉬워진다 간단한 예제코드 // 의존성 주입이 없는 코드 class MemoRepository { private val db = SQLiteDatabase() fun load(id: St..

Android/Development Tips

DialogFragment 를 상속하는 다이얼로그에서 dismiss 할 때 Tips

// dialog 를 프로퍼티(멤버변수)로 선언했다고 가정 dialog?.dismiss() dialog = Dialog() dialog?.show(xxxFragmentManager, dialogTag) 위와 같은 코드가 있다. 대략적인 의미를 보면 1. dialog null 이 아니라면 dismiss 시키고 2. dialog 를 초기화 하고 3. 마지막으로 다이얼로그를 보여준다. 잘 작성한 코드로 다이얼로그가 중복으로 뜨는일은 없을 것 같이 느껴진다. 하지만 Configuration change(퍼미션 변경, 화면 변경, 언어 변경 등), OOM 가 일어나면 문제가 생기게 된다. 보통 안드로이드 이론 공부하면, Configuration change 가 일어나면 액티비티가 다시 시작되는 것을 우리는 알고 ..

Android/Development Tips

java.lang.IllegalStateException: Software rendering doesn't support hardware bitmaps 에러 수정하기

Context 와 Uri 를 사용하여, Bitmap 을 가져오는 함수가 deprecated 되어 Replacement 함수로 변경하고 나서 QA 중 에러가 발생했다. 아래와 같이 레거시 방법들을 사용하고 있었고 // (deprecated) BitmapDrawable(context.resources).bitmap // (deprecated) BitmapDrawable( context.resources, MediaStore.Images.Media.getBitmap(context.contentResolver, this) ).bitmap 사용했던 문제의 코드 ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, this)) 에서..

Android/Development Tips

다양한 뷰타입을 가지는 Recyclerview 만들기

오랜만에 안드로이드 글을 작성하는 것 같습니다. 적당한 퍼포먼스를 가지는 리싸이클러뷰를 만들어 볼 예정입니다. 완성된 소스코드는 맨 아래 링크에 있습니다. 이번 포스팅은 Architecture 등은 제외하고, Recyclerview 구현에만 관심이 있습니다. 4개의 뷰타입을 가지는 리싸이클러뷰 디펜던시는 프로젝트 생성시 추가되어 있는 라이브러리 + Third party (Glide, Recyclerview) 입니다 네트워크에서 가져온다면 (Gson 등이 필요합니다) 먼저 보여줄 Data class 를 명세해줍니다. @Parcelize 어노테이션을 이용하여, 다른 Activity, Fragment 에 아이템을 전달할 일이 있을 때, 쉽게 처리할 수 있도록 추가하였습니다. @Parcelize data cla..

Android/Development Tips

Clean Architecture (무비 앱)

몇몇 샘플을 보고 참고하여 간단하게, 영화 검색/추천 앱을 개발하였다. 아직 이해하지 못한 부분이 많아서 앞으로도 쭉 고칠예정 (리뷰나 코멘트도 부탁드립니다) 보일러 플레이트의 양은 늘지만, 확실히 관심사가 분리되는 것이 현업에 적용해보고싶은 욕심이든다. 코드 저장소

Android/Development Tips

KOIN FragmentFactory 사용하기

2020년 07월 12일 수정 아래 커밋을 보면 어떤식으로 FragmentFactory 를 사용할 수 있는지 알 수 있다. https://github.com/Nanamare/CleanArchitecture/commit/52f173b7042583da288cc5a5b03e4b84b0f4d65c [Feature] Change Fragment Factory logic · Nanamare/CleanArchitecture@52f173b Permalink Browse files [Feature] Change Fragment Factory logic Loading branch information Showing 14 changed files with 129 additions and 51 deletions. +1 −1 ..

Android/Development Tips

Custom view 에서 Koin 사용해 ViewModel 주입할 때 주의 할점

몇일전에 CustomView에서 viewModel 을 주입하며 삽질한 경험입니다. 보통 커스텀 뷰를 만들면 이런 모습이 많이 나오게 됩니다. class CustomView : BaseCustomView { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) } 근데 만들고 나면 CustomViewModel 을 주입 시켜줘야 하는데 액티비티가 아니기..

Nanamare
'Android/Development Tips' 카테고리의 글 목록 (3 Page)