Android Gradle eklentisi 4.0.0 (Nisan 2020)

Android eklentisinin bu sürümü için aşağıdakiler gereklidir:

4.0.1 (Temmuz 2020)

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:

  1. Henüz yapmadıysanız menü çubuğundan Derle > Proje Oluştur'u seçerek uygulamanızı derleyin.
  2. Menü çubuğundan Görünüm > Araç Pencereleri > Derle'yi seçin.
  3. 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 ve java.util.OptionalDouble) ve yukarıdaki API'lerle birlikte kullanılabilen bazı yeni sınıflar
  • java.util.concurrent.atomic'e bazı eklemeler (AtomicInteger, AtomicLong ve AtomicReference'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.

Özellik üzerinde özellik bağımlılıkları

:video özellik modülü, :app temel modülüne bağlı olan :camera özellik modülüne bağlıdır.

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:

  1. CMake için:

    add_library(app SHARED app.cpp)

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

  2. 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 ve targetSdk'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.