Plugin Android Gradle 4.0.0 (April 2020)

Versi plugin Android ini perlu beberapa hal berikut:

4.0.1 (Juli 2020)

Update minor ini mendukung kompatibilitas dengan setelan default baru dan fitur untuk visibilitas paket di Android 11.

Pada versi Android sebelumnya, daftar semua aplikasi yang diinstal pada perangkat dapat dilihat. Mulai Android 11 (API level 30), secara default aplikasi memiliki akses hanya ke daftar paket yang diinstal yang sudah difilter. Untuk melihat daftar aplikasi yang lebih luas pada sistem, kini Anda harus menambahkan elemen <queries> dalam manifes Android aplikasi atau library.

Plugin Android Gradle 4.1+ sudah kompatibel dengan deklarasi <queries> yang baru; namun, versi yang lebih lama tidak kompatibel. Jika Anda menambahkan elemen <queries> atau jika Anda mulai mengandalkan library atau SDK yang mendukung penargetan Android 11, Anda mungkin mengalami penggabungan manifes yang error saat mem-build aplikasi.

Untuk mengatasi masalah ini, kami merilis serangkaian patch untuk AGP 3.3 dan yang lebih baru. Jika Anda menggunakan versi AGP yang lebih lama, upgrade ke salah satu versi berikut:

Versi minimum Versi default Catatan
Gradle 6.1.1 6.1.1 Untuk mempelajari lebih lanjut, lihat mengupdate Gradle.
SDK Build Tools 29.0.2 29.0.2 Instal atau konfigurasi SDK Build Tools.

Untuk informasi selengkapnya tentang fitur baru ini, lihat Visibilitas paket di Android 11.

Fitur baru

Versi plugin Android Gradle ini menyertakan fitur baru berikut.

Dukungan untuk Build Analyzer Android Studio

Jendela Build Analyzer membantu Anda memahami dan mendiagnosis masalah pada proses build, misalnya pengoptimalan yang dinonaktifkan dan tugas yang tidak dikonfigurasi dengan benar. Fitur ini tersedia saat Anda menggunakan Android Studio 4.0 dan yang lebih tinggi dengan plugin Android Gradle 4.0.0 dan yang lebih tinggi. Anda dapat membuka jendela Build Analyzer dari Android Studio dengan cara berikut:

  1. Jika belum melakukannya, build aplikasi dengan memilih Build > Make Project dari panel menu.
  2. Pilih View > Tool Windows > Build dari panel menu.
  3. Pada jendela Build, buka jendela Build Analyzer dengan salah satu cara berikut:
    • Setelah Android Studio selesai mem-build project Anda, klik tab Build Analyzer.
    • Setelah Android Studio selesai mem-build project Anda, klik link di sebelah kanan jendela Build Output.

Jendela Build Analyzer mengatur masalah build yang mungkin muncul di hierarki di sebelah kiri. Anda dapat memeriksa dan mengklik setiap masalah untuk mengetahui detailnya di panel sebelah kanan. Saat menganalisis build Anda, Android Studio menghitung kumpulan tugas yang menentukan durasi build dan memberikan visualisasi untuk membantu Anda memahami dampak dari setiap tugas tersebut. Anda juga bisa mendapatkan detail tentang peringatan dengan meluaskan node Warnings.

Untuk mempelajari lebih lanjut, baca mengidentifikasi regresi kecepatan build.

Desugaring library Java 8 dalam D8 dan R8

Plugin Android Gradle kini menyertakan dukungan untuk menggunakan sejumlah API bahasa Java 8 tanpa memerlukan API level minimum untuk aplikasi Anda.

Melalui proses yang disebut desugaring, compiler DEX, D8, di Android Studio 3.0 dan yang lebih tinggi telah memberikan dukungan besar untuk fitur bahasa Java 8 (seperti ekspresi lambda, metode antarmuka default, coba dengan resource, dan banyak lagi). Di Android Studio 4.0, mesin desugaring telah diperluas untuk dapat melakukan desugaring API bahasa Java. Artinya, Anda kini dapat menyertakan API bahasa standar yang hanya tersedia di rilis Android terbaru (seperti java.util.streams) di aplikasi yang mendukung versi Android yang lebih lama.

Kumpulan API berikut ini didukung dalam rilis ini:

  • Aliran berurutan (java.util.stream)
  • Subset java.time
  • java.util.function
  • Penambahan terbaru pada java.util.{Map,Collection,Comparator}
  • Opsional (java.util.Optional, java.util.OptionalInt, dan java.util.OptionalDouble) serta beberapa class baru lainnya yang berguna dengan API di atas
  • Beberapa tambahan pada java.util.concurrent.atomic (metode baru pada AtomicInteger, AtomicLong, dan AtomicReference)
  • ConcurrentHashMap (dengan perbaikan bug untuk Android 5.0)

