Android Gradle Eklentisi 4.0.0 (Nisan 2020)

Android eklentisinin bu sürümü için gerekenler:

4.0.1 (Temmuz 2020)

Bu küçük güncelleme, Android 11'de paket görünürlüğü için yeni varsayılan ayarlar ve özelliklerle uyumluluğu destekler.

Android'in önceki sürümlerinde, bir cihazda yüklü tüm uygulamaların listesini görmek mümkündü. Android 11'den (API düzeyi 30) başlayarak, 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 bir <queries> öğesi eklemeniz gerekiyor.

Android Gradle eklentisi 4.1 ve sonraki sürümleri, yeni <queries> bildirimiyle zaten uyumludur ancak eski sürümler uyumlu değildir. <queries> öğesini eklerseniz veya Android 11'i hedeflemeyi destekleyen bir kitaplık ya da SDK kullanmaya başlarsanız uygulamanızı oluştururken manifest birleştirme hatalarıyla karşılaşabilirsiniz.

Bu sorunu çözmek amacıyla AGP 3.3 ve sonraki sürümler için bir dizi yama yayınlıyoruz. AGP'nin eski bir sürümünü kullanıyorsanız aşağıdaki sürümlerden birine geçin:


AGP sürümünü kullanıyorsanız...
...sürüme yükseltin:
4.0.* 4.0.1
3.6.* 3.6.4
3,5* 3,5,4
3.4* 3.4.3
3.3.* 3.3.3

Bu yeni özellik hakkında daha fazla bilgiyi Android 11'de paket görünürlüğü bölümünde bulabilirsiniz.

Yeni özellikler

Android Gradle eklentisinin bu sürümü aşağıdaki yeni özellikleri içerir.

Android Studio Derleme Analiz Aracı desteği

Analiz Aracı Derleme penceresi, optimizasyonların devre dışı bırakılması ve yanlış yapılandırılmış görevler gibi derleme işleminizdeki sorunları anlamanıza ve teşhis etmenize yardımcı olur. Bu özellikten, Android Studio 4.0 ve üzerini Android Gradle eklentisi 4.0.0 ve sonraki sürümleriyle birlikte kullandığınızda yararlanabilirsiniz. Analiz Aracı Derleme penceresini Android Studio'dan şu şekilde açabilirsiniz:

  1. Henüz yapmadıysanız menü çubuğundan Derleme > Proje Yap'ı seçerek uygulamanızı derleyin.
  2. Menü çubuğundan Görünüm > Araç Pencereleri > Derleme'yi seçin.
  3. Derleme penceresinde, aşağıdaki yöntemlerden birini kullanarak Analiz Aracı Derleme penceresini açın:
    • Android Studio projenizi oluşturmayı tamamladıktan sonra, Analiz Aracı Derleme sekmesini tıklayın.
    • Android Studio projenizi oluşturmayı bitirdikten sonra, Çıktı Derleme penceresinin sağ tarafındaki bağlantıyı tıklayın.

Analiz Analiz Aracı penceresi, soldaki ağaçta yer alan olası derleme sorunlarını düzenler. Sağ taraftaki panelde her bir sorunu inceleyip tıklayarak 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 sunar. Uyarılar düğümünü genişleterek de uyarılarla ilgili ayrıntıları öğrenebilirsiniz.

Daha fazla bilgi edinmek için derleme hızı regresyonlarını belirleme başlıklı makaleyi okuyun.

D8 ve R8'de şeker giderme için Java 8 kitaplığı

Android Gradle eklentisi artık uygulamanız için minimum bir API düzeyi gerektirmeden bir dizi Java 8 dilindeki API'yi kullanma desteği içeriyor.

