proguard로 코드 속 로그 출력 제거하기

인터넷에 똑같은 글이 넘치는 주제는 블로그에 쓰지 않으려 노력하는 편이다.  그런데 이 주제는 검색된 글들 중에 제대로 된 답변이 없어 정리해 둔다. 다만, 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 내 선언에만 영향을 받으므로 이는 사실이 아니다.

참조

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.