Proguard를 사용한 코드 난독화 - 모듈별 규칙 적용시 유의사항
관련 글
- Proguard를 사용한 코드 난독화 - 라이브러리 프로젝트에 적용하기
- Proguard를 사용한 코드 난독화 - 유닛 테스트에서 java.lang.VerifyError가 발생하는 경우
- 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.** { *; }