Untuk mendukung API bahasa ini, D8 mengompilasi file DEX terpisah yang berisi implementasi API yang tidak ada dan menyertakannya di aplikasi Anda. Proses desugaring akan menulis ulang kode aplikasi untuk menggunakan library ini pada runtime.

Guna mengaktifkan dukungan untuk API bahasa ini, sertakan hal berikut dalam file build.gradle modul aplikasi Anda:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4' }

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled = true
  }

compileOptions { // Flag to enable support for the new language APIs isCoreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4") }

Perhatikan bahwa Anda mungkin juga perlu menyertakan cuplikan kode di atas dalam file build.gradle modul library jika

  • Uji instrumentasi modul library menggunakan API bahasa ini (baik secara langsung, melalui modul library, maupun dependensinya). Hal ini dilakukan agar API yang tidak ada disediakan untuk APK uji instrumentasi Anda.

  • Anda ingin menjalankan lint di modul library secara terpisah. Hal ini untuk membantu lint mengenali penggunaan valid dari API bahasa dan menghindari pelaporan peringatan palsu.

Opsi baru untuk mengaktifkan atau menonaktifkan fitur build

Plugin Android Gradle 4.0.0 memperkenalkan cara baru untuk mengontrol fitur build mana yang ingin Anda aktifkan dan nonaktifkan, misalnya View Binding dan Data Binding. Jika fitur baru ditambahkan, fitur tersebut akan dinonaktifkan secara default. Nantinya Anda dapat menggunakan blok buildFeatures untuk mengaktifkan fitur yang diinginkan saja, dan ini membantu Anda mengoptimalkan performa build untuk project Anda. Anda dapat menetapkan opsi untuk setiap modul dalam file build.gradle level modul, seperti berikut:

android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}
android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}

Anda juga dapat menentukan setelan default untuk fitur ini di seluruh modul dalam sebuah project dengan menyertakan satu atau beberapa dari yang berikut di file gradle.properties project, seperti yang ditampilkan di bawah ini. Perlu diingat bahwa Anda masih dapat menggunakan blok buildFeatures di file build.gradle level modul untuk mengganti setelan default tingkat project ini.

android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true

Dependensi fitur pada fitur

Pada plugin Android Gradle versi sebelumnya, semua modul fitur hanya dapat bergantung pada modul dasar aplikasi. Jika menggunakan plugin Android Gradle 4.0.0, kini Anda dapat menyertakan modul fitur yang bergantung pada modul fitur lainnya. Yaitu, fitur :video dapat bergantung pada fitur :camera, yang bergantung pada modul dasar, seperti yang ditunjukkan pada gambar di bawah.

Dependensi fitur pada fitur

Modul fitur :video bergantung pada fitur :camera, yang bergantung pada modul :app dasar.

Artinya, saat aplikasi Anda meminta untuk mendownload modul fitur, aplikasi juga mendownload modul fitur lain yang menjadi tempatnya bergantung. Setelah membuat modul fitur untuk aplikasi, Anda dapat mendeklarasikan dependensi fitur pada fitur dalam file build.gradle modul. Misalnya, modul :video mendeklarasikan dependensi pada :camera seperti berikut:

// In the build.gradle file of the ':video' module.
dependencies {
  // All feature modules must declare a dependency
  // on the base module.
  implementation project(':app')
  // Declares that this module also depends on the 'camera'
  // feature module.
  implementation project(':camera')
  ...
}
// In the build.gradle file of the ':video' module.
dependencies {
    // All feature modules must declare a dependency
    // on the base module.
    implementation(project(":app"))
    // Declares that this module also depends on the 'camera'
    // feature module.
    implementation(project(":camera"))
    ...
}

Selain itu, Anda harus mengaktifkan fitur dependensi fitur pada fitur di Android Studio (untuk mendukung fitur saat mengedit konfigurasi Run, misalnya ) dengan mengklik Help > Edit Custom VM Options dari panel menu dan menyertakan yang berikut:

-Drundebug.feature.on.feature=true

Metadata dependensi

Saat mem-build aplikasi menggunakan plugin Android Gradle 4.0.0 dan yang lebih tinggi, plugin akan menyertakan metadata yang menjelaskan dependensi yang dikompilasi ke dalam aplikasi Anda. Saat mengupload aplikasi, Konsol Play akan memeriksa metadata ini untuk memberikan manfaat berikut kepada Anda:

  • Mendapatkan pemberitahuan untuk masalah umum terkait SDK dan dependensi yang digunakan aplikasi Anda
  • Menerima masukan yang dapat ditindaklanjuti untuk menyelesaikan masalah tersebut

