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üğü ile ilgili yeni varsayılan ayarlar 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 kapsamlı bir listesini görmek için artık uygulamanızın veya kitaplığınızın Android manifestine bir <queries> öğesi eklemeniz gerekiyor.

Android Gradle eklentisi 4.1 ve sonraki sürümleri, yeni <queries> bildirimiyle 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 gidermek için 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 yükseltin:

Minimum sürüm Varsayılan sürüm Notlar
Gradle 6.1.1 6.1.1 Daha fazla bilgi edinmek için Gradle'ı güncelleme başlıklı makaleyi inceleyin.
SDK Build Tools 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 desteği

Build Analyzer penceresi, devre dışı bırakılan optimizasyonlar ve yanlış yapılandırılmış görevler gibi derleme sürecinizle ilgili sorunları anlamanıza ve teşhis etmenize yardımcı olur. Bu özellik, Android Studio 4.0 ve sonraki sürümlerini Android Gradle eklentisi 4.0.0 ve sonraki sürümleriyle birlikte kullandığınızda kullanılabilir. Build Analyzer penceresini Android Studio'dan aşağıdaki şekilde açabilirsiniz:

  1. Henüz yapmadıysanız menü çubuğundan Build > Make Project'i (Derle > Proje Oluştur) seçerek uygulamanızı oluşturun.
  2. Menü çubuğundan View > Tool Windows > Build'u (Görünüm > Araç Pencereleri > Derleme) seçin.
  3. Build (Derleme) penceresinde, Build Analyzer (Derleme Analiz Aracı) penceresini aşağıdaki yöntemlerden birini kullanarak açın:
    • Android Studio projenizi oluşturmayı tamamladıktan sonra Build Analyzer (Derleme Analiz Aracı) sekmesini tıklayın.
    • Android Studio projenizi oluşturmayı tamamladıktan sonra Build Output (Derleme Çıkışı) penceresinin sağ tarafındaki bağlantıyı tıklayın.

Derleme Analiz Aracı penceresi, olası derleme sorunlarını solda bir ağaç yapısında düzenler. Her sorunu inceleyebilir ve sağdaki panelde ayrıntılarını araştırmak için tıklayabilirsiniz. Android Studio, derlemenizi analiz ederken derlemenin süresini belirleyen görevler 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 uyarılarla ilgili ayrıntıları da görebilirsiniz.

Daha fazla bilgi edinmek için Derleme hızı gerilemelerini belirleme başlıklı makaleyi inceleyin.

D8 ve R8'de Java 8 kitaplığı desugaring

Android Gradle eklentisi artık uygulamanız için minimum API düzeyi gerektirmeden Java 8 dil API'lerinin kullanılmasını destekliyor.

Android Studio 3.0 ve sonraki sürümlerdeki DEX derleyicisi D8, desugaring adı verilen bir işlemle Java 8 dil özelliklerine (ör. lambda ifadeleri, varsayılan arayüz yöntemleri, kaynaklarla deneme vb.) önemli ölçüde destek sunuyordu. Android Studio 4.0'da, Java dili API'lerini dönüştürebilmek için dönüştürme motoru genişletildi. Bu sayede, yalnızca Android'in son sürümlerinde kullanılabilen standart dil API'lerini (ör. java.util.streams) Android'in eski sürümlerini destekleyen uygulamalara ekleyebilirsiniz.

