전체 글 32

메모리 누수 이슈 기록 (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

GitHub에서 commit한 보안파일 히스토리 삭제하기

Github에서 다른 사람들에게 보여주고 싶지 않은 파일들이 있을 수 있다. 예를 들면 google-services.json (firebase의 푸시알림을 위한 데이터가 들어가 있어서 악용하려는 사람이 있다면 앱 사용자에게 악의적인 푸시알림을 보낼 가능성이 생긴다.) 또는 signing 관련 파일, 비밀번호가 저장된 파일이 그럴 수 있다. remote 에 push가 되지 않으면 베스트이지만 push된 상황에서는 이렇게 하면 된다. 첫번째로 ".gitignore"로 해당 파일/폴더가 github에 푸시되지 않도록 한다. 이미 푸시한 상태라면 github의 history를 통해 관련 내역을 볼 수 있기 때문에 아래와 같이 깃헙에서 완전히 삭제하는것이 안전하다. 두번째로 filter-branch 를 이용하여 ..

Programming/Github 2021.11.17

[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

RxJava 적용기

RxJava는 러닝커브가 다소 있는 것으로 알려져 있다. coroutine+suspend fun 와 비교해서 높은 수준의 작업을 실시간으로 처리할 수 있고, coroutine Flow 와 비교해서 더 안정적인 프로그래밍을 할 수 있다는 장점으로 인해 배울 가치는 충분한 것 같다. 배워야할 개념도 많고 빠른 기간 내에 전부 이해할 것은 기대하지 않지만 LiveData에서의 observe, Flow에서의 일부 오퍼레이터 경험(맛보기) 이 있으니 어느정도는 유리하게 시작할 수 있지 않을까?ㅎㅎ 차근차근 시작해보자 중요한 개념 Observable / Observer RxJava에서는 Observable을 구독하는 Observer가 존재하고, Observable이 순차적으로 발행하는 데이터에 대해서 반응한다. o..

Programming/Android 2021.10.03

2021 Droid Knights 컨퍼런스 후기

2021 9월 25일 드로이드 나이츠 온라인 컨퍼런스에 참가했다. 작년에 참가했을 땐 무슨말인지 너무 어려워서 뛰쳐나갔는데, 이번엔 끝까지 들었다 ㅎㅎ;; 작년과 달라진 점은 참가료(만원)이 있다는 것과 개더타운으로도 접속할 수 있다는 것이 있다. 컨퍼런스 일정은 아래와 같다. Track1과 Track2가 동시에 실시간으로 유튜브 스트리밍 방송되며, 취향에 따라 선택해서 들을 수 있다. 각 강의가 끝나면 짧으면 5분? 길면20분? 정도의 쉬는 시간이 있는데 이때 개더타운으로 QnA를 받기도 했다. 개더타운 내에는 토스, 헤이딜러, 카카오페이에서 채용 관련 홍보, 문의도 하고 있었다.(경력자들 대상인 것 같다) 이제 본론으로 들어가서 내가 들은것 요약+느낀점을 적어보겠다. 우선 나는 Track 2개를 동시..

Programming/Android 2021.09.25

Android Studio에서 Profiler 적용기

BC 앱을 리팩토링하면서 몇몇 성능 개선을 해왔다고 생각했다. 실제 수치로도 티가 나는지 확인해보았다. Android Studio를 설치하면 제공되는 Profiler에서 이것저것 관찰해봤다. 우선 Profiler를 써보면서 신기했던 점은 이렇다. - CPU, Memory, Network, Energy 에 대한 정보를 `간략하게` 또는 `클릭해서 상세하게` 볼 수 있다. - 현재 어떤 activity를 보는지 알려준다.(처음보는 앱 분석할 때 유용할지도..?) - 같은 앱이라도 킬 때마다 사용 메모리 크기는 매번 달랐다. 테스트한 것은 아래와 같다. 1. CPU 성능 (RecyclerView에서) Jetpack Paging vs ListAdapter ListView 와 Paging+RecyclerView를..

Programming/Android 2021.09.04