Android Baseline Profiles 정리1 - Baseline Profiles overview

wonsohana·2024년 9월 28일

오늘은 Android Baseline Profiles 에 대해 알아보려고 한다. 공식문서를 봤을 때도 양이 많기 때문에 (…) 적당히 나눠서 정리해보자.

공식문서 링크

Baseline Profiles overview

Baseline Profiles 는 코드 경로에 대한 해석 및 즉시(jist-in-time, JIT) 컴파일 단계를 피함으로써 코드 실행 속도를 30% 향상시킬 수 있다.

앱이나 라이브러리에 Baseline Profiles 를 포함하면 Android Runtime (ART) 이 지정된 코드 경로를 사전 (ahead-of-time, AOT) 컴파일 하여 새로운 사용자 및 앱 업데이트 시 성능 향상을 제공한다. 이 프로파일 기반 최적화(profile guided optimization, PGO) 는 앱이 시작을 최적화하고, 상호작용 지연을 줄이며, 첫 실행 부터 전반적인 런타임 성능을 향상시키도록 한다.

이러한 성능 향상은 사용자 유지율, 거래량 및 평점과 같은 비즈니스 지표의 개선으로 직접 이어진다.

Baseline Profiles 의 이점

Baseline Profiles 는 앱이 처음 실행될 때 부터, 화면 간 네비게이션, 콘텐츠 스크롤과 같은 모든 사용자 상호작용을 더 매끄럽게 만든다.

Baseline Profiles 는 앱 시작 외에도 일반적인 사용자 상호작용을 통해 앱 런타임을 첫 실행부터 최적화하도록 유도한다. 이 사전(AOT) 컴파일은 사용자 기기에 의존하지 않고, 개발 기기에서 각 release 마다 한 번씩 수행할 수 있다. Baseline Profile 이 포함된 release 를 배포하며, Cloud Profiles 에 의존하는 것 보다 훨씬 빠르게 앱 최적화가 가능하다.

Baseline Profile 을 사용하지 않으면, 모든 앱 코드는 해석된 후 (interpreted) 메모리에서 JIT 컴파일되거나, 기기가 유휴 상태일 때 백그라운드에서 odex 파일로 작성된다. 앱을 설치하거나 업데이트 한 후, 사용자는 새로운 코드 경로가 최적화될 때까지 비최적화된 경험을 겪게 된다.

Startup profiles

Startup profiles 는 Baseline Profiles 와 유사하지만, 차이점은 기기 내 최적화가 아닌 컴파일 시에 사용된다는 점이다. Startup profiles 는 DEX 파일의 레이아웃을 최적화아여 앱의 시작 시간을 개선하는 데 사용된다. Startup profiles 에서 식별된 코드는 primary classes.dex 파일에 배치되고, 그 외의 코드는 별도의 DEX 파일에 배치된다. 이를 통해 앱 시작 시 page fault 를 줄여 시작 시간을 단축할 수 있다

앱 시작을 완벽하게 최적화하려면 Baseline Profiles 와 Startup Profiles 를 모두 사용하는 것이 좋다

📖 정리! 중요 코드 경로에 대한 메타 데이터를 제공하여 사전 컴파일 (AOT) 을 우선적으로 처리해, 최초 실행 코드의 실행 속도를 30% 향상 시킬 수 있다.

시작하기

최소 권장 stable version

dependency chain 은 stable 및 개발 release version 을 제공한다. Baseline Profiles 를 생성하고 설치하려면 아래 명시된 버전 이상을 사용해야 한다. 이 의존성들은 다양한 시점에 필요하며, 최적의 Baseline Profile 을 활성화하기 위한 toolchain 으로 함께 작동한다.

  • Android Gradle plugin : com.android.tools.build:8.0.0
  • Macrobenchmark library : androidx.benchmark:benchmark-macro-junit4:1.3.1
  • Profile Installer : androidx.profileinstaller:profileinstaller:1.4.0

Profile generation example

아래의 코드는 Macrabenchmark library 를 사용하여 앱 시작, 여러 네이베이션 및 스크롤 이벤트를 위한 Baseline Profile 을 생성하는 예시이다.

@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()
        }
    }
}

Baseline Profiles 의 작동 방식

앱이나 라이브러를 개발할 때, 렌더링 시간이나 지연 시간이 중요한 일반적인 사용자 상호작용에 대해 Baseline Profiles 를 정의하는 것을 고려해야 한다.

  1. 사람이 읽을 수 있는 프로필 규칙이 앱을 위해 생성되어 바이너리 형태로 컴파일 된다. 이 파일은 assets/dexopt/baseline.prof에서 찾을 수 있다. 이후 AAB 파일을 평소처럼 Google Play 에 업로드 할 수 있다.
  2. Google Play 는 이 프로필을 처리하여 APK 와 함께 사용자에게 직접 배포한다. 설치 과정에서 Android Runtime (ART) 가 프로필에 포함된 메서드를 사전 컴파일 (AOT) 하여 해당 메서드가 더 빠르게 실행되도록 한다. 만약 프로필에 앱 시작이나 프레임 렌더링 중 사용되는 메서드가 포함되어 있다면, 사용자는 더 빠른 시작 시간과 줄어든 jank 를 경험할 수 있다.
  3. 이 흐름은 Cloud Profiles 집계와 협력하여 시간에 따라 앱의 실제 사용에 기반한 성능을 세부 조정한다.

Cloud Profiles

Cloud Profiles 는 Baseline Profiles 와 함께 설치 시 컴파일을 위해 Google Play 스토어에서 집계된 추가적인 프로일 기반 최적화 (PGO) 형태를 제공한다.

Cloud Profiles 는 앱과의 실제 사용자 상호작용에 의해 생성되지만, 업데이트 후 배포되는데 몇 시간에서 며칠이 걸리므로 사용 가능성에 제한이 있다. 프로파일이 완전히 배포될 때 까지, 새로운 앱이나 업데이트된 앱의 사용자에게는 성능이 최적화 되지 않은 상태로 제공된다. 또한 Cloud Profiles 은 Android 9 (Api 28) 이상의 기기에서만 지원되며, 충분히 큰 사용자 기반을 가진 앱에 대해서만 잘 확장된다.

profile
Android Developer

0개의 댓글