R8 구성 분석기는 앱의 구성 품질에 관한 자세한 통계를 제공하여 R8의 성능 이점을 극대화할 수 있도록 설계된 도구입니다. 최적화할 수 있는 코드베이스의 비율을 나타내는 주요 측정항목(특히 축소, 최적화, 난독화 점수)을 모니터링하여 R8 최적화를 추적하고 개선할 수 있습니다. 서드 파티 라이브러리에서 도입한 규칙을 비롯하여 광범위하거나 불필요한 유지 규칙을 식별함으로써 분석기는 R8이 최대한 많은 클래스, 필드, 메서드를 효과적으로 최적화할 수 있도록 구성을 개선하는 데 도움을 줍니다.
보고서 생성
AGP 9.3.0-alpha05 이상에서는 R8 빌드를 실행할 때 build/outputs/mapping/release/configanalyzer.html에 보고서가 자동으로 생성됩니다. 출력의 자동 생성을 사용 중지하려면 다음 Gradle 속성을 설정하세요.
android.experimental.r8.enableR8ConfigurationAnalyzer=false
AGP 9.2 이하의 경우 R8로 사용 설정된 빌드로 Gradle 작업을 실행할 때 com.android.tools.r8.dumpkeepradiushtmltodirectory 시스템 속성을 설정합니다.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
예를 들어 다음 명령어를 사용하여 /tmp/r8analysis 디렉터리에 HTML 보고서를 생성합니다.
// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
보고서 이해하기
R8 구성 분석기는 앱의 R8 구성과 각 유지 규칙이 앱에 미치는 영향을 파악할 수 있도록 지원합니다. 이를 통해 R8에서 최대한의 최적화를 달성하여 앱 성능을 개선할 수 있습니다. 다음 점수를 사용하여 R8로 최적화할 수 있는 코드베이스의 양을 파악하세요.
점수 축소
R8이 앱을 축소하면 사용되지 않는 코드와 리소스를 식별하고 삭제하여 앱의 전체 크기를 줄여 최종 빌드가 최대한 간결해집니다. 축소 점수는 축소 대상 클래스, 필드, 메서드의 비율을 추적합니다. 예를 들어 축소 점수가 66% 이면 R8이 코드베이스의 66% 에서 축소를 실행할 수 있다는 의미입니다.
최적화 점수
R8은 메서드 인라이닝 및 클래스 병합과 같은 최적화를 실행하여 앱의 시작 및 메모리를 개선합니다. 최적화 점수는 R8 최적화가 적용되는 클래스, 필드, 메서드의 비율을 추적합니다. 예를 들어 최적화 점수가 66%인 경우 R8이 코드베이스의 66% 에서만 최적화를 실행할 수 있다는 의미입니다.
난독화 점수
클래스, 필드, 메서드를 더 짧은 이름으로 난독화하여 R8은 앱의 메타데이터 공간을 줄여 메모리를 절약합니다. 난독화 점수는 코드베이스 내에서 난독화할 수 있는 코드의 비율을 측정합니다.
유지 규칙 수정
점수를 개선하고 더 나은 R8 최적화를 활용하려면 R8이 앱을 최적화하는 것을 불필요하게 방지하지 않도록 유지 규칙을 개선해야 합니다. 리플렉션을 사용하여 액세스하는 클래스, 메서드 또는 필드만 유지해야 합니다.
이렇게 하려면 규칙 분석 유지를 사용하세요.

규칙의 세부 분석을 보려면 규칙을 클릭하여 세부정보 화면을 엽니다.

