코드 난독화를 하면 디컴파일, reverse engineering 을 어렵게 하여 보안상의 안정성을 높힐 수 있다.
release앱에는 난독화를 하는 것은 좋은 방법이지만 debug모드에서는 굳이 해야할 필요는 없을 것 같다. (난독화를 하면서 빌드 시간이 증가한다고 한다.)
아무튼!
Android Studio 에서 BuildType 별로 바라보는 서버 url 과 아이콘 등 분리할 것이 있었다.
(Debug용, Release용)
release 버전에서는 코드 난독화를 위해 모듈단의 build.gradle 에
minifyEnabled false
설정을 했는데 이상하게 앱을 실행시키고 통신 작업이 제대로 안되고 있다는 것을 알게 되었다.
구체적으로 어디서 문제가 발생한 것인지 찾아보니
minifyEnabled 를 하면Gson().fromJson 이쪽에서 문제가 있었다.
(이게 원인을 찾기 어려웠던 이유가 Unit Test 코드에서는 정상 실행이 된다;;)
데이터 파싱 과정에서 지정한 클래스를 찾지 못해서 문제가 발생한 듯 하다.
gradle.properties 파일에서 android.enableR8=false 로 하는 것도 방법이 된다고는 하지만 난독화의 의미가 없어지는 것 같다.
내가 적용한 방법은 data class 의 파싱을 위해서 proguardFiles에 난독화에서 제외시킬 클래스를 명시하는 것이다.
아래는 minifyEnabled 와 proguard 파일을 적은 모듈 단의 gradle.build이다.
buildTypes {
release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
그리고 아래는 위에서 proguardFile 가 가리킨 proguard-rules.pro (안드로이드 스튜디오에서 기본 프로젝트를 만들면 자동으로 생성되는 파일) 에 다음과 같이 추가한다.
-keep class com.ku_stacks.ku_ring.data.api.response.** { *; }
-keep class com.ku_stacks.ku_ring.data.db.** { *; }
-keep class com.ku_stacks.ku_ring.data.entity.** { *; }
-keep class com.ku_stacks.ku_ring.data.websocket.response.** { *; }
-keep class com.ku_stacks.ku_ring.data.websocket.request.** { *; }
내 앱의 난독화에서 제외시킬 클래스 또는 폴더(**로 여러 클래스 가능) 위치를 적는 것이다.
소스코드에서 사용처에 따른 클래스들의 폴더정리를 잘 해둘 수록 깔끔하게 처리할 수 있을 것이다.
참고한 자료
https://ddolcat.tistory.com/455
https://www.androidhuman.com/2016-07-23-proguard_for_library_project
'Programming > Android' 카테고리의 다른 글
[Android] 첫 오픈소스 라이브러리 배포 - HoldableSwipeHandler 원리 및 출시 후기 (8) | 2022.01.03 |
---|---|
Recyclerview에서 ListAdapter 의 변경사항이 실시간으로 업데이트 되지 않던 이슈 (0) | 2021.11.24 |
'Open Source License' Activity plugin 적용하기 (0) | 2021.10.14 |
RxJava + Retrofit 으로 통신 모듈 구현하기 (4) | 2021.10.03 |
RxJava 적용기 (0) | 2021.10.03 |