Petunjuk

Pertimbangan Performa yang Lebih Mendalam

Waktu baca: 8 menit

Tenangkan diri Anda dan izinkan kami memandu Anda memahami lebih lanjut latar belakang performa.

Selamat datang di hari ke-3 Pekan Sorotan Performa. Hari ini, kami terus membagikan detail dan panduan tentang area penting performa aplikasi. Kami membahas Pengoptimalan yang Dipandu Profil, peningkatan performa Jetpack Compose, dan pertimbangan untuk bekerja di balik layar. Mari kita mulai.

Pengoptimalan yang Dipandu Profil

Profil Dasar Pengukuran dan Profil Startup sangat penting untuk meningkatkan performa startup dan runtime aplikasi Android. Fitur ini adalah bagian dari grup pengoptimalan performa yang disebut Pengoptimalan yang Dipandu Profil.

Saat aplikasi dikemas, dexer d8 akan mengambil class dan metode serta mengisi file classes.dex aplikasi Anda. Saat pengguna membuka aplikasi, file dex ini dimuat satu per satu hingga aplikasi dapat dimulai. Dengan memberikan Profil Startup, Anda memberi tahu d8 class dan metode mana yang akan dikemas dalam file classes.dex pertama. Struktur ini memungkinkan aplikasi memuat lebih sedikit file, yang pada gilirannya meningkatkan kecepatan peluncuran.

Profil Dasar Pengukuran secara efektif memindahkan langkah-langkah kompilasi Just in Time (JIT) dari perangkat pengguna ke mesin developer. Kode yang dikompilasi Ahead Of Time (AOT) yang dihasilkan telah terbukti mengurangi waktu mulai dan masalah rendering.

Trello dan Profil Dasar Pengukuran

Kami bertanya kepada engineer di aplikasi Trello tentang pengaruh Profil Dasar Pengukuran terhadap performa aplikasi mereka. Setelah menerapkan Profil Dasar Pengukuran ke perjalanan pengguna utama mereka, Trello mengalami penurunan waktu mulai aplikasi yang signifikan sebesar 25%.

image.png

Trello dapat meningkatkan waktu mulai aplikasi mereka sebesar 25 % dengan menggunakan profil dasar pengukuran.

Profil Dasar Pengukuran di Meta

Selain itu, engineer di Meta baru-baru ini memublikasikan artikel tentang cara mereka mempercepat aplikasi Android dengan Profil Dasar Pengukuran.

image.png

Di seluruh aplikasi Meta, tim telah melihat berbagai metrik penting meningkat hingga 40 % setelah menerapkan Profil Dasar Pengukuran.

Peningkatan teknis seperti ini juga membantu Anda meningkatkan kepuasan pengguna dan kesuksesan bisnis. Membagikan hal ini kepada pemilik produk, CTO, dan pengambil keputusan juga dapat membantu mempercepat performa aplikasi Anda.

Mulai menggunakan Profil Dasar Pengukuran

Untuk membuat Profil Dasar Pengukuran atau Profil Startup, Anda menulis pengujian macrobenchmark yang melatih aplikasi. Selama pengujian, data profil dikumpulkan dan akan digunakan selama kompilasi aplikasi. Pengujian ditulis menggunakan UiAutomator API baru, yang akan kita bahas besok.

Menulis benchmark seperti ini sangat mudah dan Anda dapat melihat contoh lengkapnya di GitHub.

  @Test

fun profileGenerator() {

    rule.collect(

        packageName = TARGET_PACKAGE,

        maxIterations = 15,

        stableIterations = 3,

        includeInStartupProfile = true

    ) {

        uiAutomator {

            startApp(TARGET_PACKAGE)

        }

    }


}

Pertimbangan