Bu sürümde aşağıdaki API'ler desteklenir:

  • Sıralı akışlar (java.util.stream)
  • java.time alt kümesi
  • java.util.function
  • java.util.{Map,Collection,Comparator} hesabına son eklenenler
  • İsteğe bağlılar (java.util.Optional, java.util.OptionalInt ve java.util.OptionalDouble) ve yukarıdaki API'lerle kullanılabilecek diğer bazı yeni sınıflar
  • java.util.concurrent.atomic'da yapılan bazı eklemeler (AtomicInteger, AtomicLong ve AtomicReference'da yeni yöntemler)
  • ConcurrentHashMap (Android 5.0'daki hatalar düzeltildi)

D8, bu dil API'lerini desteklemek için eksik API'lerin uygulamasını içeren ayrı bir kitaplık DEX dosyası derler ve bu dosyayı uygulamanıza dahil eder. Şekerden arındırma işlemi, uygulamanızın kodunu çalışma 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ümanlı testleri bu dil API'lerini (doğrudan veya kitaplık modülü ya da bağımlılıkları aracılığıyla) kullanır. Bu sayede, enstrümantasyonlu test APK'nız için eksik API'ler sağlanır.

  • Kitaplık modülünde lint'i ayrı olarak çalıştırmak istiyorsanız. Bu, lint'in dil API'lerinin geçerli kullanımlarını tanımasına ve yanlış uyarılar bildirmesini önlemeye yardımcı olur.

Derleme özelliklerini etkinleştirme veya devre dışı bırakmayla ilgili yeni seçenekler

Android Gradle eklentisi 4.0.0, hangi derleme özelliklerini (ör. View Binding ve Data Binding) etkinleştirmek veya devre dışı bırakmak istediğinizi kontrol etmenin yeni bir yolunu sunar. Yeni özellikler eklendiğinde 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 blok, projenizin derleme performansını optimize etmenize yardımcı olur. Her modülün seçeneklerini modül düzeyindeki build.gradle dosyasında 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
  }
}

Ayrıca, aşağıdaki örnekte gösterildiği gibi projenizin gradle.properties dosyasına aşağıdakilerden birini veya daha fazlasını ekleyerek bir projedeki tüm modüllerde bu özelliklerin varsayılan ayarını belirtebilirsiniz. Bu proje genelindeki varsayılan ayarları geçersiz kılmak için modül düzeyindeki build.gradle dosyasında 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

Özellikler arası 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. Android Gradle eklentisi 4.0.0'ı kullanırken artık başka bir özellik modülüne bağlı olan bir özellik modülü ekleyebilirsiniz. Yani, aşağıdaki şekilde gösterildiği gibi bir :video özelliği, temel modüle bağlı olan :camera özelliğine bağlı olabilir.

Özellikler arası bağımlılıklar

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

Bu, uygulamanız bir özellik modülünün indirilmesini istediğinde, uygulamanın bağlı 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 özellikler arası bağımlılık bildirebilirsiniz. Örneğin, :video modülü, :camera modülüne bağımlılığı aşağıdaki gibi bildirir:

// 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, Android Studio'da özellikler arası bağımlılık özelliğini etkinleştirmeniz gerekir (örneğin, Çalıştırma yapılandırması düzenlenirken özelliği desteklemek için). Bunu yapmak için menü çubuğundan Help > Edit Custom VM Options'ı (Yardım > Özel VM Seçeneklerini Düzenle) tıklayın ve aşağıdakileri ekleyin:

-Drundebug.feature.on.feature=true

Bağımlılık meta verileri

Uygulamanızı Android Gradle eklentisi 4.0.0 ve sonraki sürümleri kullanarak oluşturduğunuzda eklenti, uygulamanıza derlenen bağımlılıkları açıklayan meta verileri içerir. Uygulamanızı yüklerken Play Console, aşağıdaki avantajları sağlamak için bu meta verileri inceler:

  • Uygulamanızın kullandığı SDK'lar ve bağımlılıklarla ilgili bilinen sorunlar için uyarı alma
  • Bu sorunları çözmek için eyleme dönüştürülebilir geri bildirimler alma

Veriler sıkıştırılır, Google Play imzalama anahtarıyla şifrelenir ve yayın uygulamanızın imzalama bloğunda saklanır. Ancak meta verileri aşağıdaki dizindeki yerel ara derleme dosyalarında kendiniz inceleyebilirsiniz: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt.

Bu bilgileri paylaşmak istemiyorsanız modülünüzün build.gradle dosyasına aşağıdakileri ekleyerek kapsam dışında kalabilirsiniz:

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 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 kullanılabilir hale getirir. Gradle'ın bu kitaplıkları yalnızca derlemenizde kullanılabilir hale getirdiğini unutmayın. Bunları kullanmak için 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 en fazla bir Prefab paketi kullanabilir. Bu paket, bir veya daha fazla modülden oluşur. Prefab modülü, paylaşılan, statik veya yalnızca başlık içeren bir kitaplık olabilir.

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