Data dikompresi, dienkripsi oleh kunci penandatanganan Google Play, dan disimpan di blok penandatanganan aplikasi rilis Anda. Namun, Anda sendiri dapat memeriksa metadata dalam file build perantara lokal di direktori berikut: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt.

Jika tidak ingin membagikan informasi ini, Anda dapat memilih tidak ikut dengan menyertakan hal berikut ini dalam file build.gradle modul Anda:

android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}
android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}

Mengimpor library native dari dependensi AAR

Anda kini dapat mengimpor library C/C++ dari dependensi AAR aplikasi Anda. Setelah Anda mengikuti langkah-langkah konfigurasi yang dijelaskan di bawah, Gradle otomatis membuat library native ini tersedia untuk digunakan dengan sistem build native eksternal Anda, seperti CMake. Ingat bahwa Gradle hanya membuat library ini tersedia untuk build Anda; Anda tetap harus mengonfigurasi skrip build untuk menggunakannya.

Library diekspor menggunakan format paket Prefab.

Setiap dependensi dapat mengekspos maksimal satu paket Prefab, yang terdiri dari satu atau beberapa modul. Modul Prefab adalah library tunggal, yang dapat berupa library bersama, statis, atau hanya header.

Biasanya, nama paket cocok dengan nama artefak Maven dan nama modul cocok dengan nama library, tetapi ini tidak selalu benar. Karena Anda perlu mengetahui nama paket dan modul library, Anda mungkin perlu membaca dokumentasi dependensi untuk menentukan nama-nama tersebut.

Mengonfigurasi sistem build native eksternal

Untuk melihat langkah-langkah yang perlu Anda ikuti, ikuti langkah-langkah di bawah ini untuk sistem build native eksternal yang akan Anda gunakan.

Setiap dependensi AAR aplikasi Anda yang menyertakan kode native akan mengekspos file Android.mk yang Anda perlukan untuk mengimpor ke project ndk-build. Anda mengimpor file ini menggunakan perintah import&endash;module, yang menelusuri jalur yang Anda tentukan menggunakan properti import&endash;add&endash;path dalam project ndk-build Anda. Misalnya , jika aplikasi Anda menentukan libapp.so dan menggunakan curl, Anda harus menyertakan yang berikut ini dalam file Android.mk:

  1. Untuk CMake:

    add_library(app SHARED app.cpp)

    # Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

  2. Untuk ndk-build:

    include $(CLEAR_VARS)
    LOCAL_MODULE := libapp
    LOCAL_SRC_FILES := app.cpp
    # Link libcurl from the curl AAR.
    LOCAL_SHARED_LIBRARIES := curl
    include $(BUILD_SHARED_LIBRARY)

    # If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif

    # Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)

Dependensi native yang disertakan dalam AAR diekspos ke project CMake Anda melalui variabel CMAKE_FIND_ROOT_PATH{: .external}. Nilai ini akan disetel otomatis oleh Gradle saat CMake dipanggil, jadi jika sistem build Anda memodifikasi variabel ini, pastikan untuk menambahkan, bukan menetapkannya.

Setiap dependensi mengekspos paket file konfigurasi{: .external} ke build CMake, yang Anda impor dengan perintah find_package{: .external}. Perintah ini menelusuri beberapa paket file konfigurasi yang cocok dengan nama paket dan versi tertentu serta mengekspos target yang ditetapkannya untuk digunakan dalam build Anda. Misalnya, jika aplikasi Anda menentukan libapp.so dan menggunakan curl, Anda harus menyertakan yang berikut ini dalam file CMakeLists.txt Anda:


add_library(app SHARED app.cpp)

# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

Anda kini dapat menentukan #include "curl/curl.h" di app.cpp. Setelah Anda mem-build project, sistem build native eksternal akan otomatis menautkan libapp.so ke libcurl.so dan memaketkan libcurl.so di APK atau app bundle. Untuk informasi tambahan, lihat contoh prefab curl{:.external}.

Perubahan perilaku

Saat menggunakan plugin versi ini, Anda mungkin mendapati perubahan perilaku berikut.

Pembaruan konfigurasi penandatanganan v1/v2

Perilaku untuk konfigurasi penandatanganan aplikasi dalam blok signingConfig telah berubah menjadi:

Penandatanganan v1

  • Jika v1SigningEnabled diaktifkan secara eksplisit, AGP akan melakukan penandatanganan aplikasi v1.
  • Jika v1SigningEnabled dinonaktifkan secara eksplisit oleh pengguna, penandatanganan aplikasi v1 tidak akan dilakukan.
  • Jika tidak diaktifkan pengguna secara eksplisit, penandatanganan v1 dapat dinonaktifkan secara otomatis berdasarkan minSdk dan targetSdk.

