인터넷에 똑같은 글이 넘치는 주제는 블로그에 쓰지 않으려 노력하는 편이다. 그런데 이 주제는 검색된 글들 중에 제대로 된 답변이 없어 정리해 둔다. 다만, proguard-rules.pro 파일 예시는 많으니 여기서는 proguard가 올바로 동작하기 위한 설정에 대해 보자.
build.gradle는 아래와 같이 선언하면 proguard의 Log 제거까지 적용된다.
android { buildTypes { <타입이름> { debuggable false minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' ... } ... } ... }
- debuggable = false
proguard 설정을 적용한다. 간혹, 프로가드는 빌드타입이 release일 때만 된다는 글이 있다. 이는 release의 빌드 타입일 때 debuggable 의 기본 값이 false이기 때문이지 빌드 타입 때문은 아니다. 명시적으로 선언하면 debug와 같은 다른 빌드 타입에서도 proguard를 적용할 수 있다. - minifyEnabled = true
proguard 내 Log 선언 제거 부분을 적용한다. -assumenosideeffects 파라미터를 사용해 android.util.Log 호출 라인이 불필요하다고 선언할 예정이므로 true로 선언해야, 코드를 줄이는 과정 중에 로그 출력 라인도 제거된다.
그 후, proguard-rules.pro 파일에 아래와 같이 설정하면, android.util.Log의 로깅 메소드를 사용한 라인을 지울 수 있다.
-assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int d(...); public static int i(...); public static int w(...); public static int e(...); }
Log 클래스 내 모든 메소드를 제거하는 것이 쉽다는 글이 있는데, 모든 메소드를 제거하면 JVM이 객체 관리 할 때 사용하는 메소드들까지 동작하지 않게 되니 주의하자.
그 밖에
- 팀버 로그는 아래와 같은 설정으로 지울 수 있다는 답이 많다. 하지만, 오늘 기준으로는 동작하지 않는다.
-assumenosideeffects class timber.log.Timber { public static *** v(...); public static *** d(...); public static *** i(...); public static *** w(...); public static *** e(...); }
- build.gradle 내 shrinkResources 파라미터는 proguard 설정과 무관하다. 대신, minifyEnabled 파라미터와 관계가 있는데, shrinkResources를 활성화하려면 minifyEnabled가 먼저 활성화되어야 한다. 그 이유는 minify(불필요한 코드 정리 과정)가 되면서 리소스 참조들도 제거가 되면, 더 효율적으로 불필요한 리소스도 정리할 수 있기 때문이다.
- apk를 signing해야 proguard가 적용된다는 글도 있다. proguard 적용 여부는 build.gradle 내 선언에만 영향을 받으므로 이는 사실이 아니다.
참조