Halo! Esa adalah seorang software engineer yang fokus utamanya adalah pengemabangan aplikasi Android dan memiliki pengalaman lebih dari 10 tahun di bidang tersebut. Saat ini, ia bekerja di Gojek pada tim Developer Experience, mengurus proses development dan memastikan para developer memiliki pengalaman yang menyenangkan saat mengembangkan aplikasi.
Proyek Android yang besar? ● ~2,5 juta baris kode ● ~1.7 juta diantaranya adalah Kotlin ● Belum termasuk generated code, scripts, dan juga build system ● 300+ modul ● 700+ dependencies pada compile classpath
Proyek Android yang besar? ● ~2,5 juta baris kode ● ~1.7 juta diantaranya adalah Kotlin ● Belum termasuk generated code, scripts, dan juga build system ● 300+ modul ● 700+ dependencies pada compile classpath ● Build time median ~30s ● Build time p95 ~6m
Kenapa hal ini penting? ● Menambah produktifitas developer ● Mengurangi biaya development dan maintenance ● Proses development yang lambat adalah tech debt dengan ROI (return of investment) yang instan
Kenapa hal ini penting? ● Menambah produktifitas developer ● Mengurangi biaya development dan maintenance ● Proses development yang lambat adalah tech debt dengan ROI (return of investment) yang instan
Gradle Refresher ● Initialization time: Evaluasi pada settings.gradle ● Configuration time: Evaluasi pada build.gradle pada setiap modul. Konfigurasi dan task graph dibuat ● Execution time: Eksekusi tasks yang ingin dijalak
Mencari Setelan Konfigurasi Memori ● Menghindari waktu GC yang berlebih ● Kotlin dan Gradle dapat memiliki konfigurasi yang berbeda org.gradle.jvmargs=-Xmx6g -XX:MaxMetaspaceSize=1g kotlin.daemon.jvmargs=-Xmx3g
Prebuilt Artifact ● Menggunakan kode yang sudah dikompilasi sebelumya dalam bentuk artifact (AAR/JAR) untuk mempersingkat waktu iterasi ● Mengurangi configuration dan execution time ● Meningkatkan performa IDE ● Menggunakan properties file untuk konfigurasi
Selective Run ● Menjalankan eksekusi seperlunya pada modul yang berubah dan atau berhubungan ● Mengurangi waktu eksekusi pada CI pipeline, contohnya pada test & lint
Plugins! ● Android cache fix plugin: mengatasi masalah seputar cache tanpa harus menunggu versi baru dari AGP ● Gradle test retry plugin: mengatasi flaky test dengan mengulang test yang bermasalah ● Affected module detector plugin: eksekusi task pada modul yang berubah dan berhubungan dengan itu ● Gradle doctor plugin: mendiagnosa konfigurasi build
Codebase Analysis Pipeline ● Menghitung besar modul ● Menghitung besar dead code pada modul ● Menganalisa dependencies dan plugin yang tidak terpakai ● Menganalisa modul yang bisa disederhanakan (pure JVM) ● Scoring sistem untuk module https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin
Rangkuman ● Mempersingkat waktu development mempunyai ROI yang instan dengan dampak di berbagai area ● Sama seperti software lainnya, devtools juga memerlukan optimasi dan arsitektur yang tepat untuk dapat scale up ● Automasi dapat mempermudah pemeliharaan dan pembenahan projek ● Hindari optimasi prematur. YMMV