기준 프로필 개요

기준 프로필을 사용하면 포함된 코드 경로의 해석과 JIT(just-in-time) 컴파일 단계를 피하여 최초 실행 후 코드 실행 속도가 약 30% 향상됩니다.

앱 또는 라이브러리에 기준 프로필을 제공하면 Android 런타임(ART)이 AOT(Ahead-Of-Time) 컴파일을 통해 지정된 코드 경로를 최적화하여 모든 신규 사용자와 앱 업데이트에 향상된 성능을 제공합니다. 이 프로필 기반 최적화(PGO)는 앱이 시작을 최적화하고, 상호작용으로 인한 버벅거림을 줄이고, 첫 실행부터 사용자가 경험하는 전반적인 런타임 성능을 개선할 수 있도록 해 줍니다.

이러한 성능 향상으로 인해 사용자 유지, 트랜잭션, 평점과 같은 비즈니스 측정항목이 직접적으로 개선됩니다. Josh, Lyft, TikTok, Zomato의 사례를 통해 성능이 비즈니스 측정항목에 주는 영향에 관해 자세히 살펴볼 수 있습니다.

기준 프로필의 이점

기준 프로필을 사용하면 앱 시작, 화면 간 이동, 콘텐츠 스크롤과 같은 모든 사용자 상호작용이 처음 실행될 때부터 더 원활해집니다. 기준 프로필은 앱의 속도와 반응성을 개선하여 일일 활성 사용자를 늘리고 평균 재방문율을 높일 수 있습니다.

기준 프로필은 첫 실행부터 앱 런타임을 개선하는 일반적인 사용자 상호작용을 제공하여 앱을 시작할 때, 또 그 이후로도 최적화에 도움을 줍니다. 안내식 AOT 컴파일은 사용자 기기에 의존하지 않으며 휴대기기가 아닌 개발 머신에서 출시당 한 번씩 실행할 수 있습니다. 기준 프로필이 포함된 버전을 제공하면 클라우드 프로필에만 의존하는 것보다 훨씬 빨리 앱을 최적화할 수 있습니다.

기준 프로필을 사용하지 않는 경우 모든 앱 코드는 해석된 후에 메모리에 JIT로 컴파일되거나, 기기가 유휴 상태일 때 백그라운드의 odex 파일에 기록됩니다. 앱을 설치하거나 업데이트한 후에는 앱을 처음 실행한 시점부터 새로운 코드 경로가 최적화될 때까지 사용자 환경이 저하됩니다. 대부분의 앱은 최적화 후 약 30%의 성능 향상을 기록합니다.

시작 프로필

시작 프로필은 기준 프로필과 비슷하지만, 기기 내 최적화 목적이 아니라 컴파일 시간에 사용된다는 점이 다릅니다. 시작 프로필은 시작 시간 개선을 위해 DEX 파일의 레이아웃을 최적화하는 데 사용됩니다. 시작 프로필에서 식별된 코드는 기본 classes.dex 파일에 배치되고 다른 코드는 별도의 DEX 파일에 배치됩니다. 이를 통해 앱 시작 중의 페이지 오류 수를 줄여 시작 시간이 개선됩니다. 시작 프로필과 DEX 레이아웃 최적화가 앱 시작 시간을 어떻게 개선할 수 있는지 자세히 알아보려면 DEX 레이아웃 최적화 및 시작 프로필을 참고하세요.

시작하기

기존 앱의 성능 최적화를 시작하려면 기준 프로필 만들기를 참고하세요.

종속 항목 체인은 안정적인 개발 출시 버전을 제공합니다. 기준 프로필을 생성하고 설치하려면 다음 지원되는 최소 버전 이상의 Android Gradle 플러그인, Macrobenchmark 라이브러리, 프로필 설치 프로그램을 사용해야 합니다. 이러한 종속 항목은 서로 다른 시점에 필요하며 도구 모음으로서 함께 작동하여 최적의 기준 프로필을 만드는 데 사용됩니다.

  • Android Gradle 플러그인: com.android.tools.build:8.0.0
  • Macrobenchmark 라이브러리: androidx.benchmark:benchmark-macro-junit4:1.2.3
  • 프로필 설치 프로그램: androidx.profileinstaller:profileinstaller:1.3.1

최신 버전의 AGP를 사용하여 기준 프로필을 만들고 관리하는 것이 좋습니다. 다음은 다양한 버전의 AGP와 함께 제공되는 주요 기능입니다.