Android Studio 3.0 ve sonraki sürümlerin DEX derleyicisi olan D8, desugaring adı verilen bir işlemle, Java 8 dili özellikleri (lambda ifadeleri, varsayılan arayüz yöntemleri, kaynaklarla deneme ve daha fazlası gibi) için zaten kapsamlı destek sağladı. Android Studio 4.0'da şeker giderme motoru, Java dili API'lerini çıkaracak şekilde genişletildi. Diğer bir deyişle, artık Android'in eski sürümlerini destekleyen uygulamalara yalnızca son Android sürümlerinde bulunan standart dil API'lerini (java.util.streams gibi) dahil edebilirsiniz.

Bu sürümde aşağıdaki API grubu desteklenmektedir:

  • Sıralı akışlar (java.util.stream)
  • java.time alt kümesi
  • java.util.function
  • java.util.{Map,Collection,Comparator} öğesine son eklenenler
  • İsteğe bağlılar (java.util.Optional, java.util.OptionalInt ve java.util.OptionalDouble) ve yukarıdaki API'lerle yararlı olan diğer bazı yeni sınıflar
  • java.util.concurrent.atomic için bazı eklemeler (AtomicInteger, AtomicLong ve AtomicReference ile ilgili yeni yöntemler)
  • ConcurrentHashMap (Android 5.0 için hata düzeltmeleriyle birlikte)

D8, bu dil API'lerini desteklemek için ayrı bir kitaplık DEX dosyası derler. Bu dosya, eksik API'lerin bir uygulamasını içerir ve bunu uygulamanıza ekler. Suyu giderme işlemi, uygulamanızın kodunu yeniden yazarak bu kitaplığı çalışma zamanında kullanır.

Bu dil API'lerine yönelik desteği etkinleştirmek için 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 donanımlı testleri bu dil API'lerini kullanır (doğrudan veya kitaplık modülü ya da bağımlılıkları aracılığıyla). Eksik API'lerin amacı, gerekli araçların kullanıldığı test APK'nız için sağlanmasıdır.

  • Kitaplık modülünde tek başına lint çalıştırmak istiyorsunuz. Bunun amacı, lint'in dil API'lerinin geçerli kullanımlarını tanımasına ve yanlış uyarıları bildirmekten kaçınmasına yardımcı olmaktır.

Derleme özelliklerini etkinleştirmek veya devre dışı bırakmak için yeni seçenekler

Android Gradle eklentisi 4.0.0, etkinleştirmek ve devre dışı bırakmak istediğiniz derleme özelliklerini (ör. Görünüm Bağlama ve Veri Bağlama gibi) kontrol edebilmeniz için yeni bir yol sunuyor. Yeni özellikler eklendiğinde, bunlar varsayılan olarak devre dışı bırakılır. Daha sonra buildFeatures blokunu yalnızca istediğiniz özellikleri etkinleştirmek için kullanabilirsiniz. Bu blok, projenizin derleme performansını optimize etmenize yardımcı olur. Modül düzeyindeki build.gradle dosyasındaki 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 birkaçını ekleyerek bir projedeki tüm modüllerde bu özelliklerle ilgili varsayılan ayarı belirtebilirsiniz. Proje genelindeki bu varsayılan ayarları geçersiz kılmak için modül düzeyindeki build.gradle dosyasındaki buildFeatures blokunu 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 üzerindeki özellik bağımlılıkları

Android Gradle eklentisinin önceki sürümlerinde tüm özellik modülleri yalnızca uygulamanın temel modülüne bağlı olabiliyordu. Artık Android Gradle eklentisi 4.0.0'ı kullanırken başka bir özellik modülüne dayanan bir özellik modülü ekleyebilirsiniz. Diğer bir deyişle, bir :video özelliği aşağıdaki resimde gösterildiği gibi temel modüle bağlı olan :camera özelliğine bağlı olabilir.

Özellik bağımlılıklarıyla ilgili özellikler

:video özellik modülü, temel :app modülüne bağlı olan :camera özelliğine bağımlı.

Bu, uygulamanız bir özellik modülü indirmek istediğinde uygulamanın bağımlı olduğu 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 özellikte özellik bağımlılığı beyan edebilirsiniz. Örneğin :video modülü, :camera için bir bağımlılığı aşağıdaki gibi tanımlar:

