Membuat Profil Dasar Pengukuran

Profil Dasar Pengukuran sangat penting untuk memaksimalkan performa Jetpack Compose. Mengompilasi terlebih dahulu perjalanan pengguna penting akan membantu memastikan bahwa UI Compose Anda dirender dengan lancar.

Buat profil secara otomatis untuk setiap rilis aplikasi menggunakan library Jetpack Macrobenchmark dan BaselineProfileRule. Sebaiknya gunakan com.android.tools.build:gradle:8.0.0 atau versi lebih baru untuk memanfaatkan peningkatan build saat menggunakan Profil Dasar Pengukuran.

Berikut adalah langkah umum untuk membuat Profil Dasar Pengukuran baru:

  1. Menyiapkan modul Profil Dasar Pengukuran.
  2. Menentukan pengujian JUnit yang membantu membuat Profil Dasar Pengukuran.
  3. Tambahkan perjalanan penting pengguna (CUJ) yang ingin Anda optimalkan.
  4. Membuat Profil Dasar Pengukuran.

Setelah Anda membuat Profil Dasar Pengukuran, lakukan benchmark menggunakan perangkat fisik untuk mengukur peningkatan kecepatan.

Membuat Profil Dasar Pengukuran baru dengan AGP 8.2 atau yang lebih baru

Cara termudah untuk membuat Profil Dasar Pengukuran baru adalah dengan menggunakan template modul Profil Dasar Pengukuran, yang tersedia mulai Android Studio Iguana dan Plugin Android Gradle (AGP) 8.2.

Template modul Generator Profil Dasar Pengukuran Android Studio mengotomatiskan pembuatan modul baru untuk membuat dan menjalankan benchmark Profil Dasar Pengukuran. Menjalankan template ini akan menghasilkan sebagian besar konfigurasi build standar, pembuatan Profil Dasar Pengukuran, dan kode verifikasi. Template ini membuat kode untuk menghasilkan dan menjalankan benchmark Profil Dasar Pengukuran guna mengukur startup aplikasi.

Menyiapkan modul Profil Dasar Pengukuran

Untuk menjalankan template modul Profil Dasar Pengukuran, ikuti langkah-langkah berikut:

  1. Pilih File > New > New Module.
  2. Pilih template Baseline Profile Generator di panel Templates dan konfigurasikan:
    Gambar 1. Template modul Generator Profil Dasar Pengukuran.
    Kolom dalam template adalah sebagai berikut:
    • Target application: aplikasi yang menjadi tujuan pembuatan Profil Dasar Pengukuran. Jika Anda hanya memiliki satu modul aplikasi dalam project, hanya ada satu item dalam daftar ini.
    • Module name: nama yang Anda inginkan untuk modul Profil Dasar Pengukuran yang sedang dibuat.
    • Package name: nama paket yang Anda inginkan untuk modul Profil Dasar Pengukuran.
    • Language: apakah Anda menginginkan kode yang dihasilkan berupa Kotlin atau Java.
    • Build configuration language: apakah Anda ingin menggunakan Skrip Kotlin (KTS) atau Groovy untuk skrip konfigurasi build Anda.
    • Gunakan perangkat yang dikelola Gradle: apakah Anda menggunakan perangkat yang dikelola Gradle untuk menguji aplikasi Anda.
  3. Klik Finish, dan modul baru akan dibuat. Jika menggunakan kontrol sumber, Anda mungkin diminta untuk menambahkan file modul yang baru dibuat ke kontrol sumber.

Menentukan generator Profil Dasar Pengukuran

Modul yang baru dibuat berisi pengujian untuk membuat dan melakukan benchmark Profil Dasar Pengukuran serta hanya menguji startup aplikasi dasar. Sebaiknya, Anda menambahkannya untuk menyertakan CUJ dan alur kerja startup lanjutan. Pastikan semua pengujian yang terkait dengan peluncuran aplikasi berada dalam blok rule dengan includeInStartupProfile yang ditetapkan ke true; sebaliknya, untuk performa yang optimal, pastikan semua pengujian yang tidak terkait dengan peluncuran aplikasi tidak disertakan dalam Profil Startup. Pengoptimalan startup aplikasi digunakan untuk menentukan bagian khusus Profil Dasar Pengukuran yang disebut Profil Startup.

Hal ini membantu pemeliharaan jika Anda memisahkan CUJ ini di luar Profil Dasar Pengukuran dan kode benchmark yang dihasilkan sehingga dapat digunakan untuk keduanya. Ini berarti perubahan pada CUJ Anda digunakan secara konsisten.

Membuat dan menginstal Profil Dasar Pengukuran

Template modul Profil Dasar Pengukuran menambahkan konfigurasi run baru untuk membuat Profil Dasar Pengukuran. Jika Anda menggunakan ragam produk, Android Studio akan membuat beberapa konfigurasi run sehingga Anda dapat membuat Profil Dasar Pengukuran terpisah untuk setiap ragam.