보관 규칙을 조정하는 방법
보관 규칙을 개선하고 앱의 R8 최적화 기능을 최대한 활용하려면 다음 단계를 따르세요.
- 각 유지 규칙에 대해 구성 분석기에서 R8로 최적화할 수 없는 클래스, 필드, 메서드의 비율을 확인합니다. 이를 사용하여 다수의 클래스, 필드 또는 메서드에서 최적화를 방지하는 유지 규칙을 식별합니다. 각 유지 규칙에 의해 방지된 최적화 속성도 나열됩니다.
- 많은 클래스의 최적화를 방지하는 유지 규칙이 표시되면 유지 규칙으로 인해 최적화가 방지되는 클래스, 필드, 메서드를 확인하여 이 규칙이 리플렉션을 사용하여 동적으로 호출되지 않는 항목을 유지하는지 확인해야 합니다.
- 올바른 유지 옵션을 선택하고 권장사항을 따름으로써 필요한 클래스, 필드 또는 메서드만 타겟팅하여 유지 규칙으로 차단된 최적화를 줄입니다.
- 영향을 받는 클래스, 필드, keep 규칙의 메서드를 포함하는 테스트를 조사하고 실행하여 keep 규칙을 개선합니다.
라이브러리 최적화 검사
서드 파티 라이브러리를 통합하면 R8과 함께 작동하도록 자체 소비자 유지 규칙이 포함되는 경우가 많습니다. 라이브러리 작성자는 특정 구현을 예측할 수 없으므로 필요 이상으로 많은 클래스, 필드, 메서드에서 최적화를 방지하는 보수적이고 광범위한 규칙을 작성하는 경우가 있습니다. 이로 인해 R8이 라이브러리의 실제 런타임 실행과 관련이 없는 앱 부분을 최적화하지 못할 수 있습니다. R8 구성 분석기를 사용하여 앱 최적화에 부정적인 영향을 미치는 규칙을 도입하는 라이브러리를 식별할 수 있습니다.
구성 분석기를 사용하여 병합된 모든 소비자 유지 규칙의 결합된 효과를 검사합니다. 서드 파티 라이브러리에서 제공되는 각 유지 규칙의 영향을 분석하면 앱에서 많은 최적화를 방지하는 특정 서드 파티 라이브러리를 식별하고 추적할 수 있습니다.
라이브러리 최적화 방법
- 라이브러리에 지나치게 광범위한 규칙이 포함된 경우 보고서의 데이터를 사용하여 현재 규칙이 앱의 최적화 점수에 미치는 영향을 보여주면서 라이브러리 관리자에게 문의하는 것이 좋습니다. 외부 라이브러리인 경우 문제를 신고하기 전에 라이브러리에서 기존 버그를 찾아보세요.
- 필요한 경우 특정 라이브러리의 규칙을 필터링하여 개선사항을 테스트할 수 있습니다. 라이브러리의 규칙을 프로젝트로 가져오고, 광범위한 규칙을 제외하고, 구성 분석기를 다시 실행하여 크기와 성능의 잠재적 이점을 측정할 수 있습니다.
포함된 규칙
여러 유지 규칙이 중복되어 규칙 중 하나가 필요 이상으로 최적화를 방지하는 경우가 있을 수 있습니다. 코드베이스에 두 개의 keep 규칙이 있는 경우
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
패키지 전체의 최적화를 방지하는 첫 번째 유지 규칙이 첫 번째 유지 규칙에 의해 유지된 패키지 내의 클래스를 타겟팅하는 두 번째 유지 규칙을 포함합니다. 보관 규칙이 중복되면 필요한 것보다 더 많은 최적화가 차단될 수 있습니다. 이러한 중복 규칙을 개선하면 R8 최적화를 극대화하고 기술 부채를 없앨 수 있습니다. 이 프로세스에는 필수 코드만 유지하면서 R8의 최적화 기능을 최대한 활용할 수 있도록 구성을 간소화하는 작업이 포함됩니다.
포함된 규칙 최적화
- R8 구성 분석기를 사용하여 포함된 유지 규칙을 찾습니다.
- 코드베이스에서 실제로 리플렉션을 사용하고 keep 규칙을 사용하여 유지해야 하는 정확한 클래스, 필드 또는 메서드를 식별합니다. 이를 알면 보관 규칙을 개선하는 데 도움이 됩니다.
- 구성 분석기를 사용하여 동일한 클래스, 필드 또는 메서드를 타겟팅하는 각 규칙의 영향을 비교합니다. 각 보관 규칙으로 인해 방지된 최적화 비율을 사용하여 더 광범위한 보관 규칙과 좁은 보관 규칙을 식별할 수 있습니다.
- 좁은 규칙이 정확하게 작성된 경우(리플렉션 방식으로 액세스되는 정확한 멤버 또는 클래스만 유지) 더 넓은 유지 규칙을 삭제합니다. 이렇게 하면 패키지의 나머지 부분에 대해 R8 최적화가 안전하게 잠금 해제됩니다.
- 광범위한 규칙이 올바른 클래스를 타겟팅하는 경우 광범위한 규칙을 유지하고 좁은 규칙을 삭제합니다. 좁은 규칙은 중복된 방해 요소일 뿐입니다. 식별한 클래스, 필드 또는 메서드만 타겟팅하도록 광범위한 규칙을 수정해야 합니다.
변경사항 확인 및 테스트: 구성 분석기를 다시 실행하여 충돌이 해결되었는지 확인합니다. 그런 다음 출시 빌드를 컴파일하고 변경사항을 테스트하여 코드베이스가 예상대로 작동하는지 확인합니다.
불필요한 규칙 삭제
구성 분석기를 사용하면 코드베이스를 체계적으로 감사하여 구성을 어지럽히는 오래된 유지 규칙을 식별하고 삭제할 수 있습니다. R8 구성 분석기는 불필요한 규칙의 두 가지 기본 소스를 구체적으로 강조합니다.
- 사용되지 않는 규칙: 현재 빌드에서 클래스, 메서드 또는 필드가 0개와 일치하는 규칙입니다. 이러한 구성은 코드 리팩터링, 종속 항목 삭제 또는 더 이상 관련이 없는 복사-붙여넣기 구성 후에도 지속되는 경우가 많아 불필요한 구성 복잡성을 더합니다.
- 동일한 규칙: 동일한 keep 규칙은 동일한 클래스, 필드, 메서드를 타겟팅하는 규칙 또는 동일한 keep 규칙 파일 내에서 또는 여러 keep 규칙 파일에 걸쳐 keep 규칙의 중복 선언을 의미합니다.
두 유형의 규칙 모두 구성에 불필요한 요소를 추가하여 유지관리 및 디버깅을 더 어렵게 만듭니다. 이러한 항목을 식별하면 구성을 정리할 수 있습니다.