AGP 버전 기능
8.3
  • 전체 소스 세트 디렉터리 지원 (라이브러리 모듈): 여러 기준 프로필 소스 파일을 선언하고, 이제 앱 모듈뿐 아니라 라이브러리 모듈에도 src/free/generated/baselineProfiles/baseline-prof1.txt와 같은 변형 인식 디렉터리를 사용합니다.
  • 기준 프로필에는 디슈가링된 클래스가 포함됩니다.
8.2
  • R8 규칙 재작성: D8 및 R8은 인간이 읽을 수 있는 기준 및 시작 프로필 규칙을 변환하여 앱 성능을 최적화하는 데 필요한 모든 규칙을 완전히 캡처할 수 있습니다. 메서드의 기준 프로필 적용 범위가 최대 30% 증가하고 앱 성능이 최대 15% 향상됩니다.
  • 시작 프로필: 이 새로운 유형의 기준 프로필을 생성하여 DEX 내의 코드 레이아웃을 알립니다. 시작 성능이 추가로 최대 15% 향상되거나 대용량 앱의 경우 훨씬 더 향상됩니다.
8.0 최소 권장 버전: 기준 프로필 Gradle 플러그인을 사용하여 단일 Gradle 작업으로 기준 프로필을 생성합니다.
  • 전체 소스 세트 디렉터리 지원(앱 모듈): 여러 기준 프로필 소스 파일을 선언하고 src/free/generated/baselineProfiles/baseline-prof1.txt와 같은 변형 인식 디렉터리를 사용합니다.