Konfigurasi eksekusi Generate Profil Dasar.
Gambar 2. Menjalankan konfigurasi ini akan menghasilkan Profil Dasar Pengukuran.

Saat konfigurasi run Buat Profil Dasar Pengukuran selesai, konfigurasi ini akan menyalin Profil Dasar Pengukuran yang dihasilkan ke file src/variant/generated/baselineProfiles/baseline-prof.txt dalam modul yang sedang dibuat profilnya. Opsi varian dapat berupa jenis build rilis atau varian build yang melibatkan jenis build rilis.

Profil Dasar Pengukuran yang dihasilkan dibuat di build/outputs. Jalur lengkap ditentukan oleh varian atau ragam aplikasi yang sedang dibuat profilnya, dan ditentukan oleh apakah Anda menggunakan perangkat yang dikelola Gradle atau perangkat yang terhubung untuk pembuatan profil. Jika Anda menggunakan nama yang digunakan oleh kode dan konfigurasi build yang dihasilkan oleh template, Profil Dasar Pengukuran akan dibuat dalam file build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt. Anda mungkin tidak perlu berinteraksi dengan versi Profil Dasar Pengukuran yang dihasilkan ini secara langsung, kecuali jika Anda menyalinnya secara manual ke modul target (tidak direkomendasikan).

Membuat Profil Dasar Pengukuran baru dengan AGP 8.1

Jika Anda tidak dapat menggunakan template modul Profil Dasar Pengukuran, gunakan template modul Macrobenchmark dan plugin Gradle Profil Dasar Pengukuran untuk membuat Profil Dasar Pengukuran baru. Sebaiknya, gunakan alat ini mulai dari Android Studio Giraffe dan AGP 8.1.

Berikut adalah langkah-langkah untuk membuat Profil Dasar Pengukuran baru menggunakan template modul Macrobenchmark dan plugin Gradle Profil Dasar Pengukuran:

  1. Siapkan modul Macrobenchmark dalam project Gradle Anda.
  2. Tentukan class baru bernama BaselineProfileGenerator:

    class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                startActivityAndWait()
            }
        )
    }
    

    Generator dapat berisi interaksi dengan aplikasi Anda di luar startup aplikasi. Hal ini memungkinkan Anda mengoptimalkan performa runtime aplikasi, seperti men-scroll daftar, menjalankan animasi, dan menavigasi dalam Activity. Lihat contoh lain pengujian yang menggunakan @BaselineProfileRule untuk meningkatkan kualitas perjalanan penting pengguna.

  3. Tambahkan plugin Gradle Profil Dasar Pengukuran (libs.plugins.androidx.baselineprofile). Plugin ini memudahkan pembuatan Profil Dasar Pengukuran dan pengelolaannya di masa mendatang.

  4. Untuk membuat Profil Dasar Pengukuran, jalankan tugas Gradle :app:generateBaselineProfile atau :app:generateVariantBaselineProfile di terminal.

    Jalankan generator sebagai pengujian berinstrumen pada perangkat fisik yang di-root, emulator, atau Perangkat yang Dikelola Gradle. Jika Anda menggunakan Perangkat yang Dikelola Gradle, setel aosp sebagai systemImageSource, karena Anda memerlukan akses root untuk generator Profil Dasar Pengukuran.

    Di akhir tugas pembuatan, Profil Dasar Pengukuran disalin ke app/src//generated/baselineProfiles.

Membuat Profil Dasar Pengukuran baru tanpa template

Sebaiknya, buat Profil Dasar Pengukuran menggunakan template modul Profil Dasar Pengukuran Android Studio (lebih disukai) atau template Macrobenchmark, tetapi Anda juga dapat menggunakan plugin Gradle Profil Dasar Pengukuran itu sendiri. Untuk membaca selengkapnya tentang plugin Gradle Profil Dasar Pengukuran, lihat Mengonfigurasi pembuatan Profil Dasar Pengukuran.

