Baseline Profiles 정리
Baseline Profiles
Baseline Profiles란?
APK에 담기는 클래스와 메소드의 목록이다.
앱 설치가 되는 동안 이 목록의 클래스와 메소드는 pre-compile 된다. 이 결과물은 실행이 더 빠르다.
결과물 덕분에 앱 실행 시간과 jank가 감소된다.
*jank: CPU 작업시간이 60프레임 범위를 넘어가서 앱이 버벅이게 만들 수 있는 CPU의 초과 작업시간
Compose에 적용된 Baseline Profiles
AndroidX와 Compose는 안드로이드 시스템의 일부가 아니고 라이브러리이므로 앱 설치 시 컴파일되지 않아서 cold startup 시간을 증가시킬 수 있다.
하지만 최신 AndroidX와 Compose 1.0.0 이상은 자동으로 Baseline Profile을 제공하기 때문에 이런 문제가 발생하지 않는다.
*Baseline Profile을 제공: baseline-prof.txt가 각 라이브러리에 담겨있다는 뜻. 예시
Baseline Profiles는 어떻게 동작하나? (원문)
Profile rules가 binary form으로 컴파일되어 APK 안에 담긴다.
앱 설치 동안 ART는 profile 안에 메소드를 대상으로 AOT compilation을 수행한다.
만약 profile이 앱실행 또는 랜더링 프레임 동안 사용되는 메소드를 포함한다면 앱 실행을 더 빠르게 만들 수 있고 jank를 감소시킬 수 있다.
Critical user journeys의 예로는 app startup, transition, scrolling 등이 있다.
안드로이드 버전 별 Baseline Profiles의 Compilation 동작 비교 (원문)
Android 5(API 21) ~ 6(API 23)
Full AOT
앱 설치 동안 앱 전체를 최적화 한다.
RAM과 disk 사용량, disk로부터 읽어오는 시간이 증가한다.
결과적으로 cold startup 시간을 증가시킨다.
Android 7(API 24) ~ 8.1(API 27)
Partial AOT (Baseline Profile)
앱 설치 동안 Baseline Profile에 명시된 메소드를 대상으로 최적화 한다.
ART는 앱이 사용되는 동안 profile rules를 추가하고 기기가 유휴 상태일 때 컴파일을 수행해서 최적화할 수 있다.
이 최적화는 disk 사용량과 disk로부터 읽어오는 시간을 감소시킨다.
결과적으로 cold startup 시간도 줄어든다.
Android 9(API 28) ~
Partial AOT (Baseline + Cloud Profile)
구글플레이가 앱 설치 동안 Baseline profiles와, 가능하다면 Cloud profiles까지 사용해 APK를 최적화 한다.
설치 후에 ART profiles는 구글플레이로 업로드되어 수집된다.
이후 다른 사용자가 앱을 설치/업데이트 할 때 Cloud profiles가 함께 제공된다.
Baseline Profiles 만들기 (원문)
- Jetpack Macrobenchmark 라이브러리를 사용해야 한다.
BaselineProfileRule
을 사용해서 테스트를 작성한다.- rooted 기기 또는 구글플레이가 설치되지 않은 emulator에서 테스트를 실행한다.
- Test Results 패널에서 생성된 profiles 로그를 찾는다. 로그 예)
To copy the profile use:
adb pull "/sdcard/Android/media/com.example.macrobenchmark/additional_test_output/TrivialBaselineProfileBenchmark_startup-baseline-prof.txt"
- 이름을 baseline-prof.txt으로 바꿔서 앱모듈의 src/main 디렉토리에 위치시킨다.
BaselineProfileRule
샘플
- https://github.com/android/performance-samples/tree/main/MacrobenchmarkSample
- https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/AudioUnderrunBenchmark.kt
BaselineProfileRule
vs MacrobenchmarkRule
BaselineProfileRule
Baseline profiles 생성을 위한 용도
@OptIn(ExperimentalBaselineProfilesApi::class)
class TrivialBaselineProfileBenchmark {
// [START baseline_profile_basic]
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun startup() = baselineProfileRule.collectBaselineProfile(
packageName = TARGET_PACKAGE,
profileBlock = {
startActivityAndWait()
device.waitForIdle()
}
)
// [END baseline_profile_basic]
}
MacrobenchmarkRule
startup, scrolling, transition 등의 성능을 측정하는 용도
@LargeTest
@RunWith(AndroidJUnit4::class)
class SampleStartupBenchmark {
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = TARGET_PACKAGE,
metrics = listOf(StartupTimingMetric()),
iterations = 5,
setupBlock = {
// Press home button before each run to ensure the starting activity isn't visible.
pressHome()
}
) {
// starts default launch activity
startActivityAndWait()
}
}
Macrobenchmark
Macrobenchmark란? (원문)
startup, UI 인터렉션, 애니메이션과 같은 큰 인터렉션을 측정한다.
이 라이브러리는 당신이 앱 startup, scrolling을 측정하기 위해 앱의 compiling, starting, stopping을 제어할 수 있게 해준다.
이벤트를 injects 해서 앱으로부터의 결과를 모니터링 한다.
따라서 벤치마크를 작성할 때 앱 코드를 직접 호출하지 않아도 된다.
Macrobenchmark 작성하기 (원문)
- 라이브러리의 벤치마킹 결과를 AndroidStudio와, 더 자세히는 JSON 파일로 출력한다.
- CI 환경에 적용하려면 Run benchmarks in Continuous Integration를 참고한다.