Plugin Android Gradle 3.0.0 (Oktober 2017)

Plugin Android Gradle 3.0.0 mencakup berbagai perubahan yang ditujukan untuk mengatasi masalah performa pada project berskala besar.

Misalnya, pada project sample skeleton dengan ~130 modul dan sejumlah besar dependensi eksternal (tetapi tanpa kode atau resource), Anda dapat menikmati peningkatan performa yang serupa dengan berikut ini:

Versi plugin Android + versi Gradle Plugin Android 2.2.0 + Gradle 2.14.1 Plugin Android 2.3.0 + Gradle 3.3 Plugin Android 3.0.0 + Gradle 4.1
Konfigurasi (misalnya, menjalankan ./gradlew --help ) ~2 mnt ~9 d ~2,5 d
Perubahan Java 1-line (perubahan implementasi) ~2 mnt 15 d ~29 d ~6,4 d

Beberapa perubahan ini merusak build yang ada. Jadi, sebaiknya pertimbangkan untuk
memigrasikan project Anda sebelum menggunakan plugin baru ini.

Jika tidak merasakan peningkatan performa seperti yang dijelaskan di atas, laporkan bug dan sertakan rekaman aktivitas build menggunakan Gradle Profiler.

Versi plugin Android ini perlu beberapa hal berikut:

  • Gradle 4.1 atau yang lebih tinggi. Untuk mempelajari lebih lanjut, baca bagian tentang mengupdate Gradle.
  • Build Tools 26.0.2 atau yang lebih tinggi. Dengan update ini, Anda tidak perlu lagi menentukan versi untuk build tools—plugin menggunakan versi minimum yang diperlukan secara default. Jadi, sekarang Anda dapat menghapus properti android.buildToolsVersion.

3.0.1 (November 2017)

Ini merupakan update minor untuk Android Studio 3.0.1, dan menyertakan perbaikan bug umum dan peningkatan performa.

Pengoptimalan

  • Paralelisme yang lebih baik untuk project multi-modul melalui grafik tugas yang mendetail.
  • Saat membuat perubahan pada dependensi, Gradle melakukan build yang lebih cepat dengan tidak mengompilasi ulang modul yang tidak memiliki akses ke API dependensi tersebut. Anda harus membatasi dependensi mana yang membocorkan API-nya ke modul lain dengan menggunakan konfigurasi dependensi baru Gradle: implementation, api, compileOnly, dan runtimeOnly.
  • Peningkatan kecepatan build inkremental karena dexing per class. Setiap class sekarang dikompilasi ke dalam beberapa file DEX terpisah, dan hanya class yang dimodifikasi yang akan mengalami dexing ulang. Kecepatan build juga akan meningkat untuk aplikasi yang menetapkan minSdkVersion ke 20 atau yang lebih rendah, dan menggunakan multi-dex lama.
  • Peningkatan kecepatan build dengan mengoptimalkan penggunaan output yang di-cache untuk tugas-tugas tertentu. Untuk mendapatkan manfaat dari pengoptimalan ini, Anda perlu mengaktifkan cache build Gradle terlebih dahulu.
  • Peningkatan pemrosesan resource inkremental menggunakan AAPT2, yang kini diaktifkan secara default. Jika mengalami masalah saat menggunakan AAPT2, silakan laporkan bug. Anda juga dapat menonaktifkan AAPT2 dengan menetapkan android.enableAapt2=false dalam file gradle.properties dan memulai ulang daemon Gradle dengan menjalankan ./gradlew --stop dari command line.

