Android Gradle eklentisi 4.0.0 (Nisan 2020)
Android eklentisinin bu sürümü için aşağıdakiler gereklidir:
-
Gradle 6.1.1. Daha fazla bilgi edinmek için Gradle'i güncelleme ile ilgili bölümü okuyun.
-
SDK Build Tools 29.0.2 veya daha yeni bir sürüm.
Bu küçük güncelleme, Android 11'de paket görünürlüğü için yeni varsayılan ayarlarla ve özelliklerle uyumluluğu destekler.
Android'in önceki sürümlerinde, bir cihaza yüklenen tüm uygulamaların listesini görüntülemek mümkündü. Android 11'den (API düzeyi 30) itibaren uygulamalar varsayılan olarak yalnızca yüklü paketlerin filtrelenmiş bir listesine erişebilir.
Sistemdeki uygulamaların daha geniş bir listesini görmek için artık uygulamanızın veya kitaplığınızın Android manifest dosyasına <queries>
öğesi eklemeniz gerekiyor.
Android Gradle eklentisi 4.1 ve sonraki sürümler yeni <queries>
beyanıyla zaten uyumludur ancak eski sürümler uyumlu değildir. <queries>
öğesini eklerseniz veya Android 11'i hedeflemeyi destekleyen bir kitaplığa ya da SDK'ya güvenmeye başlarsanız uygulamanızı oluştururken manifest birleştirme hatalarıyla karşılaşabilirsiniz.
Bu sorunu gidermek için AGP 3.3 ve sonraki sürümler için bir dizi yamayı yayınlıyoruz. AGP'nin eski bir sürümünü kullanıyorsanız aşağıdaki sürümlerden birine geçiş yapın:
Minimum sürüm | Varsayılan sürüm | Notlar | |
---|---|---|---|
Gradle | 6.1.1 | 6.1.1 | Daha fazla bilgi için Gradle'i güncelleme başlıklı makaleyi inceleyin. |
SDK Oluşturma Araçları | 29.0.2 | 29.0.2 | SDK Oluşturma Araçları'nı yükleyin veya yapılandırın. |
Bu yeni özellik hakkında daha fazla bilgi için Android 11'de paket görünürlüğü başlıklı makaleyi inceleyin.
Yeni özellikler
Android Gradle eklentisinin bu sürümü aşağıdaki yeni özellikleri içerir.
Android Studio Build Analyzer için destek
Derleme Analizörü penceresi, devre dışı bırakılmış optimizasyonlar ve hatalı yapılandırılmış görevler gibi derleme sürecinizle ilgili sorunları anlamanıza ve teşhis etmenize yardımcı olur.
Bu özellik, Android Gradle eklentisi 4.0.0
ve sonraki sürümlerle birlikte Android Studio 4.0 ve sonraki sürümleri kullandığınızda kullanılabilir. Android Studio'da Derleme Analizörü penceresini aşağıdaki şekilde açabilirsiniz:
- Henüz yapmadıysanız menü çubuğundan Derle > Proje Oluştur'u seçerek uygulamanızı derleyin.
- Menü çubuğundan Görünüm > Araç Pencereleri > Derle'yi seçin.
- Derleme penceresinde, Derleme Analizörü penceresini aşağıdaki yöntemlerden biriyle açın:
- Android Studio projenizi oluşturmayı tamamladıktan sonra Derleme sekmesini tıklayın.
- Android Studio projenizi oluşturmayı tamamladıktan sonra Derleme Çıktısı penceresinin sağ tarafındaki bağlantıyı tıklayın.
Derleme Analizi penceresi, olası derleme sorunlarını soldaki bir ağaçta düzenler. Her bir sorunu inceleyip sağdaki panelde ayrıntılarını inceleyebilirsiniz. Android Studio, derlemenizi analiz ederken derlemenin süresini belirleyen görev grubunu hesaplar ve bu görevlerin her birinin etkisini anlamanıza yardımcı olacak bir görselleştirme sağlar. Uyarılar düğümünü genişleterek de uyarılarla ilgili ayrıntıları edinebilirsiniz.
Daha fazla bilgi edinmek için derleme hızı gerilemelerini belirleme başlıklı makaleyi inceleyin.
D8 ve R8'de Java 8 kitaplıklarının şekerlenmesini kaldırma
Android Gradle eklentisi artık uygulamanız için minimum API düzeyi gerektirmeden çeşitli Java 8 dil API'lerinin kullanılmasına yönelik destek içeriyor.
Android Studio 3.0 ve sonraki sürümlerdeki D8 DEX derleyicisi, şekil bozma adı verilen bir işlemle Java 8 dil özellikleri (ör. lambda ifadeleri, varsayılan arayüz yöntemleri, kaynaklarla deneme vb.) için önemli ölçüde destek sağladı. Android Studio 4.0'ta şekerleme kaldırma motoru, Java dili API'lerini şekerleme kaldırmak için genişletildi. Bu sayede artık yalnızca son Android sürümlerinde kullanılabilen standart dil API'lerini (java.util.streams
gibi) Android'in eski sürümlerini destekleyen uygulamalara dahil edebilirsiniz.
Bu sürümde aşağıdaki API grubu desteklenir:
- Sıralı akışlar (
java.util.stream
) java.time
alt kümesi-
java.util.function
java.util.{Map,Collection,Comparator}
'e son eklenen içerikler- İsteğe bağlılar (
java.util.Optional
,java.util.OptionalInt
vejava.util.OptionalDouble
) ve yukarıdaki API'lerle birlikte kullanılabilen bazı yeni sınıflar java.util.concurrent.atomic
'e bazı eklemeler (AtomicInteger
,AtomicLong
veAtomicReference
'te yeni yöntemler)-
ConcurrentHashMap
(Android 5.0 için hata düzeltmeleri ile)
D8, bu dil API'lerini desteklemek için eksik API'lerin uygulamasını içeren ayrı bir kitaplık DEX dosyası derleyip uygulamanıza ekler. Şekerleme kaldırma işlemi, uygulamanızın kodunu derleme zamanında bu kitaplığı kullanacak şekilde yeniden yazar.
Bu dil API'leri için desteği etkinleştirmek üzere uygulama modülünüzün build.gradle
dosyasına aşağıdakileri ekleyin:
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")
}
Yukarıdaki kod snippet'ini, aşağıdaki durumlarda bir kitaplık modülünün build.gradle
dosyasına da eklemeniz gerekebileceğini unutmayın:
-
Kitaplık modülünün enstrümante edilmiş testleri bu dil API'lerini (doğrudan veya kitaplık modülü ya da bağımlılıklarıyla) kullanır. Bu, enstrümante edilmiş test APK'nız için eksik API'lerin sağlanmasını sağlar.
-
Kitaplık modülünde lint'i tek başına çalıştırmak istiyorsunuz. Bu, dil API'lerinin geçerli kullanımlarını tespit etmek ve yanlış uyarılar bildirmekten kaçınmak içindir.
Derleme özelliklerini etkinleştirme veya devre dışı bırakmayla ilgili yeni seçenekler
Android Gradle eklentisi 4.0.0, görünüm bağlama ve veri bağlama gibi hangi derleme özelliklerini etkinleştirmek ve devre dışı bırakmak istediğinizi kontrol etmenin yeni bir yolunu sunar. Yeni eklenen özellikler varsayılan olarak devre dışı bırakılır. Ardından, yalnızca istediğiniz özellikleri etkinleştirmek için buildFeatures
bloğunu kullanabilirsiniz. Bu, projenizin derleme performansını optimize etmenize yardımcı olur. Modül düzeyindeki build.gradle
dosyasında her modülün seçeneklerini aşağıdaki gibi ayarlayabilirsiniz:
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
}
}
Aşağıda gösterildiği gibi projenizin gradle.properties
dosyasına aşağıdakilerden birini veya daha fazlasını ekleyerek bir projedeki tüm modüller için bu özelliklerin varsayılan ayarını da belirtebilirsiniz. Proje genelindeki bu varsayılan ayarları geçersiz kılmak için modül düzeyindeki build.gradle
dosyasında buildFeatures
bloğunu kullanmaya devam edebileceğinizi unutmayın.
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
Özellik bağımlılıklarını özellik
Android Gradle eklentisinin önceki sürümlerinde tüm özellik modülleri yalnızca uygulamanın temel modülüne bağlı olabilirdi. Android Gradle Plugin 4.0.0'ı kullanırken artık başka bir özellik modülüne bağlı bir özellik modülü ekleyebilirsiniz. Yani bir :video
özelliği, aşağıdaki şekilde gösterildiği gibi temel modüle bağlı olan :camera
özelliğine bağlı olabilir.
Bu, uygulamanız bir özellik modülü indirme isteğinde bulunduğunda, uygulamanın bu modüle bağlı diğer özellik modüllerini de indirdiği anlamına gelir. Uygulamanız için özellik modülleri oluşturduktan sonra, modülün build.gradle
dosyasında özellik özelliği bağımlılığı tanımlayabilirsiniz. Örneğin, :video
modülü :camera
'a bağımlılığını aşağıdaki gibi belirtir:
// 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"))
...
}
Ayrıca, menü çubuğundan Yardım > Özel VM Seçenekleri'ni Düzenle'yi tıklayıp aşağıdakileri ekleyerek Android Studio'da özellik üzerinde özellik bağımlılık özelliğini etkinleştirmeniz (ör. çalıştırma yapılandırmasını düzenlerken özelliği desteklemek için) gerekir:
-Drundebug.feature.on.feature=true
Bağımlılıklar meta verileri
Android Gradle eklentisi 4.0.0 ve sonraki sürümleri kullanarak uygulamanızı derlediğinizde eklenti, uygulamanızda derlenen bağımlılıklarını açıklayan meta veriler içerir. Play Console, uygulamanızı yüklerken size aşağıdaki avantajları sunmak için bu meta verileri inceler:
- Uygulamanızın kullandığı SDK'lar ve bağımlılıklarla ilgili bilinen sorunlarla ilgili uyarılar alma
- Bu sorunları çözmek için uygulanabilir geri bildirimler alın
Veriler sıkıştırılır, bir Google Play imzalama anahtarıyla şifrelenir ve yayınlama uygulamanızın imzalama bloğunda saklanır. Ancak meta verileri kendiniz şu dizindeki yerel ara derleme dosyalarında inceleyebilirsiniz:
<project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt
.
Bu bilgileri paylaşmak istemiyorsanız aşağıdakileri modülünüzün build.gradle
dosyasına ekleyerek bu seçeneği devre dışı bırakabilirsiniz:
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
}
}
Yerel kitaplıkları AAR bağımlılıkları üzerinden içe aktarma
Artık uygulamanızın AAR bağımlılıklarından C/C++ kitaplıklarını içe aktarabilirsiniz. Aşağıda açıklanan yapılandırma adımlarını uyguladığınızda Gradle, bu yerel kitaplıkları CMake gibi harici yerel derleme sisteminizle otomatik olarak kullanılabilir hale getirir. Gradle'in bu kitaplıkları yalnızca derlemenize sunduğunu, ancak bunları kullanmak için derleme komut dosyalarınızı yapılandırmanız gerektiğini unutmayın.
Kitaplıklar, Prefab paket biçimi kullanılarak dışa aktarılır.
Her bağımlılık, bir veya daha fazla modülden oluşan en fazla bir Prefab paketi gösterebilir. Hazır modül, paylaşılan, statik veya yalnızca başlık kitaplığı olabilecek tek bir kitaplıktır.
Genellikle paket adı Maven yapı adıyla, modül adı ise kitaplık adıyla eşleşir ancak bu her zaman doğru değildir. Kitaplıkların paket ve modül adını bilmeniz gerektiğinden, bu adları belirlemek için bağımlılık dokümanlarına bakmanız gerekebilir.
Harici doğal derleme sisteminizi yapılandırma
Uygulamanız gereken adımları görmek için, kullanmayı planladığınız harici yerel derleme sistemiyle ilgili aşağıdaki adımları uygulayın.
Uygulamanızın yerel kod içeren AAR bağımlılıklarının her biri, ndk-build projenize aktarmanız gereken bir Android.mk
dosyası gösterir. Bu dosyayı, ndk-build projenizdeki import&endash;add&endash;path
mülkünü kullanarak belirttiğiniz yolları arayan import&endash;module
komutunu kullanarak içe aktarırsınız. Örneğin, uygulamanız libapp.so
'ü tanımlayıp curl kullanıyorsa Android.mk dosyanıza şunları eklemeniz gerekir:
-
CMake için:
add_library(app SHARED app.cpp)
# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)
-
ndk-build
için: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)
AAR'a dahil edilen yerel bağımlılıklar, CMAKE_FIND_ROOT_PATH{: .external} değişkeni aracılığıyla CMake projenize gösterilir. Bu değer, CMake çağrıldığında Gradle tarafından otomatik olarak ayarlanır. Bu nedenle, derleme sisteminiz bu değişkeni değiştirirse atamak yerine eklediğinizden emin olun.
Her bağımlılık, CMake derlemenize bir yapılandırma dosyası paketi{: .external} sunar. Bu paketi find_package
{: .external} komutuyla içe aktarırsınız. Bu komut, belirli paket adıyla ve sürümüyle eşleşen yapılandırma dosyası paketlerini arar ve derlemenizde kullanılacak şekilde tanımladığı hedefleri gösterir. Örneğin, uygulamanız libapp.so
tanımlayıp curl kullanıyorsa CMakeLists.txt
dosyanıza aşağıdakileri eklemeniz gerekir:
add_library(app SHARED app.cpp)
# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)
Artık app.cpp
içinde #include "curl/curl.h"
değerini belirtebilirsiniz. Projenizi derlediğinizde harici yerel derleme sisteminiz libapp.so
ile libcurl.so
'i otomatik olarak bağlar ve libcurl.so
'ı APK veya uygulama paketinde paketler. Daha fazla bilgi için curl hazır örnek{:.external} sayfasına bakın.
Davranışta yapılan değişiklikler
Eklentinin bu sürümünü kullanırken davranışta aşağıdaki değişikliklerle karşılaşabilirsiniz.
v1/v2 imza yapılandırması güncellemeleri
signingConfig
bloğundaki uygulama imzalama yapılandırmalarının davranışı şu şekilde değişti:
v1 imzalama
v1SigningEnabled
açıkça etkinleştirilirse AGP, v1 uygulama imzalamayı gerçekleştirir.v1SigningEnabled
kullanıcı tarafından açıkça devre dışı bırakılırsa v1 uygulama imzalama işlemi yapılmaz.- Kullanıcı v1 imzalamayı açıkça etkinleştirmediyse
minSdk
vetargetSdk
'ye göre otomatik olarak devre dışı bırakılabilir.
v2 imzalama
v2SigningEnabled
açıkça etkinleştirilirse AGP, v2 uygulama imzalamayı gerçekleştirir.v2SigningEnabled
kullanıcı tarafından açıkça devre dışı bırakılırsa v2 uygulama imzalama işlemi yapılmaz.- Kullanıcı v2 imzalamayı açıkça etkinleştirmediyse
targetSdk
'ye göre otomatik olarak devre dışı bırakılabilir.
Bu değişiklikler, AGP'nin kullanıcının bu işaretleri açıkça etkinleştirip etkinleştirmediğine bağlı olarak imzalama mekanizmasını devre dışı bırakarak derlemeleri optimize etmesine olanak tanır. Bu sürümden önce, v1Signing
açıkça etkinleştirilmiş olsa bile devre dışı bırakılabiliyordu. Bu durum kafa karıştırıcı olabiliyordu.
feature
ve instantapp
Android Gradle eklentileri kaldırıldı
Android Gradle eklentisi 3.6.0, Android App Bundle'ları kullanarak hazır uygulamalarınızı derlemek ve paketlemek için Dinamik Özellik eklentisini (com.android.dynamic-feature
) kullanmaya yönelik olarak Özellik eklentisinin (com.android.feature
) ve Hazır Uygulama eklentisinin (com.android.instantapp
) desteğini sonlandırdı.
Android Gradle eklentisinin 4.0.0 ve sonraki sürümlerinde, desteği sonlandırılan bu eklentiler tamamen kaldırılmıştır. Bu nedenle, en son Android Gradle eklentisini kullanmak için hazır uygulamanızı Android App Bundle'ları destekleyecek şekilde taşımanız gerekir. Hazır uygulamalarınızı taşıyarak uygulama paketlerinin avantajlarından yararlanabilir ve uygulamanızın modüler tasarımını basitleştirebilirsiniz.
Not: Kaldırılan eklentileri kullanan projeleri Android Studio 4.0 ve sonraki sürümlerde açmak için projenin Android Gradle eklentisi 3.6.0 veya daha eski bir sürümü kullanması gerekir.
Ayrı ek açıklama işleme özelliği kaldırıldı
Ek açıklama işlemeyi özel bir göreve ayırma özelliği kaldırıldı. Bu seçenek, yalnızca Java projelerinde artımlı olmayan ek açıklama işleyiciler kullanıldığında artımlı Java derlemeyi sürdürmek için kullanılıyordu. gradle.properties
dosyasında android.enableSeparateAnnotationProcessing
değerinin true
olarak ayarlanmasıyla etkinleştiriliyordu. Bu seçenek artık kullanılamıyor.
Bunun yerine, derleme performansını artırmak için artan ek açıklama işleyicileri kullanmaya geçmeniz gerekir.
includeCompileClasspath desteği sonlandırıldı
Android Gradle eklentisi artık derleme sınıf yolu üzerinde tanımladığınız ek açıklama işleyicilerini kontrol etmez veya dahil etmez. Ayrıca annotationProcessorOptions.includeCompileClasspath
DSL mülkünün artık hiçbir etkisi yoktur. Derleme sınıf yolu için ek açıklama işleyicileri eklerseniz aşağıdaki hatayla karşılaşabilirsiniz:
Error: Annotation processors must be explicitly declared now.
Bu sorunu çözmek için annotationProcessor
bağımlılık yapılandırmasını kullanarak build.gradle
dosyalarınıza ek açıklama işleyicileri eklemeniz gerekir.
Daha fazla bilgi için Ek açıklama işleyicileri ekleme başlıklı makaleyi inceleyin.
CMake tarafından kullanılan önceden derlenmiş bağımlılıkların otomatik olarak paketlenmesi
Android Gradle Eklentisi'nin önceki sürümlerinde, jniLibs
kullanarak CMake harici yerel derlemeniz tarafından kullanılan önceden derlenmiş kitaplıkları açıkça paketlemeniz gerekiyordu. Modülünüzün src/main/jniLibs
dizininde veya build.gradle
dosyanızda yapılandırılmış başka bir dizinde kitaplıklarınız olabilir:
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"))
}
}
Android Gradle Eklentisi 4.0 ile yukarıdaki yapılandırma artık gerekli değildir ve derleme hatasıyla sonuçlanır:
* 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'
Harici yerel derleme artık bu kitaplıkları otomatik olarak paketlediğinden, kitaplığı jniLibs
ile açıkça paketlemek kopya bir kitaplık oluşturur. Derleme hatasını önlemek için önceden oluşturulmuş kitaplığı jniLibs
dışındaki bir konuma taşıyın veya jniLibs
yapılandırmasını build.gradle
dosyanızdan kaldırın.
Bilinen sorunlar
Bu bölümde, Android Gradle eklentisi 4.0.0'da bulunan bilinen sorunlar açıklanmaktadır.
Gradle işçi mekanizmasında yarışma durumu
Android Gradle eklentisi 4.0'taki değişiklikler, &endash;&endash;no&endash;daemon
ve Gradle 6.3 veya daha eski sürümlerle çalıştırıldığında Gradle'de bir yarış koşulu tetikleyebilir. Bu da derleme tamamlandıktan sonra derlemelerin kilitlenmesine neden olur.
Bu sorun Gradle 6.4'te düzeltilecektir.