Mem-build Microbenchmark tanpa Gradle

Topik ini menjelaskan cara mengonfigurasi sistem build non-Gradle saat menggunakan library Microbenchmark.

Meskipun library Microbenchmark mengirimkan plugin Gradle untuk langsung diintegrasikan dengan plugin Android Gradle, Anda juga dapat menggunakannya dalam sistem build lain, seperti Bazel atau Buck.

Instrumentasi

Gunakan AndroidBenchmarkRunner atau subclass sebagai runner instrumentasi dengan menentukannya dalam blok instrumentasi manifes pengujian:

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

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

Untuk mendapatkan pengukuran yang akurat, benchmark tidak boleh dapat di-debug. Jika Anda tidak menetapkan tanda yang dapat di-debug dengan benar, library akan menampilkan error, bukan melaporkan hasil yang tidak valid. Anda mungkin perlu mengubah setelan ini selama operasi lokal untuk digunakan dengan profiler Android Studio, yang memerlukan debuggable=true.

Anda dapat mem-build Microbenchmark untuk berjalan dengan dua cara: dalam APK yang melakukan instrumentasi sendiri, atau dengan satu APK pengujian yang menginstrumentasikan APK lain.

APK yang melakukan instrumentasi sendiri

Dengan APK yang melakukan instrumentasi sendiri—sebagai output Gradle untuk direktori androidTest dari com.android.library—Anda harus menonaktifkan fungsi yang dapat di-debug dalam manifes Android APK tunggal:

<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 aplikasi yang diinstrumentasi oleh APK pengujian

Jika build Anda menghasilkan dua APK, yaitu APK aplikasi dan APK pengujian, sebagai output Gradle untuk direktori androidTest dari paket com.android.app, Anda harus menetapkan APK aplikasi ke debuggable=false. Flag yang dapat di-debug dalam APK pengujian diabaikan oleh 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 Studio dan Gradle tidak mendukung microbenchmark APK modul aplikasi. Hal ini disebabkan oleh kompleksitas dukungan direktori pengujian tambahan yang bergantung pada varian APK yang tidak dapat di-debug, dioptimalkan, atau diminifikasi, tetapi tanpa minifikasi yang mengganggu panggilan dari benchmark ke kode aplikasi.

Kompilasi

Sebaiknya kompilasi APK microbenchmark sebelum menjalankan pengujian, menggunakan perintah berikut:

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

Minifikasi dan pengoptimalan

Sebaiknya, gunakan minifikasi dan pengoptimalan untuk benchmark Anda guna mendapatkan performa yang siap untuk dirilis. Untuk kode contoh, lihat Contoh project benchmark.

Cakupan kode

Sebaiknya, jalankan benchmark dengan cakupan dinonaktifkan dan tanpa gangguan library atau DEX oleh alat seperti JaCoCo.

Karena alasan ini, sebaiknya isolasi benchmark sebagai set sumber dari uji instrumentasi lainnya dan build secara terpisah dengan dependensi rilis. Dengan demikian, Anda tidak perlu membuat pengujian lebih dari sekali, baik dengan maupun tanpa cakupan.

Varian debug library yang menjadi dependensi benchmark Anda, terutama yang dibangun secara lokal, mungkin dibangun dengan mengaktifkan cakupan.

Jalankan pengujian Anda

Anda dapat menjalankan pengujian dari command line dan menentukan class yang akan dijalankan, seperti yang ditunjukkan dalam contoh berikut:

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

Untuk mengonfigurasi library Microbenchmark pada runtime tanpa Gradle, lihat Argumen Instrumentasi Microbenchmark.