Mulailah dengan menulis Profil Dasar Pengukuran dan Profil Startup untuk pengujian macrobenchmark pada jalur yang paling sering dilalui pengguna Anda. Artinya, titik entri utama yang digunakan pengguna untuk masuk ke aplikasi Anda, yang biasanya setelah mereka login. Kemudian, lanjutkan menulis lebih banyak kasus pengujian untuk mendapatkan gambaran yang lebih lengkap hanya untuk Profil Dasar Pengukuran. Anda tidak perlu mencakup semuanya dengan Profil Dasar Pengukuran. Tetap gunakan jalur yang paling sering digunakan dan ukur performa di lapangan. Informasi selengkapnya akan dibahas dalam postingan besok.

Mulai menggunakan Pengoptimalan yang Dipandu Profil

Untuk mempelajari cara kerja Profil Dasar Pengukuran, tonton video ini dari Android Developers Summit:

Tonton juga episode Android Build Time tentang Pengoptimalan yang Dipandu Profil untuk melihat pembahasan mendalam lainnya: 

Kami juga memiliki panduan ekstensif tentang Profil Dasar Pengukuran dan Profil Sistem Dimulai yang tersedia untuk dibaca lebih lanjut.

Peningkatan performa Jetpack Compose

Framework UI untuk Android telah melihat hasil investasi performa dari tim engineering. Mulai dari Jetpack Compose versi 1.9, jank scroll telah turun menjadi 0,2 % selama uji tolok ukur scrolling panjang internal. 

jankyFrames.png

Peningkatan ini dapat dilakukan berkat beberapa fitur yang disertakan dalam rilis terbaru.

Jendela cache yang dapat disesuaikan

Secara default, tata letak lambat hanya menyusun satu item di awal dalam arah scrolling, dan setelah sesuatu di-scroll keluar dari layar, item tersebut akan dihapus. Sekarang Anda dapat menyesuaikan jumlah item yang akan dipertahankan melalui sebagian kecil area tampilan atau ukuran dp. Hal ini membantu aplikasi Anda melakukan lebih banyak pekerjaan di awal, dan setelah mengaktifkan komposisi yang dapat dijeda di antara frame, menggunakan waktu yang tersedia secara lebih efisien.

Untuk mulai menggunakan periode cache yang dapat disesuaikan, buat instance LazyLayoutCacheWindow dan teruskan ke daftar lambat atau petak lambat Anda. Ukur performa aplikasi Anda menggunakan berbagai ukuran jendela cache, misalnya 50% dari area tampilan. Nilai optimal akan bergantung pada struktur konten dan ukuran item Anda.

  val dpCacheWindow = LazyLayoutCacheWindow(ahead = 150.dp, behind = 100.dp)

val state = rememberLazyListState(cacheWindow = dpCacheWindow)

LazyColumn(state = state) {

    // column contents

}

Komposisi yang dapat dijeda

Fitur ini memungkinkan komposisi dijeda, dan tugasnya dibagi menjadi beberapa frame. API ini tersedia di 1.9 dan kini digunakan secara default di 1.10 dalam pengambilan data tata letak lambat. Anda akan melihat manfaat terbesar pada item kompleks dengan waktu komposisi yang lebih lama. 

image.png

Pengoptimalan performa Compose lainnya

Dalam Compose versi 1.9 dan 1.10, tim juga melakukan beberapa pengoptimalan yang tidak terlalu terlihat.

Beberapa API yang menggunakan coroutine di balik layar telah ditingkatkan. Misalnya, saat menggunakan Draggable dan Clickable, developer akan melihat waktu reaksi yang lebih cepat dan jumlah alokasi yang lebih baik.

Pengoptimalan dalam pelacakan persegi tata letak telah meningkatkan performa Pengubah seperti onVisibilityChanged() dan onLayoutRectChanged(). Hal ini mempercepat fase tata letak, meskipun tidak menggunakan API ini secara eksplisit.

Peningkatan performa lainnya adalah menggunakan nilai yang di-cache saat mengamati posisi melalui onPlaced().

Mengambil teks di latar belakang

