요구 사항은 3.3.0.0 이후 버전에서 변경될 수 있으니, 이 규칙을 적용하기 전에 해당 sealing 버전의 릴리스 노트를 확인하세요.
Dex Protection이 활성화되면 DoveRunner는 APK/AAB 매니페스트에 선언된 패키지를 찾아 비즈니스 코드를 식별합니다. 만약 ProGuard 또는 R8가 해당 클래스를 다른 위치로 재패키징했다면 DoveRunner가 이를 찾지 못할 수 있으며, 이 경우 난독화가 적용되지 않습니다.
해결책은 ProGuard/R8에게 클래스 및 멤버 이름은 난독화하되 패키지 구조는 유지하도록 지시하는 단일 규칙입니다.
필수 규칙
다음 규칙을 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 |
피해야 할 규칙
다음 규칙들은 패키지 경로를 재배치하거나 평탄화하여 DoveRunner가 의존하는 패키지 구조를 깨뜨립니다. -keeppackagenames와 함께 사용하지 마세요:
-repackageclasses 'x'
-flattenpackagehierarchy 'x'이 규칙들은 기본적으로 R8에 의해 적용되지 않으며,
proguard-android-optimize.txt에도 포함되어 있지 않습니다. 직접 또는 서드파티 라이브러리가 명시적으로 추가하지 않는 한 안전합니다. 확실하지 않은 경우 외부 라이브러리의 consumer-rules를 확인하세요.라이브러리 호환성
-keeppackagenames는 패키지 경로만 유지하며 클래스 및 멤버 이름은 여전히 난독화합니다. 일부 라이브러리(예: 리플렉션 또는 직렬화를 사용하는 라이브러리)는 런타임에 올바르게 동작하기 위해 추가 ProGuard 규칙이 필요합니다.
사용 중인 라이브러리가 자체적으로 필요한 ProGuard 규칙을 제공하는 경우 그대로 적용하세요. -keeppackagenames는 특정 클래스나 멤버를 위한 표준 -keep 규칙과 충돌하지 않으므로, 위에서 언급한 패키지 재배치 규칙(-repackageclasses, -flattenpackagehierarchy)만 피한다면 충돌이 없습니다.
설정 검증
릴리즈 빌드 후 매핑 파일을 열어 패키지 경로가 유지되고 클래스 이름이 난독화되었는지 확인하세요:
app/build/outputs/mapping/release/mapping.txt예상 출력 예:
com.example.api.UserService - com.example.api.a:
void fetchUser() - b
com.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가 패키지를 식별하고 난독화하는 데 영향을 주지 않습니다.