Harici yerel derleme sisteminizi yapılandırma

İzlemeniz gereken adımları görmek için kullanmayı planladığınız harici yerel derleme sistemiyle ilgili aşağıdaki adımları uygulayın.

Yerel kod içeren her uygulama AAR bağımlılığınız, ndk-build projenize aktarmanız gereken bir Android.mk dosyası sunar. Bu dosyayı, ndk-build projenizde import&endash;add&endash;path özelliğini kullanarak belirttiğiniz yolları arayan import&endash;module komutuyla içe aktarırsınız. Örneğin, uygulamanız libapp.so 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)

Bir AAR'ye dahil edilen yerel bağımlılıklar, CMAKE_FIND_ROOT_PATH{: .external} değişkeni aracılığıyla CMake projenize sunulur. 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şkene atama yapmak yerine ekleme yaptığınızdan 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, verilen paket adı ve sürümüyle eşleşen config-file paketlerini arar ve tanımladığı hedefleri derlemenizde kullanılmak üzere gösterir. Örneğin, uygulamanızda libapp.so tanımlanmışsa ve curl kullanılı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 oluşturduğunuzda harici yerel derleme sisteminiz, libapp.so libcurl.so ile otomatik olarak bağlantı oluşturur ve libcurl.so öğesini APK veya uygulama paketine yerleştirir. 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 imza yapılandırması güncellemeleri

signingConfig bloğundaki uygulama imzalama yapılandırmalarının davranışı aşağıdaki şekilde değiştirildi:

v1 imzalama

  • v1SigningEnabled açıkça etkinleştirilmişse AGP, v1 uygulama imzalamayı gerçekleştirir.
  • v1SigningEnabled 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 bağlı olarak otomatik olarak devre dışı bırakılabilir.

v2 imzalama

  • v2SigningEnabled açıkça etkinleştirilmişse 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 temel alınarak 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ç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 kullanarak hazır uygulamalarınızı oluşturup paketlemek için Dinamik Özellik eklentisinin (com.android.dynamic-feature) kullanılmasını önererek Ö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, 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: Android Studio 4.0 ve sonraki sürümlerde kaldırılan eklentileri kullanan projeleri açmak için projede Android Gradle eklentisinin 3.6.0 veya daha eski bir sürümü kullanılmalıdır.

Ayrı ek açıklama işleme özelliği kaldırıldı

Ek açıklama işlemenin ayrı bir görev olarak yürütülmesini sağlayan özellik 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ılıyordu. Bu seçenek, gradle.properties dosyasında android.enableSeparateAnnotationProcessing ayarı true olarak belirlenerek etkinleştiriliyordu. Ancak bu yöntem artık çalışmıyor.

Bunun yerine, derleme performansını artırmak için artımlı ek açıklama işlemcilerini 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 etmiyor veya içermiyor ve annotationProcessorOptions.includeCompileClasspath DSL özelliği artık herhangi bir etkiye sahip değil. 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 için Açıklama işlemcileri ekleme başlıklı makaleyi inceleyin.

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

Android Gradle eklentisinin önceki sürümlerinde, CMake harici yerel derlemeniz tarafından kullanılan önceden oluşturulmuş kitaplıkları jniLibs kullanarak açıkça paketlemeniz gerekiyordu. Kitaplıklar, modülünüzün src/main/jniLibs dizininde veya build.gradle dosyanızda yapılandırılmış başka bir dizinde 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ı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 paketlediğinden, kitaplığın jniLibs ile açıkça paketlenmesi yinelenmeye neden olur. Derleme hatasını önlemek için önceden oluşturulmuş kitaplığı jniLibs dışında 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 bilinen sorunlar açıklanmaktadır.

Gradle worker mekanizmasındaki yarışma durumu

Android Gradle eklentisi 4.0'daki değişiklikler, Gradle'da &endash;&endash;no&endash;daemon ve Gradle 6.3 veya önceki sürümleriyle çalışırken yarış durumu tetikleyebilir. Bu durum, derleme tamamlandıktan sonra derlemelerin askıda kalmasına neden olur.

Bu sorun Gradle 6.4'te düzeltilecektir.