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 만들기 (원문)

  1. Jetpack Macrobenchmark 라이브러리를 사용해야 한다.
  2. BaselineProfileRule을 사용해서 테스트를 작성한다.
  3. rooted 기기 또는 구글플레이가 설치되지 않은 emulator에서 테스트를 실행한다.
  4. Test Results 패널에서 생성된 profiles 로그를 찾는다. 로그 예)
To copy the profile use:
adb pull "/sdcard/Android/media/com.example.macrobenchmark/additional_test_output/TrivialBaselineProfileBenchmark_startup-baseline-prof.txt"
  1. 이름을 baseline-prof.txt으로 바꿔서 앱모듈의 src/main 디렉토리에 위치시킨다.

BaselineProfileRule 샘플

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 작성하기 (원문)

  1. 라이브러리의 벤치마킹 결과를 AndroidStudio와, 더 자세히는 JSON 파일로 출력한다.
  2. CI 환경에 적용하려면 Run benchmarks in Continuous Integration를 참고한다.

Macrobenchmark 기타

  • Matrics에 대해 (원문)
  • 특정 요소 측정을 위한 앱 제어 (원문)
  • Benchmarking in CI (원문)