최적화 문제 해결

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

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

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

앱 비정상 종료

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

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

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

최적화가 불명확하거나 불충분함

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

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

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

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

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

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

    해결 방법: Android 스튜디오 Otter 3 기능 출시 및 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 관련 문제를 해결할 수 없는 경우 버그를 신고하세요.