Penandatanganan v2

  • Jika v2SigningEnabled diaktifkan secara eksplisit, AGP akan melakukan penandatanganan aplikasi v2.
  • Jika v2SigningEnabled dinonaktifkan secara eksplisit oleh pengguna, penandatanganan aplikasi v2 tidak akan dilakukan.
  • Jika tidak diaktifkan pengguna secara eksplisit, penandatanganan v2 dapat dinonaktifkan secara otomatis berdasarkan targetSdk.

Perubahan ini memungkinkan AGP mengoptimalkan build dengan menonaktifkan mekanisme penandatanganan berdasarkan apakah pengguna telah mengaktifkan flag ini secara eksplisit. Sebelum rilis ini, v1Signing dapat dinonaktifkan meskipun diaktifkan secara eksplisit, sehingga dapat membingungkan.

Plugin Android Gradle feature dan instantapp dihapus

Plugin Android Gradle 3.6.0 tidak menggunakan lagi plugin Feature (com.android.feature) serta plugin Instant App (com.android.instantapp) dan menggantinya dengan plugin Dynamic Feature (com.android.dynamic-feature) untuk mem-build dan memaketkan aplikasi instan Anda menggunakan Android App Bundle.

Pada plugin Android Gradle 4.0.0 dan yang lebih baru, plugin yang sudah tidak lagi digunakan ini sepenuhnya dihapus. Jadi, untuk menggunakan plugin Android Gradle terbaru, Anda harus memigrasikan aplikasi instan untuk mendukung Android App Bundle. Dengan memigrasikan aplikasi instan, Anda dapat memanfaatkan app bundle dan menyederhanakan desain modular aplikasi Anda.

Catatan: Untuk membuka project yang menggunakan plugin yang dihapus di Android Studio 4.0 dan yang lebih tinggi, project harus menggunakan plugin Android Gradle 3.6.0 atau yang lebih rendah.

Fitur untuk memisahkan pemrosesan anotasi dihapus

Kemampuan untuk memisahkan pemrosesan anotasi menjadi tugas khusus telah dihapus. Opsi ini digunakan untuk mempertahankan kompilasi Java inkremental saat pemroses anotasi non-inkremental digunakan dalam project khusus Java; ini diaktifkan dengan menyetel android.enableSeparateAnnotationProcessing ke true dalam file gradle.properties, yang tidak lagi berfungsi.

Sebagai gantinya, Anda harus beralih menggunakan pemroses anotasi inkremental untuk meningkatkan performa build.

includeCompileClasspath tidak digunakan lagi

Plugin Android Gradle tidak lagi memeriksa atau menyertakan pemroses anotasi yang Anda deklarasikan pada classpath kompilasi, dan properti DSL annotationProcessorOptions.includeCompileClasspath tidak lagi berpengaruh sama sekali. Jika Anda menyertakan pemroses anotasi pada classpath kompilasi, Anda mungkin akan mengalami error berikut:

Error: Annotation processors must be explicitly declared now.

Untuk menyelesaikan masalah ini, Anda harus menyertakan pemroses anotasi ke file build.gradle menggunakan konfigurasi dependensi annotationProcessor. Untuk mempelajari lebih lanjut, baca Menambahkan pemroses anotasi.

Paket otomatis dependensi bawaan yang digunakan oleh CMake

Versi sebelumnya Plugin Android Gradle mengharuskan Anda secara eksplisit memaketkan library bawaan apa pun yang digunakan oleh build native eksternal CMake Anda menggunakan jniLibs. Anda mungkin memiliki library di direktori src/main/jniLibs modul Anda, atau mungkin di beberapa direktori yang dikonfigurasi dalam file build.gradle Anda:

sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.srcDirs = ['libs']
  }
}
sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.setSrcDirs(listOf("libs"))
  }
}

Dengan Plugin Android Gradle 4.0, konfigurasi di atas tidak lagi diperlukan dan akan menghasilkan kegagalan build:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
  > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

Versi native eksternal kini secara otomatis memaketkan library tersebut, sehingga memaketkan library secara eksplisit dengan jniLibs menghasilkan duplikat. Untuk menghindari error build, pindahkan library bawaan ke lokasi di luar jniLibs atau hapus konfigurasi jniLibs dari file build.gradle Anda.

Masalah umum

Bagian ini menjelaskan masalah umum yang ada di plugin Android Gradle 4.0.0.

Kondisi race pada mekanisme pekerja Gradle

Perubahan di plugin Android Gradle 4.0 dapat memicu kondisi race di Gradle saat menjalankan &endash;&endash;no&endash;daemon dan versi Gradle 6.3 atau yang lebih rendah, menyebabkan build mengalami hang setelah build diselesaikan.

Masalah ini akan diperbaiki di Gradle 6.4.