Programming/Android

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

YK Choi 2021. 11. 16. 23:13

코드 난독화를 하면 디컴파일, 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

https://seansation-blog.tistory.com/12