Baseline Profiles를 활용한 안드로이드 성능 최적화
Baseline Profiles를 활용한 안드로이드 성능 최적화
Baseline Profiles는 앱의 시작 시간을 단축하고 런타임 실행 성능을 높여 주는 안드로이드 성능 최적화 기능입니다. 사전에 컴파일해야 할 코드 정보를 안드로이드 런타임(ART)에 제공함으로써, 앱 설치 시점에 주요 코드 경로를 미리 컴파일할 수 있도록 합니다. 일반적으로 앱의 첫 몇 회 실행에서는 인터프리터와 JIT(Just-in-Time) 컴파일에 의존하기 때문에 성능이 저하되기 마련인데, Baseline Profiles를 적용하면 ART가 프로필 정보를 기반으로 핵심 코드 경로를 설치 단계에서 AOT(Ahead-of-Time) 컴파일합니다. 그 결과, 첫 실행부터 시작 시간이 약 20~30% 개선되는 효과를 기대할 수 있습니다.
이 레슨을 마치고 나면 다음 내용을 이해하실 수 있습니다.
- Baseline Profiles가 ART의 컴파일 파이프라인과 어떻게 상호작용하는지 설명할 수 있습니다.
- Jetpack Macrobenchmark 라이브러리를 활용한 프로필 생성 방법을 이해할 수 있습니다.
- 생성된 프로필 파일이 프로젝트 구조 내 어디에 저장되는지 파악할 수 있습니다.
- Baseline Profiles와 Google Play의 클라우드 프로필(cloud profiles) 간 차이를 설명할 수 있습니다.
Baseline Profiles의 ART 동작 원리
안드로이드 런타임(ART)은 여러 가지 컴파일 전략을 지원합니다. 프로필 데이터 없이 앱을 처음 설치하면, 코드는 인터프리터를 통해 실행됩니다. 메서드가 반복적으로 호출되면 JIT 컴파일러가 해당 메서드를 네이티브 코드로 컴파일하며, 시간이 지남에 따라 시스템은 자주 사용되는 메서드를 기록하고 디바이스가 유휴 상태일 때 백그라운드에서 AOT 컴파일을 수행합니다. 즉, 앱의 첫 몇 회 실행은 이후 실행에 비해 체감할 수 있을 만큼 느린 것이 일반적입니다.
Baseline Profiles는 바로 이 워밍업(warmup) 과정을 생략할 수 있게 해줍니다. 프로필 파일에는 설치 시점에 AOT 컴파일해야 할 클래스와 메서드 목록이 포함되어 있으며, 사용자가 앱을 열기 전에 이미 컴파일이 완료됩니다. ART는 이 프로필을 읽고 지정된 코드 경로를 즉시 네이티브 머신 코드로 컴파일하므로, 인터프리터 및 JIT 워밍업 단계를 완전히 건너뛸 수 있습니다. 그 결과, 첫 실행의 성능이 충분히 워밍업된 상태의 실행과 거의 동일한 수준에 도달합니다.
// baseline-prof.txt 파일의 항목 예시
HSPLcom/example/app/MainActivity;->onCreate(Landroid/os/Bundle;)V
HSPLcom/example/app/data/Repository;->fetchData()Ljava/util/List;
PLcom/example/app/ui/HomeScreen;->render()V
각 줄은 메서드 또는 클래스를 지정하며, 플래그를 통해 해당 항목이 Hot(H), Startup(S), Post-startup(P) 중 어느 범주에 속하는지 나타냅니다. ART는 이러한 플래그를 활용하여 컴파일 우선순위를 결정합니다. 가령, H와 S 플래그가 함께 지정된 메서드는 앱 시작 과정에서 빈번하게 호출되는 핵심 경로이므로 가장 먼저 컴파일 대상이 됩니다.
Baseline Profiles 생성 방법
프로필은 Jetpack Macrobenchmark 라이브러리를 사용하여 생성합니다. 벤치마크 테스트가 앱의 주요 사용자 시나리오를 실행하면, 시스템이 해당 시나리오에서 접근하는 클래스와 메서드를 기록합니다.
@ExperimentalBaselineProfilesApi
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun startup() = baselineProfileRule.collect(
packageName = "com.example.app"
) {
pressHome()
startActivityAndWait()
}
}
위 코드에서 BaselineProfileRule은 프로필 수집을 관리하는 테스트 규칙이며, collect 블록 내에서 앱의 핵심 사용자 경로를 실행합니다. 제너레이터는 실제 디바이스 또는 에뮬레이터에서 실행되어 실행 트레이스를 캡처하고, baseline-prof.txt 파일을 출력합니다. 이 파일은 모듈 디렉토리 내 src/main/generated/baselineProfiles/ 경로에 배치되며, 빌드 과정에서 APK 또는 AAB에 자동으로 포함됩니다.