/ PROGUARD, ANDROID

Proguard를 사용한 코드 난독화 - 모듈별 규칙 적용시 유의사항

관련 글

여러 모듈로 구성되어 있는 프로젝트에서 모듈별로 필요한 난독화 규칙만 적용하면, 한 곳에서 모든 곳의 난독화 규칙을 관리하는 것 보다 체계적으로 관리할 수 있습니다.

하지만, 이런 방법을 사용할 때 유의해야 할 사항이 있습니다.

consumerProguardFile이 적용되는 범위 확인

consumerProguardFile을 사용하면 해당 모듈에서 사용하는 난독화 규칙을 aar 패키지에 포함므로, 이를 사용하는 다른 모듈에서 별도 처리 없이 난독화 규칙이 적용됩니다.

하지만, consumerProguardFile로 제공되는 난독화 규칙은 이를 참조하는 모듈이 애플리케이션 프로젝트 일 경우에만 적용되며, 라이브러리 프로젝트일 경우 적용되지 않습니다.

예를 들어 라이브러리 프로젝트인 :common 모듈을 참조하는, 라이브러리 프로젝트 :image_processing 모듈에서 :common 모듈에서 사용한 규칙이 필요한 경우, :common 모듈에서 이를 consumerProguardFile로 제공하더라도 image_processing 모듈에서는 이를 참조하지 않습니다.

따라서, 필요한 규칙을 :image_processing 모듈 내에 별도로 추가해야 합니다.

난독화는 각 모듈별로 독립적으로 수행됨

난독화(Obfuscation)는 각 모듈별로 수행되며, 클래스/메서드 이름이 변환된 결과를 저장하는 매핑 파일 (mapping.txt)도 별도로 생성됩니다.

때문에, 난독화 범위를 제대로 설정하지 않으면 다른 모듈에서 난독화를 수행한 클래스의 이름을 알 수 없어 Unresolved reference류의 오류가 발생합니다.

예를 들어 :common 모듈에서 com.androidhuman.example.common.Foo 클래스를 a.b.a.a.A 라는 형태로 변환하였다면, Foo 클래스를 참조하는 다른 모듈은 매핑 파일을 공유하지 않으므로 클래스 이름이 어떻게 바뀌었는지 몰라 참조할 수 없게 됩니다.

그러므로, 다른 모듈에서 참조하는 클래스는 난독화 되지 않도록 -keep public 옵션을 사용해야 합니다.

다음은 com.androidhuman.example.common 패키지 및 하위 패키지 중 public으로 선언된 클래스를 난독화 하지 않도록 합니다.

-keep public class com.androidhuman.example.common.** { *; }
kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More