Kurangi waktu pembangunan proyek Android Anda

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-plugin

Saat 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. 1. Ubah konfigurasi AnnotationProcessor ke kapt
  2. 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!

Source: https://habr.com/ru/post/id457374/


All Articles