Gradle 없이 Microbenchmark 빌드

이 페이지에서는 Microbenchmark 라이브러리를 사용할 때 Gradle이 아닌 빌드 시스템 구성을 설명합니다.

Microbenchmark 라이브러리는 Gradle 플러그인을 제공하여 Android Gradle 플러그인과 직접 통합할 수 있지만 Bazel 또는 Buck과 같은 다른 빌드 시스템에서도 이를 사용할 수 있습니다.

계측

테스트 매니페스트의 계측 블록에서 지정하여 AndroidBenchmarkRunner 또는 서브클래스를 계측 실행기로 사용합니다.

<manifest
    package="com.example.library.test" ...>

    <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" />
    ...
</manifest>

정확하게 측정하려면 벤치마크는 디버그 가능하지 않아야 합니다. 디버그 가능 플래그를 올바르게 설정하지 않으면 라이브러리에서 잘못된 결과를 보고하는 대신 오류가 발생합니다. debuggable=true가 필요한 Android 스튜디오 프로파일러와 함께 사용하기 위해 로컬 실행 중에 이 설정을 전환해야 할 수도 있습니다.

Microbenchmark를 빌드하여 두 가지 방식으로 실행할 수 있습니다. 자체 계측 APK 내에서 실행하거나 하나의 테스트 APK에서 다른 APK를 계측하는 방식으로 실행하는 것입니다.

자체 계측 APK

com.android.libraryandroidTest 디렉터리에 관한 Gradle의 출력으로 자체 계측 APK를 사용하면 단일 APK의 Android 매니페스트에서 debuggable을 사용 중지해야 합니다.

<manifest
    package="com.example.library.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.library.test"/>

    <application android:debuggable="false"/>
</manifest>

테스트 APK에서 계측된 앱 APK

빌드에서 com.android.app 패키지의 androidTest 디렉터리에 관한 Gradle의 출력으로 두 가지 APK(앱 APK와 테스트 APK)를 출력하는 경우 앱 APK를 debuggable=false로 설정해야 합니다. 테스트 APK의 디버그 가능 플래그는 Android OS에서 무시됩니다.

<!-- Test manifest. -->
<manifest
    package="com.example.android.app.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.android.app"/>
    <!-- This debuggable is ignored by the OS. -->
</manifest>

<!-- App being tested. -->
<manifest
    package="com.example.android.app" ...>

    <application android:debuggable="false"/>
</manifest>

Android 스튜디오 및 Gradle은 앱 모듈 APK의 마이크로벤치마킹을 지원하지 않습니다. 디버그 불가능하거나 최적화 또는 축소된 APK 변형에 의존하지만 벤치마크에서 앱 코드로의 호출을 방해하는 압축이 없는 추가 테스트 디렉터리를 지원하는 복잡성 때문입니다.

컴파일

테스트를 실행하기 전에 Microbenchmark APK를 다음 명령어를 실행합니다.

adb shell cmd package compile -f -m speed com.example.benchmark

압축 및 최적화

벤치마크에 압축 및 최적화를 사용하여 출시에 가까운 성능을 얻는 것이 좋습니다. 코드 예는 벤치마크 샘플 프로젝트를 참고하세요.

코드 적용 범위

적용 범위가 사용 중지되고, JaCoCo와 같은 도구로 라이브러리 또는 DEX 맹글링 없이 벤치마크를 실행하는 것이 좋습니다.

따라서 벤치마크를 다른 계측 테스트에서 소스 세트로 격리하고 출시 종속 항목과 별도로 빌드하는 것이 좋습니다. 이렇게 하면 적용 범위 유무와 관계없이 테스트를 두 번 이상 빌드할 필요가 없습니다.

벤치마크가 의존하는 라이브러리의 디버그 변형, 특히 로컬에서 빌드된 라이브러리의 디버그 변형은 적용 범위가 사용 설정된 상태에서 빌드될 수 있습니다.

테스트 실행

다음 예와 같이 명령줄에서 테스트를 실행하고 실행할 클래스를 지정할 수 있습니다.

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Gradle 없이 Microbenchmark 라이브러리를 런타임에 구성하려면 Microbenchmark 계측 인수를 참고하세요.