Mulai versi 1.9, Compose menambahkan kemampuan untuk melakukan pengambilan data teks di thread latar belakang. Dengan begitu, Anda dapat memanaskan cache terlebih dahulu untuk tata letak teks yang lebih cepat dan relevan untuk performa rendering aplikasi. Selama tata letak, teks harus diteruskan ke framework Android tempat cache kata diisi. Secara default, ini berjalan di thread Ui. Menurunkan tugas pengambilan data terlebih dahulu dan mengisi cache kata ke thread latar belakang dapat mempercepat tata letak, terutama untuk teks yang lebih panjang. Untuk melakukan pengambilan data sebelumnya di thread latar belakang, Anda dapat meneruskan eksekutor kustom ke composable apa pun yang menggunakan BasicText di balik layar dengan meneruskan LocalBackgroundTextMeasurementExecutor ke CompositionLocalProvider seperti ini.

  val defaultTextMeasurementExecutor = Executors.newSingleThreadExecutor()

CompositionLocalProvider(

    LocalBackgroundTextMeasurementExecutor provides DefaultTextMeasurementExecutor

) {

    BasicText("Some text that should be measured on a background thread!")


}

Bergantung pada teksnya, hal ini dapat meningkatkan performa rendering teks Anda. Untuk memastikan bahwa fitur ini meningkatkan performa rendering aplikasi Anda, lakukan tolok ukur dan bandingkan hasilnya.

Pertimbangan performa pekerjaan latar belakang

Pekerjaan Latar Belakang adalah bagian penting dari banyak aplikasi. Anda mungkin menggunakan library seperti WorkManager atau JobScheduler untuk melakukan tugas seperti:

  • Mengupload peristiwa analisis secara berkala
  • Menyinkronkan data antara layanan backend dan database
  • Memproses media (yaitu mengubah ukuran atau mengompresi gambar)

Tantangan utama saat menjalankan tugas-tugas ini adalah menyeimbangkan performa dan efisiensi daya. WorkManager memungkinkan Anda mencapai keseimbangan ini. API ini dirancang agar hemat daya, dan memungkinkan pekerjaan ditunda ke jendela eksekusi yang optimal yang dipengaruhi oleh sejumlah faktor, termasuk batasan yang Anda tentukan atau batasan yang diterapkan oleh sistem. 

Namun, WorkManager bukanlah solusi yang cocok untuk semua. Android juga memiliki sejumlah API yang dioptimalkan untuk daya dan dirancang khusus dengan mempertimbangkan Perjalanan Pengguna Inti (CUJ) umum tertentu.  

Lihat halaman landing Pekerjaan Latar Belakang untuk mengetahui daftar beberapa di antaranya,  termasuk memperbarui widget dan mendapatkan lokasi di latar belakang.

Alat Proses Debug Lokal untuk Tugas Latar Belakang: Skenario Umum

Untuk men-debug Pekerjaan Latar Belakang dan memahami alasan tugas mungkin tertunda atau gagal, Anda memerlukan visibilitas tentang cara sistem telah menjadwalkan tugas Anda. 

Untuk membantu hal ini, WorkManager memiliki beberapa alat terkait untuk membantu Anda men-debug secara lokal dan mengoptimalkan performa (beberapa di antaranya juga berfungsi untuk JobScheduler). Berikut beberapa skenario umum yang mungkin Anda temui saat menggunakan WorkManager, dan penjelasan tentang alat yang dapat Anda gunakan untuk men-debugnya.

Men-debug alasan tugas terjadwal tidak dijalankan

Penundaan atau tidak dijalankannya pekerjaan terjadwal dapat disebabkan oleh sejumlah faktor, termasuk tidak terpenuhinya batasan yang ditentukan atau batasan yang diberlakukan oleh sistem

Langkah pertama dalam menyelidiki alasan pekerjaan terjadwal tidak berjalan adalah dengan mengonfirmasi bahwa pekerjaan telah berhasil dijadwalkan.  Setelah mengonfirmasi status penjadwalan, tentukan apakah ada batasan atau prasyarat yang tidak terpenuhi yang mencegah tugas dijalankan.

