오늘은 Android Baseline Profiles 에 대해 알아보려고 한다. 공식문서를 봤을 때도 양이 많기 때문에 (…) 적당히 나눠서 정리해보자.
Baseline Profiles 는 코드 경로에 대한 해석 및 즉시(jist-in-time, JIT) 컴파일 단계를 피함으로써 코드 실행 속도를 30% 향상시킬 수 있다.
앱이나 라이브러리에 Baseline Profiles 를 포함하면 Android Runtime (ART) 이 지정된 코드 경로를 사전 (ahead-of-time, AOT) 컴파일 하여 새로운 사용자 및 앱 업데이트 시 성능 향상을 제공한다. 이 프로파일 기반 최적화(profile guided optimization, PGO) 는 앱이 시작을 최적화하고, 상호작용 지연을 줄이며, 첫 실행 부터 전반적인 런타임 성능을 향상시키도록 한다.
이러한 성능 향상은 사용자 유지율, 거래량 및 평점과 같은 비즈니스 지표의 개선으로 직접 이어진다.
Baseline Profiles 는 앱이 처음 실행될 때 부터, 화면 간 네비게이션, 콘텐츠 스크롤과 같은 모든 사용자 상호작용을 더 매끄럽게 만든다.
Baseline Profiles 는 앱 시작 외에도 일반적인 사용자 상호작용을 통해 앱 런타임을 첫 실행부터 최적화하도록 유도한다. 이 사전(AOT) 컴파일은 사용자 기기에 의존하지 않고, 개발 기기에서 각 release 마다 한 번씩 수행할 수 있다. Baseline Profile 이 포함된 release 를 배포하며, Cloud Profiles 에 의존하는 것 보다 훨씬 빠르게 앱 최적화가 가능하다.
Baseline Profile 을 사용하지 않으면, 모든 앱 코드는 해석된 후 (interpreted) 메모리에서 JIT 컴파일되거나, 기기가 유휴 상태일 때 백그라운드에서 odex 파일로 작성된다. 앱을 설치하거나 업데이트 한 후, 사용자는 새로운 코드 경로가 최적화될 때까지 비최적화된 경험을 겪게 된다.
Startup profiles 는 Baseline Profiles 와 유사하지만, 차이점은 기기 내 최적화가 아닌 컴파일 시에 사용된다는 점이다. Startup profiles 는 DEX 파일의 레이아웃을 최적화아여 앱의 시작 시간을 개선하는 데 사용된다. Startup profiles 에서 식별된 코드는 primary classes.dex 파일에 배치되고, 그 외의 코드는 별도의 DEX 파일에 배치된다. 이를 통해 앱 시작 시 page fault 를 줄여 시작 시간을 단축할 수 있다
앱 시작을 완벽하게 최적화하려면 Baseline Profiles 와 Startup Profiles 를 모두 사용하는 것이 좋다
📖 정리! 중요 코드 경로에 대한 메타 데이터를 제공하여 사전 컴파일 (AOT) 을 우선적으로 처리해, 최초 실행 코드의 실행 속도를 30% 향상 시킬 수 있다.
dependency chain 은 stable 및 개발 release version 을 제공한다. Baseline Profiles 를 생성하고 설치하려면 아래 명시된 버전 이상을 사용해야 한다. 이 의존성들은 다양한 시점에 필요하며, 최적의 Baseline Profile 을 활성화하기 위한 toolchain 으로 함께 작동한다.
com.android.tools.build:8.0.0androidx.benchmark:benchmark-macro-junit4:1.3.1androidx.profileinstaller:profileinstaller:1.4.0아래의 코드는 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 를 정의하는 것을 고려해야 한다.
assets/dexopt/baseline.prof에서 찾을 수 있다. 이후 AAB 파일을 평소처럼 Google Play 에 업로드 할 수 있다.
Cloud Profiles 는 Baseline Profiles 와 함께 설치 시 컴파일을 위해 Google Play 스토어에서 집계된 추가적인 프로일 기반 최적화 (PGO) 형태를 제공한다.
Cloud Profiles 는 앱과의 실제 사용자 상호작용에 의해 생성되지만, 업데이트 후 배포되는데 몇 시간에서 며칠이 걸리므로 사용 가능성에 제한이 있다. 프로파일이 완전히 배포될 때 까지, 새로운 앱이나 업데이트된 앱의 사용자에게는 성능이 최적화 되지 않은 상태로 제공된다. 또한 Cloud Profiles 은 Android 9 (Api 28) 이상의 기기에서만 지원되며, 충분히 큰 사용자 기반을 가진 앱에 대해서만 잘 확장된다.