Programming/Android 21

[이슈 기록] Android 라이브러리 의존성 문제 해결하기

배경 Room 버전을 2.3.0 에서 2.4.0-alpha03 이상으로 업데이트 해야할 일이 생겼었다. 그런데 버전 올리고 빌드를 돌렸더니 갑자기 coroutine 과 rxjava쪽에서 에러가 발생했다고 뜬다. 컴파일 타임이 아닌 런타임에 에러가 발생했다. Room을 업데이트하는데 coroutine/rxjava에서 문제가 생겨서 굉장히 뜬금없다고 생각했다. 원인 라이브러리간에 의존성이 꼬여있었기 때문! kotlinx-coroutines-core의 버전과 kotlinx.coroutines-reactive의 버전은 동일해야한다고 한다. 관련 링크 내가 dependency에 추가한 paging-rxjava3에는 kotlin-coroutines-reactive 가 1.4.3 버전으로 들어가있다. 하지만 room..

Programming/Android 2022.10.03

[이슈 기록] Android 에서 단일 모듈 -> 멀티 모듈로 변경할 때 만났던 빌드 에러 이슈

클린 아키텍쳐를 위하여 app - domain - data 의 Layer로 분리한다고 했을 때, app은 domain의 의존성을 갖고(usecase or repository interface 등), data는 domain의 의존성을 갖는다(repository interface를 상속해야함 등) 그런데 app 이 domain 의 의존성만 갖고 있으면 빌드 에러가 났었다. (data의 di에서 Repository interface의 구현체인 RepositoryImp 을 주입해주는데, domain의 의존성만으로 repositoryImp을 알 수 없기 때문이라고 생각한다) 따라서 app 모듈에서 domain과 data 모듈에 모두 의존성을 추가하니 문제가 해결되었다. --아무리 구글링해도 안나왔다. 한 4시간 ..

Programming/Android 2022.06.27

[이슈 기록] TagetSdk 30 -> 31 올리는 과정에서 까다로웠던 이슈 기록 android:exported needs to be explicitly specified for <activity> 이슈