Ada beberapa alat untuk men-debug skenario ini.

Background Task Inspector

Background Task Inspector adalah alat canggih yang terintegrasi langsung ke dalam Android Studio. Aplikasi ini memberikan representasi visual dari semua tugas WorkManager dan status terkaitnya (Berjalan, Dalam Antrean, Gagal, Berhasil). 

Untuk men-debug alasan tugas terjadwal tidak dieksekusi dengan Background Task Inspector, lihat status Pekerjaan yang tercantum. Status 'Dalam antrean' menunjukkan bahwa Tugas Anda telah dijadwalkan, tetapi masih menunggu untuk dijalankan.

Manfaat: Selain memberikan cara mudah untuk melihat semua tugas, alat ini sangat berguna jika Anda memiliki pekerjaan berantai. Background Task Inspector menawarkan tampilan grafik yang dapat memvisualisasikan apakah kegagalan tugas sebelumnya dapat memengaruhi eksekusi tugas berikutnya.

image.png

Tampilan daftar Background Task Inspector

image.png

Tampilan grafik Background Task Inspector

adb shell dumpsys jobscheduler

Perintah ini menampilkan daftar semua tugas JobScheduler aktif (yang mencakup Pekerja WorkManager) beserta batasan yang ditentukan, dan batasan yang diterapkan sistem. API ini juga menampilkan histori tugas. 

Gunakan opsi ini jika Anda ingin cara lain untuk melihat tugas terjadwal dan batasan terkait. Untuk WorkManager versi sebelum WorkManager 2.10.0, adb shell dumpsys jobscheduler akan menampilkan daftar Pekerja dengan nama ini:

  [package name]/androidx.work.impl.background.systemjob.SystemJobService

Jika aplikasi Anda memiliki beberapa worker, mengupdate ke WorkManager 2.10.0 akan memungkinkan Anda melihat nama Worker dan membedakan worker dengan mudah:

  #WorkerName#@[package name]/androidx.work.impl.background.systemjob.SystemJobService

Manfaat: Perintah ini berguna untuk memahami apakah ada batasan yang diterapkan sistem, yang tidak dapat Anda tentukan dengan Pemeriksa Tugas Latar Belakang. Misalnya, ini akan menampilkan bucket siaga aplikasi, yang dapat memengaruhi jangka waktu penyelesaian pekerjaan terjadwal.

Aktifkan Logging debug

Anda dapat mengaktifkan logging kustom untuk melihat log WorkManager panjang, yang akan memiliki WM— terlampir. 

Manfaat: Dengan begitu, Anda dapat melihat kapan tugas dijadwalkan, batasan terpenuhi, dan peristiwa siklus proses, serta Anda dapat melihat log ini saat mengembangkan aplikasi.

WorkInfo.StopReason

Jika Anda melihat performa yang tidak dapat diprediksi dengan worker tertentu, Anda dapat mengamati secara terprogram alasan worker Anda dihentikan pada upaya menjalankan sebelumnya dengan WorkInfo.getStopReason

Sebaiknya konfigurasi aplikasi Anda untuk mengamati WorkInfo menggunakan getWorkInfoByIdFlow guna mengidentifikasi apakah tugas Anda terpengaruh oleh pembatasan latar belakang, batasan, seringnya terjadi waktu tunggu, atau bahkan dihentikan oleh pengguna.

Manfaat: Anda dapat menggunakan WorkInfo.StopReason untuk mengumpulkan data kolom tentang performa pekerja Anda.

Men-debug durasi penguncian layar saat aktif yang tinggi yang diatribusikan ke WorkManager dan ditandai oleh Android vitals

