Dex 보호를 위한 ProGuard 설정
Dex 보호를 활성화하면 DoveRunner는 APK/AAB 매니페스트에 선언된 패키지를 기준으로 비즈니스 코드를 식별합니다. ProGuard 또는 R8이 해당 클래스를 다른 패키지로 재배치한 경우, DoveRunner가 대상 패키지를 찾지 못해 난독화가 적용되지 않을 수 있습니다.
패키지 구조를 유지하면서 클래스·멤버 이름은 정상적으로 난독화하는 룰 한 줄로 해결할 수 있습니다.
proguard-rules.pro에 다음을 추가합니다. com.example은 실제 앱의 베이스 패키지 이름으로 교체하세요:
-keeppackagenames 'com.example.**'이 룰은 패키지 경로를 그대로 보존하면서, 내부 클래스·메서드·필드 이름은 정상적으로 난독화합니다.
| 원본 | 난독화 후 |
|---|---|
com.example.api.UserService.fetchUser() | com.example.api.a.b() |
com.example.model.Profile.userName | com.example.model.c.a |
피해야 할 룰
Section titled “피해야 할 룰”다음 룰들은 패키지 경로 자체를 재배치하거나 평탄화하므로, DoveRunner가 의존하는 패키지 구조를 무너뜨립니다. -keeppackagenames와 함께 사용하지 마세요:
-repackageclasses 'x'-flattenpackagehierarchy 'x'라이브러리 호환성
Section titled “라이브러리 호환성”-keeppackagenames는 패키지 경로만 유지하고, 클래스·멤버 이름은 여전히 난독화됩니다. 일부 라이브러리는 런타임에 리플렉션이나 직렬화를 사용하기 때문에 별도의 ProGuard 룰을 요구할 수 있습니다.
사용 중인 라이브러리에서 ProGuard 룰을 제공하는 경우, 해당 룰을 그대로 적용하면 됩니다. -keeppackagenames는 특정 클래스나 멤버에 대한 표준 -keep 룰과 충돌하지 않습니다. 단, 위에서 언급한 패키지 재배치 룰(-repackageclasses, -flattenpackagehierarchy)과는 함께 사용하지 마세요.
릴리스 빌드 후 매핑 파일을 열어 패키지 경로가 유지되고 클래스명이 난독화되었는지 확인합니다:
app/build/outputs/mapping/release/mapping.txt다음과 같이 출력되어야 합니다:
com.example.api.UserService -> com.example.api.a: void fetchUser() -> bcom.example.model.Profile -> com.example.model.c: java.lang.String userName -> a패키지 경로(com.example.api, com.example.model)가 그대로 유지되고, 클래스·멤버명이 짧은 기호로 치환되었으면 정상입니다.
AGP 버전별 호환성 상세
-keeppackagenames는 AGP 버전에 관계없이 정상 동작합니다. 주요 차이점은 R8 모드에 따른 최적화 강도입니다.
| AGP 버전 | R8 동작 | 비고 |
|---|---|---|
| 3.4 미만 | ProGuard 사용 | 정상 동작 |
| 3.4 – 6.x | R8 호환 모드 (기본) | 기존 룰 거의 그대로 동작 |
| 7.0 – 7.x | R8 풀 모드 (선택적) | android.enableR8.fullMode=true로 활성화 |
| 8.0+ | R8 풀 모드 (기본) | 클래스 머징, 인라이닝 등 공격적 최적화 적용 |
| 9.x+ | R8 풀 모드 + 추가 최적화 | 공식 릴리스 노트 참조 |
R8 풀 모드에서는 보존된 패키지 내부의 일부 클래스가 머징이나 인라이닝으로 사라질 수 있습니다. 이는 정상적인 난독화 동작이며, DoveRunner의 패키지 식별에는 영향을 주지 않습니다. 살아남은 클래스의 패키지 경로가 유지되면 충분합니다.