Fitur baru

  • Pengelolaan dependensi berdasarkan varian. Saat membuat varian modul tertentu, plugin akan otomatis mencocokkan varian dependensi modul library lokal dengan varian modul yang Anda build.
  • Menyertakan plugin modul Feature baru untuk mendukung Android Instant Apps dan Android Instant Apps SDK (yang dapat Anda download menggunakan SDK Manager). Untuk mempelajari lebih lanjut cara membuat modul Feature dengan plugin baru ini, baca Struktur aplikasi instan dengan multi-fitur.
  • Dukungan bawaan untuk menggunakan fitur bahasa Java 8 dan library Java 8 tertentu. Jack sekarang sudah tidak lagi digunakan dan diperlukan, dan Anda harus menonaktifkan Jack terlebih dahulu untuk menggunakan dukungan Java 8 yang telah diperbaiki dan tertanam dalam toolchain default. Untuk mengetahui informasi selengkapnya, baca Menggunakan fitur bahasa Java 8.
  • Menambahkan dukungan untuk menjalankan pengujian dengan Android Test Orchestrator, yang memungkinkan Anda menjalankan setiap pengujian aplikasi pada pemanggilan Instrumentation-nya sendiri. Karena setiap pengujian menjalankan instance Instrumentation-nya sendiri, status apa pun yang dibagikan antara pengujian tidak terakumulasi pada CPU atau memori perangkat Anda. Dan, meskipun satu pengujian mengalami error, hanya instance Instrumentation-nya yang akan dikeluarkan, sehingga pengujian lainnya akan tetap berjalan.

    • Menambahkan testOptions.execution untuk menentukan apakah akan menggunakan orkestrasi pengujian di perangkat atau tidak. Jika ingin menggunakan Android Test Orchestrator, Anda perlu menentukan ANDROID_TEST_ORCHESTRATOR, seperti ditunjukkan di bawah ini. Secara default, properti ini ditetapkan ke HOST, yang menonaktifkan orkestrasi di perangkat dan merupakan metode standar untuk menjalankan pengujian.

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • Konfigurasi dependensi androidTestUtil yang baru memungkinkan Anda menginstal APK helper pengujian lain sebelum menjalankan uji instrumentasi, seperti Android Test Orchestrator:

    Groovy

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • Menambahkan testOptions.unitTests.includeAndroidResources untuk mendukung pengujian unit yang memerlukan resource Android, seperti Roboelectric. Jika Anda menetapkan properti ini ke true, plugin akan melakukan penggabungan resource, aset, dan manifes sebelum menjalankan pengujian unit. Pengujian Anda selanjutnya dapat memeriksa com/android/tools/test_config.properties pada classpath untuk kunci berikut:

    • android_merged_assets: jalur absolut ke direktori aset gabungan.

      Catatan: Untuk modul library, aset gabungan tidak memuat aset dependensi (lihat masalah #65550419).

    • android_merged_manifest: jalur absolut ke file manifes gabungan.

    • android_merged_resources: jalur absolut ke direktori resource gabungan, yang memuat semua resource dari modul ini dan semua dependensinya.

    • android_custom_package: nama paket class R akhir. Jika Anda mengubah ID aplikasi secara dinamis, nama paket ini mungkin tidak cocok dengan atribut package dalam manifes aplikasi.

  • Dukungan untuk font sebagai resource (yang merupakan fitur baru yang diperkenalkan di Android 8.0 (API level 26)).
  • Dukungan untuk APK khusus bahasa dengan Android Instant Apps SDK 1.1 dan yang lebih baru.
  • Sekarang Anda dapat mengubah direktori output untuk project build native eksternal Anda, seperti yang ditunjukkan di bawah:

    Groovy

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • Sekarang Anda dapat menggunakan CMake 3.7 atau yang lebih baru saat mem-build project native dari Android Studio.
  • Konfigurasi dependensi lintChecks baru memungkinkan Anda membuat JAR yang menentukan aturan lint kustom, dan memaketkannya ke dalam project AAR dan APK Anda.

    Aturan lint kustom Anda harus termasuk dalam project terpisah yang meng-output JAR tunggal dan hanya mencakup dependensi compileOnly. Modul aplikasi dan library lainnya selanjutnya dapat bergantung pada project lint Anda menggunakan konfigurasi lintChecks:

    Groovy

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

Perubahan perilaku

  • Plugin Android 3.0.0 menghapus API tertentu, dan build Anda akan rusak jika menggunakan API tersebut. Misalnya, Anda tidak dapat lagi menggunakan Variants API untuk mengakses objek outputFile() atau menggunakan processManifest.manifestOutputFile() untuk mendapatkan file manifes untuk setiap varian. Untuk mempelajari lebih lanjut, baca Perubahan API.
  • Anda tidak perlu lagi menentukan versi untuk build tools (jadi, sekarang Anda dapat menghapus properti android.buildToolsVersion). Secara default, plugin otomatis menggunakan versi build tools minimum yang diperlukan untuk versi plugin Android yang Anda gunakan.
  • Sekarang Anda mengaktifkan/menonaktifkan pemrosesan PNG dalam blok buildTypes, seperti ditunjukkan di bawah. Pemrosesan PNG diaktifkan secara default untuk semua build kecuali build debug karena build tersebut meningkatkan waktu build untuk project yang mencantumkan banyak file PNG. Jadi, guna meningkatkan waktu build untuk jenis build yang lain, sebaiknya Anda menonaktifkan pemrosesan PNG atau mengonversi gambar menjadi WebP.

    Groovy

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • Plugin Android sekarang otomatis membuat target yang dieksekusi yang Anda konfigurasi di project CMake eksternal.
  • Sekarang Anda harus menambahkan pemroses anotasi ke classpath pemroses menggunakan konfigurasi dependensi annotationProcessor.
  • Penggunaan ndkCompile yang telah dihentikan kini semakin dibatasi. Sebagai gantinya, beralihlah ke CMake atau ndk-build untuk mengompilasi kode native yang ingin Anda kemas ke dalam APK. Untuk mempelajari lebih lanjut, baca Bermigrasi dari ndkcompile.