Android vitals memiliki metrik penguncian layar saat aktif parsial yang berlebihan, yang menandai penguncian layar saat aktif yang menyebabkan baterai cepat habis. Anda mungkin terkejut mengetahui bahwa WorkManager mendapatkan kunci wake untuk menjalankan tugas, dan jika kunci wake melebihi batas yang ditetapkan oleh Google Play, dapat berdampak pada visibilitas aplikasi Anda. Bagaimana cara men-debug alasan durasi kunci tetap aktif yang begitu lama dikaitkan dengan pekerjaan Anda? Anda dapat menggunakan alat berikut.

Dasbor Android vitals

Pertama, pastikan di dasbor penguncian layar saat aktif berlebihan Android vitals bahwa durasi penguncian layar saat aktif yang tinggi berasal dari WorkManager dan bukan alarm atau penguncian layar saat aktif lainnya. Anda dapat menggunakan dokumentasi Mengidentifikasi kunci aktif yang dibuat oleh API lain untuk memahami kunci aktif mana yang ditahan karena WorkManager. 

Perfetto

Perfetto adalah alat untuk menganalisis rekaman aktivitas sistem. Saat menggunakannya untuk men-debug WorkManager secara khusus, Anda dapat melihat bagian “Status Perangkat” untuk melihat kapan tugas Anda dimulai, berapa lama tugas berjalan, dan bagaimana kontribusinya terhadap konsumsi daya. 

Di bagian “Status Perangkat: Tugas”,  Anda dapat melihat semua pekerja yang telah dieksekusi dan kunci aktif terkait.

deviceState.png

Bagian Status Perangkat di Perfetto, yang menampilkan eksekusi CleanupWorker dan BlurWorker.

Referensi

Lihat halaman Debug WorkManager untuk mengetahui ringkasan metode penelusuran kesalahan yang tersedia untuk skenario lain yang mungkin Anda alami.

Untuk mencoba beberapa metode ini secara langsung dan mempelajari lebih lanjut cara men-debug WorkManager, lihat codelab WorkManager dan Pengujian Lanjutan.

Langkah berikutnya

Hari ini kita telah membahas lebih dari sekadar pengecilan kode dan mempelajari cara Android Runtime dan Jetpack Compose merender aplikasi Anda. Baik itu melakukan prakompilasi jalur penting dengan Profil Dasar atau memperlancar status scroll dengan fitur Compose 1.9 dan 1.10 yang baru, alat ini berfokus pada nuansa aplikasi Anda. Selain itu, kita juga telah mempelajari praktik terbaik dalam men-debug tugas latar belakang.

Tanya Android

Pada hari Jumat, kami akan mengadakan AMA live tentang performa. Ajukan pertanyaan Anda sekarang menggunakan #AskAndroid dan dapatkan jawaban dari para pakar.

Tantangan

Kami menantang Anda pada hari Senin untuk mengaktifkan R8. Hari ini, kami meminta Anda untuk membuat satu Profil Dasar Pengukuran untuk aplikasi Anda.

Dengan Android Studio Otter, wizard modul Generator Profil Dasar Pengukuran mempermudah hal ini. Pilih perjalanan pengguna yang paling penting—bahkan jika hanya startup dan login aplikasi Anda—lalu buat profil.

Setelah Anda memilikinya, jalankan Macrobenchmark untuk membandingkan CompilationMode.None vs. CompilationMode.Partial.

Bagikan peningkatan waktu peluncuran Anda di media sosial menggunakan #optimizationEnabled.

Tonton besok

Anda telah menyusutkan aplikasi dengan R8 dan mengoptimalkan runtime dengan Pengoptimalan yang Dipandu Profil. Namun, bagaimana cara membuktikan kemenangan ini kepada pemangku kepentingan? Lalu, bagaimana cara mendeteksi regresi sebelum mencapai tahap produksi?

Bergabunglah dengan kami besok untuk Hari ke-4: Panduan Penyeimbangan Performa, tempat kami akan memetakan secara persis cara mengukur kesuksesan Anda, mulai dari data lapangan di Vitals Play hingga pelacakan lokal mendalam dengan Perfetto.

Ditulis oleh:

Lanjutkan membaca