Berikut cara membuat Profil Dasar Pengukuran menggunakan plugin Gradle Profil Dasar Pengukuran secara langsung:

  1. Buat modul com.android.test baru—misalnya, :baseline-profile.
  2. Konfigurasi file build.gradle.kts untuk :baseline-profile:

    1. Terapkan plugin androidx.baselineprofile.
    2. Pastikan targetProjectPath mengarah ke modul :app.
    3. Secara opsional, tambahkan perangkat yang dikelola Gradle (GMD). Dalam contoh berikut, nilainya adalah pixel6Api31. Jika tidak ditentukan, plugin akan menggunakan perangkat terhubung, baik yang diemulasikan maupun fisik.
    4. Terapkan konfigurasi yang Anda inginkan, seperti yang ditunjukkan dalam contoh berikut.

    Kotlin

    plugins {
        id("com.android.test")
        id("androidx.baselineprofile")
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath = ":app"
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device = "Pixel 6"
                apiLevel = 31
                systemImageSource = "aosp"
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices += "pixel6Api31"
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices = false
    }

    Groovy

    plugins {
        id 'com.android.test'
        id 'androidx.baselineprofile'
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath ':app'
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device 'Pixel 6'
                apiLevel 31
                systemImageSource 'aosp'
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices ['pixel6Api31']
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices false
    }
  3. Buat pengujian Profil Dasar Pengukuran dalam modul pengujian :baseline-profile. Contoh berikut adalah pengujian yang membuat Profil Dasar Pengukuran untuk startup aplikasi.

        class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                uiAutomator { startApp(PACKAGE_NAME) }
            }
        )
    }
    
  4. Update file build.gradle.kts di modul aplikasi, misalnya :app.

    1. Terapkan plugin androidx.baselineprofile.
    2. Tambahkan dependensi baselineProfile ke modul :baseline-profile.

    Kotlin

    plugins {
        id("com.android.application")
        id("androidx.baselineprofile")
    }
    
    android {
        // There are no changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile(project(":baseline-profile"))
    }

    Groovy

    plugins {
        id 'com.android.application'
        id 'androidx.baselineprofile'
    }
    
    android {
        // No changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile ':baseline-profile'
    }
  5. Buat profil dengan menjalankan tugas Gradle :app:generateBaselineProfile atau :app:generateVariantBaselineProfile.

  6. Di akhir tugas pembuatan, Profil Dasar Pengukuran disalin ke app/src/variant/generated/baselineProfiles.

Menjalankan benchmark Profil Dasar Pengukuran

Untuk menjalankan benchmark Profil Dasar Pengukuran, buat konfigurasi Android Instrumented Test Run yang baru dari tindakan gutter yang menjalankan benchmark yang ditentukan dalam file StartupBenchmarks.kt. Untuk mempelajari pengujian benchmark lebih lanjut, lihat Membuat class Macrobenchmark dan Profil Dasar Pengukuran Benchmark dengan library Macrobenchmark.

Gambar 3. Menjalankan Pengujian Android dari tindakan gutter.

Saat Anda menjalankan ini dalam Android Studio, output build akan berisi detail peningkatan kecepatan yang disediakan oleh Profil Dasar Pengukuran:

StartupBenchmarks_startupCompilationBaselineProfiles
timeToInitialDisplayMs   min 161.8,   median 178.9,   max 194.6
StartupBenchmarks_startupCompilationNone
timeToInitialDisplayMs   min 184.7,   median 196.9,   max 202.9

Merekam semua jalur kode yang diperlukan

Dua metrik utama untuk mengukur waktu startup aplikasi adalah sebagai berikut:

TTFD dilaporkan setelah metode reportFullyDrawn dari ComponentActivity dipanggil. Jika reportFullyDrawn tidak pernah dipanggil, TTID akan dilaporkan. Anda mungkin harus menunda saat reportFullyDrawn dipanggil hingga pemuatan asinkron selesai. Misalnya, jika UI berisi daftar lambat dinamis, daftar tersebut mungkin diisi oleh tugas latar belakang yang selesai setelah daftar pertama kali digambar, sehingga setelah UI ditandai sebagai digambar sepenuhnya. Dalam kasus tersebut, kode yang berjalan setelah UI mencapai status sepenuhnya digambar tidak disertakan dalam Profil Dasar Pengukuran.

Untuk menyertakan populasi daftar sebagai bagian dari Profil Dasar Pengukuran Anda, dapatkan FullyDrawnReporter dengan menggunakan getFullyDrawnReporter dan tambahkan reporter ke profil tersebut di kode aplikasi Anda. Rilis reporter setelah tugas latar belakang selesai mengisi daftar. FullyDrawnReporter tidak memanggil metode reportFullyDrawn hingga semua reporter dirilis. Dengan melakukan ini, Profil Dasar Pengukuran menyertakan jalur kode yang diperlukan untuk mengisi daftar. Tindakan ini tidak mengubah perilaku aplikasi bagi pengguna, tetapi memungkinkan Profil Dasar Pengukuran menyertakan semua jalur kode yang diperlukan.

Untuk menunjukkan status yang sepenuhnya digambar, gunakan Compose API berikut:

  • ReportDrawn menunjukkan bahwa composable Anda langsung siap untuk berinteraksi.
  • ReportDrawnWhen mengambil predikat, seperti list.count > 0, untuk menunjukkan kapan composable Anda siap berinteraksi.
  • ReportDrawnAfter mengambil metode penangguhan yang, setelah selesai, menunjukkan bahwa composable Anda siap untuk berinteraksi.