Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Taming a Large Android Project

Taming a Large Android Project

Dicoding Indonesia

March 18, 2023
Tweet

More Decks by Dicoding Indonesia

Other Decks in Programming

Transcript

  1. Taming a Large Android Project
    Esa Firman | Software Engineer - Web Platform

    View Slide

  2. 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.

    View Slide

  3. Agenda
    ● Projek Android yang besar?
    ● Kenapa hal ini penting?
    ● Mempersingkat waktu development
    ● Pemeliharaan dan pembenahan
    ● Selanjutnya apa?

    View Slide

  4. 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

    View Slide

  5. 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

    View Slide

  6. View Slide

  7. View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. Mempersingkat Waktu Development

    View Slide

  11. 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

    View Slide

  12. View Slide

  13. Tips Performa pada Software
    ● Jangan dilakukan
    ● Lakukan nanti/lain waktu
    ● Lakukan lebih cepat (mengacu pada O notation)

    View Slide

  14. Build Configuration
    ● Aktifkan fitur build cache pada Gradle
    ● Non-aktifkan build features Android secara default
    ● Migrasi ke non-transitive R
    org.gradle.caching=true
    android.defaults.buildfeatures.buildconfig=false
    android.defaults.buildfeatures.resvalues=false
    android.defaults.buildfeatures.aidl=false

    android.nonTransitiveRClass=true

    View Slide

  15. Build Configuration (cont’d)
    ● Update tooling (AGP, KGP, Gradle)
    ● Non-aktifkan jetifier
    ○ checkJetifier pada AGP versi baru
    ○ android.enableJetifier=false

    View Slide

  16. 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

    View Slide

  17. Modularisasi
    ● Gunakan api & impl pattern
    ● Grup berdasarkan fitur dan layer

    View Slide

  18. View Slide

  19. 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

    View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. Selective Run
    ● Menjalankan eksekusi seperlunya pada modul yang berubah dan
    atau berhubungan
    ● Mengurangi waktu eksekusi pada CI pipeline, contohnya pada
    test & lint

    View Slide

  25. View Slide

  26. 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

    View Slide

  27. Notify Code Owners

    View Slide

  28. Pemeliharaan dan Pembenahan

    View Slide

  29. Gradle Enterprise
    ● Melihat tren waktu kompilasi
    ● Identifikasi masalah pada kompilasi
    ● Identifikasi kompilasi lambat

    View Slide

  30. View Slide

  31. 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

    View Slide

  32. View Slide

  33. View Slide

  34. Task Duration Analysis

    View Slide

  35. Cleaning Service
    ● Menghapus resources yang tidak terpakai secara otomatis
    ● ./gradlew :cleaningService

    View Slide

  36. 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

    View Slide

  37. Selanjutnya Apa?
    ● Mini workspace
    ● Configuration cache
    ● IDE plugin
    ● Hot reload (??)

    View Slide

  38. Terima Kasih
    #PastiAdaJalan
    Contact:
    Github/Telegram @esafirm
    Website nolambda.stream

    View Slide