앱 최적화 사용 설정

최상의 사용자 환경을 위해 앱을 최대한 작고 빠르게 최적화해야 합니다. R8이라는 앱 최적화 도구는 사용하지 않는 코드와 리소스를 삭제하고, 런타임 성능을 최적화하도록 코드를 다시 작성하는 등 앱을 간소화합니다. 사용자에게는 다음을 의미합니다.

  • 더 빨라진 시작 시간
  • 렌더링 및 런타임 성능 개선
  • ANR 감소

앱 최적화를 사용 설정하려면 다음 코드와 같이 출시 빌드'의 앱 수준 빌드 스크립트에서 isMinifyEnabled = true (코드 최적화용) 및 isShrinkResources = true (리소스 최적화용)를 설정합니다. 항상 두 설정을 모두 사용 설정하는 것이 좋습니다. 또한 최적화로 인해 프로젝트의 빌드 시간이 늘어나고 코드를 수정하는 방식으로 인해 디버깅이 어려워질 수 있으므로 게시 전에 테스트하는 앱의 최종 버전(일반적으로 출시 빌드)에서만 앱 최적화를 사용 설정하는 것이 좋습니다.

Kotlin

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

Groovy

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            minifyEnabled true

            // Enables resource shrinking.
            shrinkResources true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

더 작은 앱을 위해 리소스 축소 최적화

Android Gradle 플러그인 (AGP) 8.12.0 버전에서는 리소스와 코드 최적화를 통합하여 더 작고 빠른 앱을 만드는 것을 목표로 하는 최적화된 리소스 축소가 도입되었습니다.

최적화된 리소스 축소 사용 설정

AGP 버전이 9.0.0 이전인 경우 새로운 최적화된 리소스 축소 파이프라인을 사용 설정하려면 프로젝트의 gradle.properties 파일에 다음을 추가하세요.

android.r8.optimizedResourceShrinking=true

AGP 9.0.0 이상을 사용하는 경우 android.r8.optimizedResourceShrinking=true를 설정할 필요가 없습니다. 최적화된 리소스 축소는 빌드 구성에서 isShrinkResources = true가 사용 설정된 경우 자동으로 적용됩니다.

R8 최적화 설정 확인 및 구성

R8이 전체 최적화 기능을 사용하도록 설정하려면 프로젝트의 gradle.properties 파일에서 다음 줄을 삭제합니다(있는 경우).

android.enableR8.fullMode=false # Remove this line from your codebase.

앱 최적화를 사용 설정하면 특히 R8이 클래스 또는 메서드 이름을 변경하는 경우 스택 트레이스를 이해하기 어려워집니다. 소스 코드에 올바르게 대응하는 스택 트레이스를 가져오려면 원래 스택 트레이스 복구를 참고하세요.

R8을 사용 설정한 경우 시작 프로필을 만들어 시작 성능을 더욱 개선해야 합니다.

앱 최적화를 사용 설정했는데 오류가 발생하는 경우 다음 전략을 사용하여 문제를 해결하세요.

빌드 속도 최적화에 관심이 있다면 R8 실행 방식 구성에서 환경에 따라 R8을 구성하는 방법을 알아보세요.

AGP 및 R8 버전 동작 변경사항

다음 표에는 다양한 버전의 Android Gradle 플러그인 (AGP)과 R8 컴파일러에 도입된 주요 기능이 간략하게 나와 있습니다.

AGP 버전 도입된 기능
9.0 최적화된 리소스 축소: 기본적으로 사용 설정되어 있습니다 (android.r8.optimizedResourceShrinking를 사용하여 제어). 최적화된 리소스 축소는 리소스 축소를 코드 최적화 파이프라인과 통합하여 더 작고 빠른 앱을 만드는 데 도움이 됩니다. 코드와 리소스 참조를 동시에 최적화하여 사용하지 않는 코드에서만 참조되는 리소스를 식별하고 삭제합니다. 이는 이전의 별도 최적화 프로세스에 비해 크게 개선된 점입니다.

이는 특히 다양한 폼 팩터 업계에서 상당한 리소스와 코드를 공유하는 앱에 유용하며, 앱 크기가 50% 이상 개선되는 것으로 측정되었습니다. 결과적으로 크기가 줄어들어 다운로드 속도가 빨라지고, 설치 속도가 빨라지고, 시작 속도가 빨라지고, 렌더링이 개선되고, ANR이 줄어드는 등 사용자 환경이 개선됩니다.

라이브러리 규칙 필터링: 라이브러리 소비자 규칙에서 전역 옵션 (예: -dontobfuscate) 지원이 삭제되었으며 앱에서 이를 필터링합니다. 자세한 내용은 전역 옵션 추가를 참고하세요.

Kotlin null 검사: 기본적으로 최적화됩니다 (-processkotlinnullchecks를 사용하여 제어). 이 버전에서는 빌드 속도도 크게 개선되었습니다. 자세한 내용은 추가 최적화를 위한 전역 옵션을 참고하세요.

특정 패키지 최적화: packageScope를 사용하여 특정 패키지를 최적화할 수 있습니다. 실험적 지원에 있습니다. 자세한 내용은 packageScope로 지정된 패키지 최적화를 참고하세요.

기본적으로 최적화됨: -dontoptimize를 포함하는 getDefaultProguardFile("proguard-android.txt") 지원이 중단되었습니다. -dontoptimize는 피해야 합니다. 대신 "proguard-android-optimize.txt"를 사용하세요. 앱에서 전역으로 최적화를 사용 중지해야 하는 경우 proguard 파일에 플래그를 수동으로 추가하세요.
8.12 리소스 축소: 초기 지원이 추가되었습니다 (기본적으로 사용 중지됨). isShrinkResources 사용 설정). 리소스 축소는 R8과 함께 작동하여 사용하지 않는 리소스를 효과적으로 식별하고 삭제합니다.

Logcat 리트레이싱: Android 스튜디오 Logcat 창에서 자동 리트레이싱 지원
8.6 향상된 되돌리기: 모든 minSdk 수준에서 기본적으로 파일 이름과 줄 번호 되돌리기를 포함합니다 (이전에는 버전 8.2에서 minSdk 26 이상이 필요함).

R8을 업데이트하면 난독화된 빌드의 스택 트레이스를 쉽고 명확하게 읽을 수 있습니다. 이 버전에서는 줄 번호와 소스 파일이 매핑되는 방식이 개선되어 Android 스튜디오 Logcat과 같은 도구에서 비정상 종료를 원래 소스 코드로 자동 역추적하기가 더 쉬워집니다.
8.0 기본적으로 전체 모드: R8 전체 모드는 훨씬 더 강력한 최적화를 제공합니다. 이 기능은 기본적으로 사용 설정되어 있습니다. android.enableR8.fullMode=false를 사용하여 선택 해제할 수 있습니다.
7.0 전체 모드 사용 가능: android.enableR8.fullMode=true를 사용하는 선택 기능으로 도입되었습니다. 전체 모드는 코드가 리플렉션 및 기타 동적 기능을 사용하는 방식에 관해 더 엄격한 가정을 적용하여 더 강력한 최적화를 적용합니다. 앱 크기를 줄이고 성능을 개선하지만 필요한 코드가 삭제되지 않도록 추가 유지 규칙이 필요할 수 있습니다.