// 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 Sanal Makine Seçeneklerini Düzenle'yi tıklayıp aşağıdakileri ekleyerek Android Studio'da özellikte özellik bağımlılık özelliğini etkinleştirmeniz gerekir (örneğin, Çalıştır yapılandırmasını düzenlerken bu özelliği desteklemek için):

-Drundebug.feature.on.feature=true

Bağımlılık meta verileri

Eklenti, Android Gradle eklentisi 4.0.0 ve sonraki sürümlerini kullanarak uygulamanızı oluştururken, uygulamanızda derlenen bağımlılıkları tanımlayan meta veriler içerir. Play Console, uygulamanızı yüklerken bu meta verileri inceler ve size aşağıdaki avantajları sağlar:

  • Uygulamanızın kullandığı SDK'lar ve bağımlılıklar ile ilgili bilinen sorunlar için uyarılar alın
  • 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 sürüm uygulamanızın imzalama bloğunda saklanır. Ancak meta verileri şu dizindeki yerel ara derleme dosyalarında kendiniz inceleyebilirsiniz: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt.

Bu bilgileri paylaşmak istemezseniz modülünüzün build.gradle dosyasına aşağıdakini ekleyerek kapsam dışında kalmayı seçebilirsiniz:

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
  }
}

AAR bağımlılıklarından yerel kitaplıkları içe aktarma

Artık C/C++ kitaplıklarını uygulamanızın AAR bağımlılıklarından içe aktarabilirsiniz. Aşağıda açıklanan yapılandırma adımlarını uyguladığınızda Gradle, bu yerel kitaplıkları otomatik olarak CMake gibi harici yerel derleme sisteminizle kullanılabilir hale getirir. Gradle'ın yalnızca bu kitaplıkları derlemeniz için kullanılabilir hale getirdiğini unutmayın. Bunları kullanmak için yine de derleme komut dosyalarınızı yapılandırmanız gerekir.

Kitaplıklar, Prefab paket biçimi kullanılarak dışa aktarılır.

Her bağımlılık, bir veya daha fazla modül içeren en fazla bir Prefab paketi sunabilir. Prefab modülü paylaşılan, statik veya yalnızca başlık kitaplığı olabilen tek bir kitaplıktır.

Genellikle paket adı Maven yapı adıyla, modül adı da kitaplık adıyla eşleşir ancak bu her zaman geçerli değildir. Kitaplıkların paket ve modül adlarını bilmeniz gerektiğinden, bu adların ne olduğunu öğrenmek için bağımlılığın belgelerine bakmanız gerekebilir.

Harici yerel derleme sisteminizi yapılandırın

İzlemeniz gereken adımları görmek için, kullanmayı planladığınız harici yerel derleme sistemiyle ilgili olarak 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 projenizde import&endash;add&endash;path özelliğini kullanarak belirttiğiniz yolları arayan import&endash;module komutunu kullanarak içe aktarırsınız. Örneğin, uygulamanız libapp.so öğesini tanımlıyorsa ve curl kullanıyorsa, Android.mk dosyanıza aşağıdakileri 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'ye 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 değişken atamak yerine eklediğinizden emin olun.

Her bağımlılık, CMake derlemenize bir config-file paketi{: .external} sunar. Bu paketi, find_package{: .external} komutuyla içe aktarırsınız. Bu komut, belirtilen paket adı ve sürümüyle eşleşen yapılandırma dosyası paketlerini arar ve tanımladığı hedefleri derlemenizde kullanılmak üzere gösterir. Örneğin, uygulamanız libapp.so öğesini tanımlıyor ve 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" öğesini belirtebilirsiniz. Projenizi derlediğinizde harici yerel derleme sisteminiz, libapp.so öğesini libcurl.so ile APK veya uygulama paketindeki libcurl.so paketlerine otomatik olarak bağlar. Daha fazla bilgi için curl prefab örneğine{:.external} bakın.