7.4 지원되는 최소 버전: 앱은 라이브러리의 기준 프로필을 사용할 수 있으며 src/main/baseline-prof.txt 파일에 자체 기준 프로필을 제공할 수 있습니다.
  • App Bundle에서 APK를 빌드할 때 기준 프로필이 올바르게 패키징됩니다(문제 #230361284).
  • .dex 파일이 두 개 이상인 앱의 경우 기준 프로필은 기본 .dex 파일에 맞게 올바르게 패키징됩니다.

프로필 생성 예

다음은 권장하는 Macrobenchmark 라이브러리를 사용하여 앱 시작과 여러 이동 및 스크롤 이벤트를 위한 기준 프로필을 만드는 클래스의 예입니다.

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

이 코드는 GitHub의 성능 샘플의 일부로 전체 컨텍스트에서 더 자세한 정보를 확인할 수 있습니다.

포함할 내용

앱에서 기준 프로필을 사용하는 경우 앱 시작 코드와 화면 간 이동 또는 스크롤과 같은 일반적인 사용자 상호작용을 포함할 수 있습니다. 등록, 로그인 또는 결제와 같은 전체 흐름을 수집할 수도 있습니다. 중요하다고 생각되는 모든 사용자 경험에서는 런타임 성능 개선을 통해 기준 프로필의 이점을 활용할 수 있습니다.

성능 개선을 위해 다양한 접근 방식을 시도해 보는 경우 시도하는 모든 부문에 기준 프로필을 포함하는 것이 좋습니다. 그렇게 하면 모든 사용자가 컴파일된 코드를 일관되게 실행할 수 있기 때문에 결과를 더 쉽게 해석할 수 있습니다.

라이브러리는 앱 성능을 개선하기 위해 자체 기준 프로필을 제공하고 출시를 통해 이를 제공할 수 있습니다. 예시는 Jetpack Compose 성능의 기준 프로필 섹션 사용을 참고하세요.

기준 프로필 작동 방식

앱 또는 라이브러리를 개발할 때 렌더링 시간이나 지연 시간이 중요한 일반적인 사용자 상호작용을 포괄하는 기준 프로필을 정의하여 사용할 수 있습니다. 기준 프로필의 작동 방식은 다음과 같습니다.

  1. 앱에 맞는 인간이 읽을 수 있는 프로필 규칙이 생성되고 앱에 바이너리 형식으로 컴파일됩니다(assets/dexopt/baseline.prof에서 확인할 수 있음). 그러면 평소와 같이 Google Play에 AAB를 업로드할 수 있습니다.

  2. Google Play는 프로필을 처리한 다음 APK와 함께 사용자에게 직접 제공합니다. 설치가 진행될 때 ART가 프로필에서 메서드의 AOT 컴파일을 실행하여 메서드의 실행 속도를 높입니다. 프로필이 앱 실행 시 또는 프레임 렌더링 중에 사용되는 메서드를 포함하는 경우, 사용자가 경험하는 실행 시간이 빨라지고 버벅거림이 줄어들 수 있습니다.

  3. 이 흐름은 클라우드 프로필 집계와 연동되어 시간이 지남에 따라 앱의 실제 사용 방식을 기반으로 성능을 미세 조정합니다.

그림 1. 이 다이어그램은 업로드부터 최종 사용자에게 제공할 때까지의 기준 프로필 워크플로와 이 워크플로가 클라우드 프로필과 어떻게 연관되는지를 보여줍니다.

클라우드 프로필

클라우드 프로필은 기본 프로필에 더해 Google Play 스토어에서 집계되고 설치 시간 컴파일을 위해 배포되는 추가적인 PGO도 제공합니다.

클라우드 프로필은 사용자의 실제 앱 상호작용을 기반으로 하지만, 업데이트 후 배포되기까지 수 시간에서 수일이 걸리기 때문에 가용성이 제한됩니다. 프로필이 완전히 배포될 때까지는 신규 앱 또는 업데이트된 앱 사용자는 최적화된 앱 성능을 경험하지 못합니다. 또한 클라우드 프로필은 Android 9(API 수준 28) 이상을 실행하는 Android 기기만 지원하며 사용자층이 충분히 큰 앱에만 확장됩니다.

여러 Android 버전에서의 컴파일 동작

Android 플랫폼은 버전별로 서로 다른 앱 컴파일 방식을 사용하며, 그에 따라 버전별로 성능에 미치는 영향이 다릅니다. 기준 프로필은 모든 설치를 위한 프로필을 제공함으로써 이전의 컴파일 방식을 개선합니다.

Android 버전 컴파일 방법 최적화 방식
5~6(API 수준 21~23) 완전한 AOT 설치 중에 앱 전체가 최적화됩니다. 따라서 앱을 사용하기까지의 대기 시간이 길어지고, RAM 및 디스크 공간 사용량이 늘어나며, 디스크에서 코드를 로드하는 데 걸리는 시간이 길어져서 콜드 스타트 시간이 늘어납니다.
7~8.1(API 수준 24~27) 부분적인 AOT(기준 프로필) 최초 실행 시에 앱 모듈이 이 종속 항목을 정의할 때 androidx.profileinstaller에 의해 기준 프로필이 설치됩니다. ART가 앱이 사용되는 동안 추가 프로필 규칙을 추가하고 기기가 유휴 상태일 때 규칙을 컴파일하여 이를 한층 개선할 수 있습니다. 디스크로부터 코드를 로드하는 데 걸리는 시간과 디스크 공간에 맞게 최적화되어 앱의 대기 시간이 줄어듭니다.
9(API 수준 28) 이상 부분적인 AOT(기준 프로필 + 클라우드 프로필) Play가 앱 설치 중에 기준 프로필을 사용하여 APK 및 클라우드 프로필(있는 경우)을 최적화합니다. 설치 후에는 ART 프로필이 Play에 업로드되고 집계되며, 다른 사용자들이 앱을 설치하거나 업데이트할 때 클라우드 프로필로 제공됩니다.

알려진 문제

다음은 발생 가능한 문제와 해결 방법 또는 해결 방법을 찾기 위해 현재 노력하고 있는 문제입니다.

  • Gradle 관리 Test Lab 기기를 포함한 Firebase Test Lab 기기에서는 기준 프로필 생성이 지원되지 않습니다(문제 #285187547).

  • 라이브러리에 기준 프로필을 성공적으로 제공하려면 최소한 기준 프로필 Gradle 플러그인 1.2.3 또는 AGP 8.3을 사용해야 합니다(문제 #313992099).

  • ./gradlew app:generateBaselineProfile 명령어로 기준 프로필을 생성하면 테스트 모듈의 벤치마크도 실행되고 결과가 삭제됩니다. 이 경우 -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile로 명령어를 실행하여 기준 프로필만 생성할 수 있습니다. 이 문제는 AGP 8.2에서 해결되었습니다.

  • 모든 빌드 유형의 기준 프로필을 생성하는 명령어(./gradlew app:generateBaselineProfile)는 출시 빌드 유형의 기준 프로필만 생성합니다. 이 문제는 AGP 8.1에서 해결되었습니다.

  • Google Play 스토어 이외의 앱 배포 채널은 설치 시 기준 프로필 사용을 지원하지 않을 수도 있습니다. 이러한 채널을 통해 설치된 앱의 사용자는 백그라운드 dexopt가 실행될 때까지(익일이 될 수 있음) 기준 프로필의 장점을 확인할 수 없습니다.

  • Play 스토어 내부 앱 공유는 기준 프로필을 지원하지 않습니다. 하지만 내부 테스트 트랙에서는 지원 됩니다.

  • Huawei 기기와 같은 일부 기기의 배터리 최적화는 프로필 설치를 방해할 수 있습니다. 프로필을 효과적으로 설치하려면 벤치마크 기기에서 배터리 최적화를 사용 중지하세요.

추가 리소스