minifyEnabled, shrinkResources 그리고 android.enableR8.fullMode

Shrink, obfuscate, and optimize your app  |  Android Studio  |  Android Developers

minifyEnabled는 코드 난독화, shrinkResources는 리소스 축소, android.enableR8.fullMode는 안드로이드의 R8 컴파일러에게 더욱 공격적인 최적화를 적용하라는 명령어다.

해당 글의 내용을 따라 minifyEnabled, shrinkResources 그리고 android.enableR8.fullMode를 모두 활성화 하면 앱의 크기가 비약적으로 줄고 난독화까지 적용된다.

하지만 버그 발생 위험이 있는데, 예를 들면 retrofit2를 이용하는데 이 retrofit2가 최적화를 통하면서 버그가 발생한다.

해당 라이브러리에서 이미 해당 내용에 관한 해결책을 만들어뒀다.

R8 proguard - OkHttp

위 3 사이트를 통해 proguard의 룰을 추가해주는 방법이다.

그래서 나온 내용대로 -keep 룰을 이용해서 response의 객체를 추가했더니 문제가 해결되었습니다.

버그의 근본적인 원인은 R8 컴파일러의 fullMode는 암시적 생성자들을 유지하지 않는데 있다.

그 이유는 retrofit은 리플렉션을 통해 코드에 접근하는 방식을 이용하는데 이 부분은 컴파일 타임엔 코드에 접근하지 않기 때문에 최적화 과정에서 미사용 코드로 판단해서 삭제처리를 해버리기 때문이다.

R8 FAQ

https://blog.kakaocdn.net/dn/OuZuo/btrTPNF4o2X/iAN52Sfl7XROh283v59cG0/img.png

키워드는