Davranış değişiklikleri

Eklentinin bu sürümünü kullanırken davranışta aşağıdaki değişikliklerle karşılaşabilirsiniz.

v1/v2 imzalama yapılandırma güncellemeleri

signingConfig bloğundaki uygulama imzalama yapılandırmaları 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 uyarınca 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 yapılmaz.
  • Kullanıcı v2 imzalamayı açıkça etkinleştirmemişse bu özellik, targetSdk değerine göre otomatik olarak devre dışı bırakılabilir.

Bu değişiklikler, 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 AGP'nin derlemeleri optimize etmesine olanak tanır. Bu sürümden önce, v1Signing açık bir şekilde etkinleştirildiğinde bile devre dışı bırakılabiliyordu. Bu durum kafa karıştırıcı olabilir.

feature ve instantapp Android Gradle eklentisi kaldırıldı

Android Gradle eklentisi 3.6.0, Özellik eklentisini (com.android.feature) ve Hazır Uygulama eklentisini (com.android.instantapp) kullanımdan kaldırarak hazır uygulamalarınızı Android App Bundle kullanarak oluşturmak ve paketlemek için Dinamik Özellik eklentisini (com.android.dynamic-feature) kullanmakti.

Android Gradle eklentisi 4.0.0 ve sonraki sürümlerde, kullanımdan kaldırılan bu eklentiler tamamen kaldırılmıştır. Bu nedenle, en yeni Android Gradle eklentisini kullanmak için hazır uygulamanızı Android App Bundle'ı 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 Android Studio 4.0 ve sonraki sürümlerde kullanan projeleri açmak için projenin Android Gradle eklentisinin 3.6.0 veya önceki sürümünü 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şlemcileri kullanıldığında artımlı Java derlemesini korumak için kullanılmıştır. gradle.properties dosyasında true, artık çalışmayan android.enableSeparateAnnotationProcessing olarak ayarlanarak etkinleştirilmiştir.

Bunun yerine, derleme performansını iyileştirmek için artımlı ek açıklama işlemcileri kullanmaya geçmelisiniz.

includeCompileClasspath kullanımdan kaldırıldı

Android Gradle eklentisi artık derleme sınıf yolunda bildirdiğiniz ek açıklama işlemcilerini kontrol etmez veya içermez. Ayrıca annotationProcessorOptions.includeCompileClasspath DSL özelliğinin artık herhangi bir etkisi yoktur. Derleme sınıf yoluna ek açıklama işlemcileri eklerseniz aşağıdaki hatayı alabilirsiniz:

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şlemcilerini eklemeniz gerekir. Daha fazla bilgi edinmek için Ek açıklama işlemcileri ekleme bölümünü okuyun.

CMake tarafından kullanılan önceden oluşturulmuş bağımlılıkların otomatik paketlenmesi

Android Gradle Eklentisi'nin önceki sürümleri, CMake harici yerel derlemeniz tarafından kullanılan önceden oluşturulmuş kitaplıkları jniLibs kullanarak açık bir şekilde paketlemenizi gerektiriyordu. Modülünüzün src/main/jniLibs dizininde veya build.gradle dosyanızda yapılandırılmış başka bir dizinde kitaplıklar 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 Plugin 4.0 ile yukarıdaki yapılandırma artık gerekli değildir ve derleme hatasına neden olur:

* 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 paketler. Bu nedenle kitaplığı jniLibs ile açık bir şekilde paketlemek kopya 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 çalışan mekanizmasında yarış durumu

Android Gradle eklentisi 4.0'da yapılan değişiklikler, &endash;&endash;no&endash;daemon ve Gradle 6.3 veya önceki sürümleri ile çalışırken Gradle'da bir yarış durumunu tetikleyerek derleme tamamlandıktan sonra derlemelerin askıya alınmasına neden olabilir.

Bu sorun Gradle 6.4'te düzeltilecektir.