Selamat pagi Kami mulai Senin dengan materi, terjemahan yang disiapkan khusus untuk siswa kursus
"Android-developer. Kursus Lanjutan .
"
Baru-baru ini saya memigrasi basis kode Android ke
Kure di AndroidX. Tampak bagi saya bahwa ini adalah kesempatan besar untuk bekerja pada kecepatan perakitan proyek. Gradle selalu memiliki reputasi buruk karena kelambatan dan konsumsi sumber daya, tetapi saya sangat terkejut bahwa perubahan kecil pada konfigurasi perakitan dapat meningkatkan kecepatannya secara signifikan.
Lihatlah metrik pemindaian perakitan sebelum / setelah optimisasi
sebelum optimasi
setelah optimasi ️️Menurun dari 5,5 menit menjadi
17 detik ?? Gila!Tidak terlalu sulit untuk melakukan optimasi secara berlebihan untuk mengurangi waktu perakitan. Tetapi untuk membuat pos tersebut dapat dipahami oleh para pemula, saya akan dengan sengaja fokus pada langkah-langkah kecil dan tidak menyakitkan yang telah saya ambil untuk lebih dekat dengan indikator ini.
Pertama-tama!
Sebelum Anda memulai optimasi, penting untuk menguji proyek kami untuk mengetahui berapa lama waktu yang dibutuhkan untuk membangunnya. Gradle memiliki opsi pemindaian yang mudah digunakan yang dapat Anda gunakan untuk menganalisis kinerja tugas Anda. Buka terminal di Android Studio dan jalankan perintah berikut:
./gradlew assembleDebug --scan
Setelah berhasil menyelesaikan perakitan, Anda akan diminta untuk menerima persyaratan layanan untuk mengunduh hasil pemindaian. Masukkan
ya untuk melanjutkan. Setelah publikasi selesai, Anda akan menerima tautan ke terminal untuk memeriksa pemindaian. Buka itu.
Ada beberapa opsi di situs ini, tetapi untuk singkatnya kami hanya akan mempertimbangkan apa yang paling penting.Ringkasan menampilkan informasi ringkasan tentang tugas yang diselesaikan dan waktu penyelesaiannya. Tetapi yang menarik bagi kami di sini adalah bagian
Kinerja . Itu rincian lebih rinci dari total waktu membangun, seperti yang ditunjukkan di bawah ini.

Di bagian Kinerja, ada tab
Pengaturan dan saran yang memberikan rekomendasi untuk meningkatkan kecepatan build. Mari lihat mereka.

Di bagian ini, kita dapat menemukan beberapa perbaikan sederhana untuk meningkatkan kecepatan. Jadi, mari kita lanjutkan dan terapkan koreksi ini di proyek kami.
Langkah # 1: Tingkatkan Alat
Tim Android terus meningkatkan dan mengembangkan sistem pembangunan. Dengan demikian, dalam kebanyakan kasus, Anda bisa mendapatkan peningkatan yang signifikan dengan hanya menginstal versi terbaru dari toolkit ini.
Selama refactoring ini, proyek kami berada pada
versi 3.2.1 dari plugin Gradle untuk Android Studio (
beberapa versi lebih tua dari rilis terakhir ).
Anda dapat mengikuti
tautan ini untuk mendapatkan versi terbaru dari Plugin Gradle. Pada saat penulisan ini, yang terbaru adalah
versi 3.4.0.Tapi ada tangkapan di sini yang harus kita ingat:
( Catatan: Saat menggunakan Gradle versi 5.0 atau lebih tinggi, ukuran default daemon Gradle berkurang dari 1 GB menjadi 512 MB. Ini dapat menyebabkan kinerja pembangunan yang buruk. Untuk mengganti pengaturan default ini, tentukan ukuran memori untuk daemon Gradle di gradle.properties proyek Anda.)https://developer.android.com/studio/releases/gradle-pluginSaat menggunakan Gradle 5.0 dan di atasnya, kita perlu meningkatkan ukuran memori secara eksplisit agar kecepatan build kita tidak memburuk. Kami akan kembali ke sini sebentar lagi.Buka file
build.gradle tingkat
atas , yang akan Anda temukan di root proyek Anda, dan tambahkan baris berikut ke
bagian dependensi :
classpath 'com.android.tools.build:gradle:3.4.0'
Anda juga perlu memperbarui
URL distribusi di file properti Gradle Wrapper yang terletak di
gradle/wrapper/gradle-wrapper.properties
. Perbarui URL sebagai berikut.
(
Tautan ini akan tersedia di halaman plugin Android Gradle . )
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
Anda akan menemukan kesalahan saat menggunakan Kotlin jika versi plugin Kotlin Gradle kurang dari
1.3.0. Jika demikian, gunakan tooltip IDE untuk memperbarui plugin Gradle untuk Kotlin ke versi terbaru (pada saat penulisan ini, ini adalah
versi 1.3.31 ).
Ok, mari kita jalankan build lagi dari terminal untuk melihat apakah kita telah melakukan perbaikan.

