Plugin Android Gradle 4.0.0 (April 2020)
Versi plugin Android ini perlu beberapa hal berikut:
-
Gradle 6.1.1. Untuk mempelajari lebih lanjut, baca bagian tentang mengupdate Gradle.
-
SDK Build Tools 29.0.2 atau yang lebih baru.
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:
- Jika belum melakukannya, build aplikasi dengan memilih Build > Make Project dari panel menu.
- Pilih View > Tool Windows > Build dari panel menu.
- 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
, danjava.util.OptionalDouble
) serta beberapa class baru lainnya yang berguna dengan API di atas - Beberapa tambahan pada
java.util.concurrent.atomic
(metode baru padaAtomicInteger
,AtomicLong
, danAtomicReference
) -
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.
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:
-
Untuk CMake:
add_library(app SHARED app.cpp)
# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)
-
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
dantargetSdk
.
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.