기준 프로필

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

기준 프로필을 사용하면 포함된 코드 경로의 해석과 JIT(just-in-time) 컴파일 단계를 피할 수 있어 최초 실행 후 코드 실행 속도가 약 30% 향상됩니다. 앱 또는 라이브러리에 기준 프로필을 제공하면 Android 런타임(ART)이 AOT(Ahead-Of-Time) 컴파일을 통해 포함된 코드 경로를 최적화하여 모든 신규 사용자와 앱 업데이트에 향상된 성능을 제공합니다. 이 프로필 기반 최적화(PGO)는 앱이 시작을 최적화하고, 상호작용으로 인한 버벅거림을 줄이고, 첫 실행부터 최종 사용자가 경험하는 런타임 성능을 개선할 수 있도록 해 줍니다.

이러한 속도 향상으로 인해 사용자 유지, 트랜잭션, 평점과 같은 비즈니스 측정항목이 직접적으로 개선됩니다. Josh, Lyft, TikTok, Zomato의 스토리에서 성능이 비즈니스 측정항목에 얼마나 영향을 주는지 알아볼 수 있습니다.

기준 프로필의 이점

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

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

기준 프로필을 사용하지 않는 경우 모든 앱 코드는 해석된 후에 메모리에, 또는 기기가 유휴 상태일 때 백그라운드의 odex 파일에 JIT로 컴파일됩니다. 사용자는 앱을 설치하거나 업데이트한 후 앱을 처음 실행할 때는 최적화된 환경을 경험하지 못하다가 이후 새로운 경로가 최적화되면 성능 향상을 경험할 수 있습니다. 많은 앱에서 약 30%의 성능 향상이 측정되었습니다.

시작하기

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

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

  • Android Gradle 플러그인: com.android.tools.build:7.4.0
  • Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.1.1
  • 프로필 설치 프로그램: androidx.profileinstaller:profileinstaller:1.2.2

프로필 생성 예

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

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

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collectBaselineProfile(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의 성능 샘플의 일부로 전체 컨텍스트에서 더 자세한 정보를 확인할 수 있습니다.

포함할 내용

앱에서 기준 프로필을 사용하는 경우 앱 시작 코드와 화면 간 이동 또는 스크롤과 같은 일반적인 사용자 상호작용을 포함할 수 있습니다. 등록, 로그인 또는 결제와 같은 전체 흐름을 수집할 수도 있습니다.

라이브러리는 새로운 버전의 일부로 자체 기준 프로필을 제공하여 앱 성능을 개선할 수 있습니다. 예를 들어 Compose에서 기준 프로필 사용하기를 살펴보세요.

기준 프로필 작동 방식

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

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

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

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

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

클라우드 프로필

클라우드 프로필은 Google Play 스토어에서 집계되고 설치 시간 컴파일을 위해 배포되며, 기본 프로필과 함께 추가적인 PGO를 제공합니다. 클라우드 프로필은 사용자의 실제 앱 상호작용을 기반으로 하지만, 업데이트 후 배포되기까지 수일에서 수주가 걸리기 때문에 가용성이 제한됩니다. 클라우드 프로필만 사용하는 경우 프로필이 준비되고 배포될 때까지 신규 사용자와 업데이트 사용자는 최적의 앱 성능을 경험하지 못합니다. 또한 클라우드 프로필은 Android 9(API 수준 29) 이상을 실행하는 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에 업로드되고 집계되며, 다른 사용자들이 앱을 설치하거나 업데이트할 때 클라우드 프로필로 제공됩니다.

알려진 문제

기준 프로필을 사용하는 데에는 현재 몇 가지 알려진 문제가 있습니다.

  • App Bundle에서 APK를 빌드할 때 기준 프로필이 올바르게 패키징되지 않습니다. 이 문제를 해결하려면 com.android.tools.build:gradle:7.3.0 및 이후 버전을 적용하세요(문제).

  • 기준 프로필은 기본 classes.dex 파일에 대해서만 올바르게 패키징됩니다. 이는 .dex 파일이 둘 이상인 앱에 영향을 미칩니다. 이 문제를 해결하려면 com.android.tools.build:gradle:7.3.0 이상을 적용하세요.

  • user(루팅되지 않은) 빌드에서는 ART 프로필 캐시의 재설정이 허용되지 않습니다. 이 문제를 해결하기 위해 androidx.benchmark:benchmark-macro-junit4:1.1.0에는 벤치마크 중에 앱을 재설치하는 수정사항이 포함되어 있습니다(문제).

  • Android 스튜디오 프로파일러는 앱을 프로파일링할 때 기준 프로필을 설치하지 않습니다(문제).

  • Gradle 이외의 빌드 시스템(Bazel, Buck 등)은 기준 프로필을 출력 APK로 컴파일하는 기능을 지원하지 않습니다.

  • Play 스토어는 현재 aab 업로드 후 설치 시 기준 프로필을 제공하는 데까지 10~14시간이 소요됩니다. 이 기간에 앱을 다운로드하는 사용자는 백그라운드 dexopt가 실행될 때까지(익일이 될 수 있음) 기준 프로필의 장점을 확인할 수 없습니다. 현재 이를 적극적으로 개선하는 중입니다.

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

  • 현재 빌드 컴파일러는 src/main 폴더에 하나의 baseline-prof.txt만 허용하고 다른 버전 또는 빌드 유형의 파일은 반영하지 않습니다. 현재 이를 적극적으로 개선하는 중입니다.

  • 배터리 최적화로 인해 프로필 설치가 원활하지 않을 수 있습니다. 프로필을 효과적으로 설치하려면 벤치마크 기기에서 배터리 최적화를 사용 중지하세요.

  • 벤치마크와 프로덕션 간에 성능 향상이 다를 수 있습니다. 이는 로컬 벤치마크가 성능을 측정할 때 기준 프로필이 사용 설정되어 있을 수도 있고 사용 중지되어 있을 수도 있기 때문입니다. 프로덕션 앱에서는 참여 라이브러리를 통해 이미 프로파일링된 앱의 새 부분을 기준 프로필에 추가하면 측정값이 증가합니다.