Langkah # 2: Perbarui Konfigurasi
Jadi, kami dapat memotong sekitar 2,5 menit dari waktu pembuatan, tetapi ini masih belum cukup baik. Setelah mempelajari build log di terminal, saya menemukan satu baris yang menarik bagi kami:
(> Tugas: aplikasi: compileDevelopDebugJavawithJavac
Gradle dapat menonaktifkan kompilasi inkremental karena prosesor anotasi berikut tidak inkremental: butterknife-compiler-10.1.0.jar (com.jakewharton: butterknife-compiler: 10.1.0), dagger-compiler-2.9.jar (com.google. belati: belati-kompiler: 2.9).
Pertimbangkan untuk menyetel flag android.enableSeparateAnnotationProcessing-true eksperimental dalam file gradle.properties untuk memulai pemrosesan anotasi dalam tugas yang terpisah dan melakukan kompilasi tambahan.)Kompilasi tambahan pada dasarnya mencegah kompilasi boros dari seluruh set file sumber dan sebaliknya hanya mengkompilasi file-file yang telah dimodifikasi. Dari log jelas bahwa kita tidak menggunakan fungsi ini. Dia menyarankan agar kita menggunakan
android.enableSeparateAnnotationProcessing=true
, tetapi, dalam hal apa pun, kita tidak boleh menggunakan konfigurasi
“annotationProcessor” karena Kotlin digunakan dalam proyek kami.
Untungnya,
versi 1.3.30 Kotlin menambahkan dukungan untuk pemrosesan anotasi langkah-demi-langkah.
https://kotlinlang.org/docs/reference/kapt.html(Pemrosesan anotasi tambahan (mulai 1.3.30)
Dimulai dengan versi 1.3.30,
kapt
mendukung pemrosesan anotasi tambahan sebagai fungsi eksperimental. Saat ini, pemrosesan anotasi dapat dilakukan secara bertahap hanya jika semua prosesor anotasi yang digunakan bersifat inkremental.
Untuk mengaktifkan pemrosesan anotasi tambahan, tambahkan baris ini ke file
gradle.properties
:
kapt.incremental.apt=true
Perhatikan bahwa pemrosesan anotasi tambahan mengharuskan
kompilasi tambahan juga diaktifkan.)
Jadi, mari kita mulai:
- 1. Ubah konfigurasi AnnotationProcessor ke kapt
- 2. Aktifkan flag pemrosesan anotasi inkremental eksperimental
Buka file
build.gradle
modul Anda dan tambahkan baris berikut ke bagian atas file:
apply plugin: 'kotlin-kapt'
Kemudian, ubah semua konfigurasi anotasiProcessor di bagian dependensi untuk menggunakan kapt. Sebagai contoh:
//
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
//
kapt 'com.google.dagger:dagger-compiler:2.9'
Sekarang buka file
gradle.properties yang terletak di root proyek Anda dan tambahkan baris berikut:
kapt.incremental.apt=true
Mari kita jalankan build lagi.

Yah, sepertinya kami telah membuat beberapa kemajuan.
Langkah # 3: Gradle Properties
Kami berada pada tahap terakhir. Ingat trik yang kami temui saat memperbarui versi plugin Gradle? Ternyata versi Gradle yang lebih baru mengurangi ukuran memori yang digunakan menjadi 512 MB. Ini untuk memastikan bahwa mesin yang lemah tidak mengkonsumsi terlalu banyak memori. Saya memiliki komputer dengan 16 gigabytes RAM, jadi saya dapat memberi makan sekitar 2-3 gigs ke daemon Gradle, tetapi angka Anda dapat bervariasi.
Buka file
gradle.properties yang terletak di root proyek Anda dan tambahkan baris berikut. Pastikan untuk memilih ukuran yang sesuai dengan kebutuhan dan spesifikasi komputer Anda.
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Sementara kita melakukan ini, mari kita juga mengaktifkan majelis paralel dan penyetelan sesuai permintaan di properti.
Ini adalah versi final file
gradle.properties
:
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true kapt.incremental.apt=true
org.gradle.parallel
- flag ini memungkinkan Gradle untuk merakit modul dalam suatu proyek secara paralel, bukan secara berurutan. Ini hanya berguna untuk proyek multi-modul.org.gradle.configureondemand
- flag ini hanya mengonfigurasi modul-modul yang diperlukan untuk proyek, dan tidak mengumpulkan semuanya.
Setelah melakukan ini, mari kita lihat apa yang sekarang kita miliki indikator kecepatan perakitan:


Itu dia!
Pengamatan penutup
Ini tidak berarti cakupan yang luas dari semua cara untuk mengoptimalkan kecepatan perakitan. Ada banyak hal lain yang belum saya bahas dalam posting ini, seperti menggunakan minSdk 21 saat menggunakan MultiDex, pustaka pra-pengindeksan, menonaktifkan kompresi PNG, dll., Hanyalah beberapa di antaranya.
Tetapi sebagian besar konfigurasi ini membutuhkan pemahaman yang lebih dalam tentang sistem build Android dan pengalaman bekerja dengan proyek multi-modul besar (di mana manfaatnya paling jelas). Langkah-langkah yang saya sebutkan di atas mudah diterapkan bahkan oleh pengembang junior dan memiliki manfaat yang signifikan. Saya harap ini membantu Anda meningkatkan kecepatan build!
Sampai jumpa lagi, damai sejahtera untukmu!