최적화 문제 해결

R8의 최적화는 앱의 코드를 업데이트하므로 앱이 예상대로 작동하는지 확인하기 위해 앱의 동작을 강력하게 테스트하는 것이 중요합니다. 예상치 못한 동작이 발생하면 이 페이지를 가이드로 사용하여 최적화 후 발생할 수 있는 문제를 해결하세요. 최적화 문제를 해결하는 데 사용할 수 있는 규칙에 관한 자세한 내용은 규칙을 사용하여 최적화 문제 해결을 참고하세요.

문제 해결 시 다음 상황에 집중하세요.

  • 과도한 최적화로 인한 앱 비정상 종료: R8 이 너무 많은 코드를 최적화하여 앱이 비정상 종료됩니다.
  • 불분명하거나 불충분한 최적화: R8이 예상만큼 앱을 최적화하지 않았거나 최적화에 관한 추가 설명이 필요합니다.

앱 비정상 종료

R8로 최적화한 후 앱이 비정상 종료되면 일반적으로 손상된 리플렉션 때문입니다. 손상된 리플렉션을 식별하려면 다음 가이드라인을 따르세요.

  • 표시된 클래스, 메서드 또는 필드가 리플렉션을 통해 사용되고 있음을 의미하는 예외가 관찰됩니다. 이러한 예외는 일반적으로 ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError 중 하나입니다.
  • import kotlin.reflect.* 또는 import java.lang.reflect.*로 리플렉션을 참조하는 코드가 표시됩니다.
  • 클래스 생성자가 Something::class.constructors와 같이 사용되는 것을 관찰합니다.
  • Class.forName(...)이 표시됩니다.

해결 방법: keep 규칙을 추가합니다.

자체 코드가 리플렉션을 실행하는 경우 keep 규칙을 추가하는 대신 Jetpack Keep 주석으로 코드를 주석 처리할 수 있습니다. Jetpack Keep 린트 검사는 주석 처리되지 않은 다른 리플렉션 호출에도 플래그를 지정하므로 유사한 비정상 종료를 방지하는 데 도움이 됩니다.

불분명하거나 불충분한 최적화

규칙은 포함된 라이브러리뿐만 아니라 앱에서도 적용되므로 적용된 규칙에 관한 추가 설명이 필요하거나 R8이 최적화될 것으로 예상한 코드의 특정 섹션을 유지한 이유에 관한 설명이 필요할 수 있습니다.

  • 적용된 규칙의 모호성: 포함된 라이브러리의 규칙도 앱에 적용되고 이러한 라이브러리의 전역 옵션도 앱에 전파되므로 어떤 규칙이 적용되는지 확실하지 않을 수 있습니다.

    해결 방법: 프로젝트를 빌드할 때 R8이 적용하는 모든 규칙의 보고서를 확인하여 적용되는 규칙을 확인합니다. 이 보고서는 ./app/build/outputs/mapping/configuration.txt에서 확인할 수 있습니다. 이 보고서에는 R8을 구성하는 데 사용된 모든 라이브러리 및 모듈의 병합된 규칙이 포함되어 있으며 비효율적인 규칙을 식별하는 데 사용할 수 있습니다.

  • 유지되는 코드가 너무 많음: R8의 최적화는 삭제될 것으로 예상한 코드를 유지할 수 있습니다.

    해결 방법: 구성 옵션 -whyareyoukeeping을 사용하여 코드가 유지된 이유를 파악합니다. 출력에는 유지된 코드에서 앱의 진입점 중 하나로 이어지는 경로가 포함되어 있습니다. 자세한 내용은 -whyareyoukeeping을 참고하세요.

  • 원래 스택 트레이스를 이해하기 어려움: R8은 다양한 방식으로 코드를 변경하므로 스택 트레이스가 더 이상 원래 코드를 참조하지 않습니다. 예를 들어 줄 번호와 클래스 및 메서드 이름이 변경될 수 있습니다.

    해결 방법: Android 스튜디오 Otter 3 Feature Drop 및 AGP 9.0부터 Logcat은 스택 트레이스를 자동으로 디옵스큐레이션합니다. 하지만 이전 버전의 Android 스튜디오를 사용하는 경우 원래 스택 트레이스를 수동으로 복구해야 합니다. 원래 스택 트레이스를 복구하려면 retrace 명령줄 도구를 사용하세요. 이 도구는 명령줄 도구 패키지와 함께 번들로 제공됩니다.

    retrace를 사용하려면 매핑 파일의 경로와 스택 트레이스 파일이 포함된 명령어를 제공하세요. mapping.txt라는 매핑 파일은 Android App Bundle (AAB)과 함께 자동으로 번들로 제공됩니다. 자세한 내용은 retrace 문서와 Play Console 고객센터의 비정상 종료 스택 트레이스를 디옵스큐레이션하는 방법에 관한 도움말을 참고하세요. Play 및 Firebase Crashlytics를 사용하는 경우 앱 사용자로부터 서비스가 수집하는 비정상 종료와 함께 mapping.txt 파일을 사용하세요. 다음 명령어는 프로젝트의 루트에서 retrace를 실행하는 방법을 보여줍니다.

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

버그 신고

R8로 문제를 해결할 수 없는 경우 버그를 신고하세요.