배경 TargetSdk 31부터는 Activity나 Service, broadcast receiver에서 인텐트 필터를 사용하지만 명시적으로 선언된 android:exported 값이 없으면 Android 12 이상을 실행하는 기기에 앱을 설치할 수 없다. ( Reference : https://developer.android.com/about/versions/12/behavior-changes-12?hl=ko#exported ) 하지만 나는 Manifest 파일을 잘 작성 했음에도 android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify an expli..

Programming/Android 2022.05.30

[번역] RecyclerView를 Wrapping했을 때 퍼포먼스 이슈 - feat.NestedScrollView

Bartek Lipinski의 Medium 게시물 https://medium.com/android-news/android-dev-tip-4-91b7757b1f0a Android Dev Tip #4 The performance of wrapping content in RecyclerView medium.com 을 번역한 내용입니다. 오타 또는 오역이 있다면 댓글로 남겨주시면 수정하겠습니다. [Tip] When RecyclerView is wrapping its content, it’s not recycling anymore. Every record in the dataset has an item View kept in memory for as long as the RecyclerView is in the ..

Programming/Android 2022.03.04

메모리 누수 이슈 기록 (LocationListener)

LocationListener, LocationManager를 이용하여 현재 위치를 실시간으로 업데이트하는 기능을 구현하고 있는데 LocationManager쪽에서 계속 Leak이 발생했었다. 나는 Fragment 쪽에서 LocationListener 인터페이스를 implement하고 있었다. destroy될 때 locationManager.removeUpdate() 를 하지 않으면 Leak이 발생할 수 있다는 건 이해가 됐는데, 그렇다면 난 onStop() 쪽에서 removeUpdate()했는데도 왜 발생하는건지 의아했다. 시도 1 LocatoinManager를 destroyView할 때 null로 처리를 안해서 그런가? 싶어서 lateinit var locationManager: LocationMan..

Programming/Android 2022.01.30

[Android] 첫 오픈소스 라이브러리 배포 - HoldableSwipeHandler 원리 및 출시 후기

Holdable Swipe을 시작하게 된 계기 쿠링 앱에서 추가 기능을 개발하다가 디자인 요구사항 중에 RecyclerView에서 부분 스와이프(partial swipe)가 필요하다는 것을 알게 되었다. 경험해보지 않은 UI였지만 RecyclerView에서 Expandable Recyclerview, 한 View의 스와이프처리 가능 여부는 알고 있었기에 기본적으로 제공되는/이미 다른 누군가가 만들어 놓은 Open Source Library를 쓰면 금방 구현할 수 있으리라 생각했다. 그렇게 구글링을 하던 도중 몇몇 비슷한 고민을 하고 있던 Stack Overflow글이나 블로그들을 보게 되었고 ItemTouchHelper를 이용해서 ViewHolder를 완전히 넘겨버리는 것은 가능하지만, partial-s..

Programming/Android 2022.01.03

Recyclerview에서 ListAdapter 의 변경사항이 실시간으로 업데이트 되지 않던 이슈

지난 글에서 ListAdapter를 포스팅하며 DiffUtil에서 새로운 아이탬을 구별하거나, 아이탬의 내용이 같은지 구분하는 것을 설명한 적이 있다 해당 링크 : https://yk-coding-letter.tistory.com/8 문제 상황 그런데 최근, 개발을 하던 중 Room에서 변경사항을 recyclerview에 실시간으로 업데이트하려고 했으나 잘 작동하지 않았던 이슈가 있었다. 분명히 areItemsTheSame() 과 areContentsTheSame()을 제대로 작성했음에도 ui로 드러나지 않았고, 앱을 껐다 키거나 스크롤을 내렸다가 다시 돌아왔을 때야 비로소 변경되었다. 어떻게 이런 일이 발생할 수 있는 것인지 생각해보았다. 우선 나는 정확히는 Paging3의 recyclerview를 사..

Programming/Android 2021.11.24

[Android] App 코드 난독화와 Gson으로 json 파싱이 안되는 이슈

코드 난독화를 하면 디컴파일, reverse engineering 을 어렵게 하여 보안상의 안정성을 높힐 수 있다. release앱에는 난독화를 하는 것은 좋은 방법이지만 debug모드에서는 굳이 해야할 필요는 없을 것 같다. (난독화를 하면서 빌드 시간이 증가한다고 한다.) 아무튼! Android Studio 에서 BuildType 별로 바라보는 서버 url 과 아이콘 등 분리할 것이 있었다. (Debug용, Release용) release 버전에서는 코드 난독화를 위해 모듈단의 build.gradle 에 minifyEnabled false 설정을 했는데 이상하게 앱을 실행시키고 통신 작업이 제대로 안되고 있다는 것을 알게 되었다. 구체적으로 어디서 문제가 발생한 것인지 찾아보니 minifyEnable..

Programming/Android 2021.11.16

'Open Source License' Activity plugin 적용하기

앱을 배포할 때, 오픈소스 라이선스는 Apache Lisence 2.0에도 고지의 의무가 있고 이를 무시하면 법적인 이슈를 받을 수도 있다. 이를 위해서 사용한 오픈 소스를 검토하고, 이를 앱 내에서 리스트로 보여주는 것은 여간 귀찮은 일이 아니다. 이를 위해 Google Play services에서 매우 쉽게 구현할 수 있는 plugin을 제공한다. (oss licenses plugin) 원문 링크 : https://developers.google.com/android/guides/opensource Include open source notices | Google Play services | Google Developers Google Play services sometimes includes, or..

Programming/Android 2021.10.14

RxJava + Retrofit 으로 통신 모듈 구현하기

RxJava3와 Retrofit2 를 사용하여 통신 모듈을 만들어보자 추가로 여기서 DI는 hilt를 사용했다. api는 ITunes Api를 사용하겠다. 샘플 코드로 적당한 api인 것 같다. 만들 클래스는 아래와 같다.(당장 api 통신을 하기에는 약간의 부가적인 것도 있지만 확장성을 생각해서 전부 설명하겠다.) - ITunesService - ITunesClient - NetworkModule ITunesService 이다. 반환형이 Single으로 둔 이유는 RxJava의 Observable중 Single이 한 번의 이벤트에서 사용될때 쓰이기 때문이다. 참고로 나는 여기서 한번 @Query의 어노테이션을 깜박하고 빼먹었는데 `No Retrofit annotation found. (parameter..

Programming/Android 2021.10.03