Android Gradle Plugin 4.0.0 (Nisan 2020)

Android eklentisinin bu sürümü aşağıdakileri gerektirir:

4.0.1 (Temmuz 2020)

Bu küçük güncelleme, yeni varsayılan ayarlarla uyumluluğu destekler ve paketi için özellikler .

Android'in önceki sürümlerinde tüm Android uygulamalarının bir listesini Cihazda yüklü uygulamalar. Android 11 (API düzeyi 30) sürümünden itibaren varsayılan uygulamalar yalnızca filtrelenmiş bir yüklü paketler listesine erişebilir. Sistemdeki uygulamaların daha geniş bir listesini görmek için artık şunları yapmanız gerekiyor: ekle Uygulamanızın veya kitaplığınızın <queries> öğesi Android manifesti.

Android Gradle eklentisi 4.1+ zaten yeni <queries> beyanı; ancak eski sürümler artık uyumlu olmalıdır. <queries> öğesini eklerseniz veya Android 11'i hedeflemeyi destekleyen bir kitaplık veya SDK kullanmaya başlarsanız uygulamanızı oluştururken manifest birleştirme hatalarıyla karşılaşabilir.

Bu sorunu gidermek üzere AGP 3.3 ve sonraki sürümler için bir dizi yama yayınlıyoruz. daha yüksek. AGP'nin eski bir sürümünü kullanıyorsanız yükselt şu sürümlerden birine uymalıdır:


AGP sürümünü
kullanıyorsanız...
...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 özellikle ilgili daha fazla bilgi için Paket görünürlüğü ) kullanıma sunduk.

Yeni özellikler

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

Android Studio Derleme Analiz Aracı desteği

Derleme Analiz Aracı penceresi, devre dışı bırakılmış optimizasyonlar ve doğru şekilde yapılandırılmamış görevler gibi Bu özellik, Android Studio 4.0 ve sonraki sürümleri Android Gradle eklentisi 4.0.0 ve sonraki sürümler. Build Analiz Aracı'nı açabilirsiniz. penceresini aşağıdaki gibi açabilirsiniz:

  1. Henüz yapmadıysanız Derleme > Marka Proje'yi seçin.
  2. Görünüm > Araç Pencereleri > Oluştur'u seçin.
  3. Build penceresindeki Build Analiz Aracı penceresindeki şu yöntemleri kullanabilirsiniz:
    • Android Studio, projenizi oluşturmayı tamamladıktan sonra Build Analiz Aracı sekmesine gidin.
    • Android Studio projenizi oluşturmayı tamamladıktan sonra, Build Exit (Çıkış Oluştur) penceresinin sağ tarafındaki

Build Analiz Aracı penceresi, web sitesindeki olası derleme sorunlarını çıktı. tıklayın. Android Studio, derlemenizi analiz ederken yapma konusunda bilgi sağlayan ve derlemenin süresini belirleyen bu görevlerden her birinin etkisini anlamanıza yardımcı olur. Ayrıntılı bilgi edinmek isterseniz Uyarılar düğümünü genişleterek uyarılara göre harekete geçin.

Daha fazla bilgi edinmek için Derleme hızı regresyonlarını belirleme bölümünü okuyun.

D8 ve R8'de Java 8 kitaplığının suyunu arındırma

Android Gradle eklentisi artık Java 8'in kullanılmasını desteklemektedir .

Android Studio'da, DEX derleyicisi olan D8, desugaring adlı bir işlemle 3.0 ve üzeri sürümler Java 8 dil özellikleri için zaten önemli destek sağlıyordu (ör. lambda ifadeleri, varsayılan arayüz yöntemleri, kaynaklarla deneyin ve daha fazla). Android Studio 4.0'da, şekeri çıkarma motoru, bu sürümlerin API'lerini kullanıma sunduk. Bu, artık standart e-ticaret özelliğini de yalnızca son Android sürümlerinde kullanılabilen language API'leri (örneğin, java.util.streams) kaldırın.

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} grubuna yapılan son eklemeler
  • İsteğe bağlı (java.util.Optional, java.util.OptionalInt ve java.util.OptionalDouble) ve yukarıdakilerle faydalı başka bazı yeni sınıflar API'ler
  • java.util.concurrent.atomic işlevine yapılan bazı eklemeler (yeni yöntemler açık AtomicInteger, AtomicLong ve AtomicReference)
  • ConcurrentHashMap (Android 5.0 için hata düzeltmeleriyle birlikte)

D8, bu dil API'lerini desteklemek için eksik API'lerin bir uygulamasını içerir ve uygulamanıza ekler. İlgili içeriği oluşturmak için kullanılan sadeleştirme işlemi, uygulamanızın kodunu yeniden yazar ve şurada bu kitaplığı kullanır: belirler.

Bu dil API'lerinin desteğini etkinleştirmek için aşağıdakileri ekleyin: app modülünün build.gradle dosyası:

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 bir kitaplık modülünün build.gradle dosyasına

  • Kitaplık modülünün araçlı testleri, şu dil API'lerini kullanır (veya veya kitaplık modülü ya da bağımlılıkları) üzerinden satın alabilirsiniz. Böylece, eksik API'ler, araçlarlı test APK'nız için sağlanır.

  • Kitaplık modülünde lint'i ayrı olarak çalıştırmak istiyorsunuz. Bu öneri, Dil API'lerinin geçerli kullanımlarını lint tanıma ve yanlışlık bildirmeden kaçınma uyarılar.

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

Android Gradle eklentisi 4.0.0, hangi derleme özelliklerini kontrol edeceğinizin yeni bir yolunu sunuyor istediğiniz verileri (ör. Görünüm Bağlama ve Veri Bağlama) seçin. Eklenen yeni özellikler varsayılan olarak devre dışı bırakılır. Şunları yapabilirsiniz: daha sonra, yalnızca istediğiniz özellikleri etkinleştirmek için buildFeatures bloğunu kullanın ve projenizin derleme performansını optimize etmenize yardımcı olur. Bu ayarı, modül düzeyindeki build.gradle dosyasındaki her modül için aşağıdaki gibi seçenekler sunulur:

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

Tüm modüllerde bu özellikler için varsayılan ayarı da belirleyebilirsiniz aşağıdakilerin birini ya da daha fazlasını projenizin kapsamına dahil ederek gradle.properties dosyası, aşağıda gösterildiği gibidir. Ancak anahtar kelimeleri kullanmaya devam etmek için Bunları geçersiz kılmak için modül düzeyindeki build.gradle dosyasında buildFeatures bloğu varsayılan ayarlara sahip olur.

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 üzerinde ö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ı olabilir. Android Gradle eklentisi kullanırken 4.0.0 sürümüne geçerken artık başka bir özelliğe bağlı olan bir özellik modülü ekleyebilirsiniz modülünü kullanabilirsiniz. Yani bir :video özelliği, aşağıda gösterildiği gibi temel modüle bağlı olan :camera özelliği aşağıdaki şekilde görebilirsiniz.

Özellik bağımlılıklarında özellik

:video özellik modülü, özelliğe bağlıdır :camera (temel :app modülüne bağlıdır).

Bu, uygulamanız bir özellik modülü indirmek istediğinde Bu uygulama, bağımlı olduğu diğer özellik modüllerini de indirir. Siz oluştur özellik modülleri uygulamanız için, modülün sayfasında özellik üzerinde özellik bağımlılığı build.gradle dosyası. Örneğin, :video modülü :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')
  ...
}
// 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 (bu özelliği Çalıştır yapılandırmasını desteklerken) örnek) Yardım > Menü çubuğundan Özel Sanal Makine Seçeneklerini düzenleyin aşağıdakiler dahil:

-Drundebug.feature.on.feature=true

Bağımlılık meta verileri

Android Gradle eklentisi 4.0.0 ve sonraki sürümleri kullanarak uygulamanızı oluştururken eklenti, oluşturduğunuz bağımlılıkları tanımlayan meta verileri içerir. uygulamasını indirin. Play Console, uygulamanızı yüklerken bu meta verileri inceleyerek size şu avantajları sağlar:

  • Uygulamanızın kullandığı SDK'lar ve bağımlılıklarla ilgili bilinen sorunlar hakkında uyarılar alın
  • Bu sorunları çözmek için uygulanabilir geri bildirimler alın

Veriler bir Google Play imzalama anahtarı tarafından sıkıştırılır, şifrelenir ve sürüm uygulamanızın imza bloğu. Ancak meta verileri inceleyebilirsiniz. şu dizindeki yerel ara derleme dosyalarını kullanabilirsiniz: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt

Bu bilgileri paylaşmak istemiyorsanız aşağıdaki adımları uygulayın:build.gradle

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ı içe aktarabilirsiniz bu stratejileri kullanabilirsiniz. Yapılandırma adımlarını uyguladığınızda aşağıda açıklandığı gibi Gradle, bu yerel kitaplıkları otomatik olarak CMake gibi harici yerel derleme sisteminizle kullanabilirsiniz. Yalnızca Gradle'ın bu kitaplıkları derlemeniz için kullanılabilir hale getirir; yine de komut dosyaları oluşturabilirsiniz.

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

Her bağımlılık en fazla bir Prefab paketi ortaya çıkarabilir. Bu paket, üzerinde çalışıyoruz. Prefabrik modülü tek bir kitaplıktır. statik veya yalnızca başlıktan oluşan bir kitaplıktan oluşur.

Genellikle paket adı Maven yapısı adıyla ve modül adıyla eşleşir kitaplık adıyla eşleşir, ancak bu her zaman doğru olmaz. Çünkü bazı durumlarda kitaplıkların paket ve modül adlarını öğrenirseniz, bağımlılık belgelerini inceleyerek, bu adların

Harici yerel derleme sisteminizi yapılandırma

Uygulamanız gereken adımları görmek için harici yerel derleme sistemiyle ilgili aşağıdaki adımları uygulayın planlarsınız.

Uygulamanızın yerel kod içeren AAR bağımlılıklarının her biri, ndk-build projenize aktarmanız gereken Android.mk dosya. Siz içe aktardınız bu dosyayı, izlediğiniz yolları arayan import&endash;module komutunu kullanarak ndk-build projenizde import&endash;add&endash;path özelliğini kullanarak belirtin. Örneğin, Örneğin, uygulamanız libapp.so öğesini tanımlıyorsa ve curl kullanıyorsa Android.mk dosyanıza aşağıdakileri içermelidir:

  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. Bu değer, şu durumlarda Gradle tarafından otomatik olarak ayarlanacaktır: CMake çağrılır. Bu nedenle, derleme sisteminiz bu değişkeni değiştiriyorsa bir öğedir.

Her bağımlılık, CMake derlemenize bir yapılandırma dosyası paketi{: .external} sunar. find_package{: .external} komutuyla içe aktarabilirsiniz. Bu komut, yapılandırma dosyasını arar. belirtilen paket adı ve sürümüyle eşleşen ve hedefleri gösteren paketler kullanılacak kodu tanımlar. Örneğin, uygulamanız libapp.so ve curl kullanıyorsa aşağıdaki öğeleri CMakeLists.txt dosyası:


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" belirtebilirsiniz. Projenizi oluşturduğunuzda harici yerel derleme sisteminiz libapp.so bağlantısını otomatik olarak bağlar APK veya uygulama paketindeki libcurl.so ve libcurl.so paketlerine karşı. Örneğin, daha fazla bilgi için curl prefabrik örneğine{:.external} bakın.

Davranış değişiklikleri

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

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

signingConfig bloğundaki uygulama imzalama yapılandırmaları davranışına göre şu şekilde değiştirildi:

v1 imzalama

  • v1SigningEnabled açıkça etkinleştirildiyse AGP, v1 uygulama imzalamayı gerçekleştirir.
  • v1SigningEnabled, kullanıcı tarafından açıkça devre dışı bırakılırsa v1 uygulama imzalama özelliği gerçekleştirilmedi.
  • Kullanıcı v1 imzalamasını açıkça etkinleştirmediyse bu işlem otomatik olarak minSdk ve targetSdk temel alınarak devre dışı bırakıldı.

v2 imzalama

  • v2SigningEnabled açıkça etkinleştirildiyse AGP, v2 uygulama imzalamayı gerçekleştirir.
  • v2SigningEnabled, kullanıcı tarafından açıkça devre dışı bırakılırsa v2 uygulama imzalama özelliği gerçekleştirilmedi.
  • Kullanıcı v2 imzalamayı açıkça etkinleştirmediyse bu, otomatik olarak targetSdk adresine göre devre dışı bırakıldı.

Bu değişiklikler, AGP'nin imzalama mekanizmasını devre dışı bırakarak derlemeleri optimize etmesini sağlar. kullanıcının açık bir şekilde bu işaretleri etkinleştirip etkinleştirmediğine göre. Bundan önce nedeniyle, v1Signing açık bir şekilde devre dışı bırakılmış olsa bile Bu da kafa karıştırıcı olabilir.

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

Android Gradle eklentisi 3.6.0, Özellik eklentisini kullanımdan kaldırdı (com.android.feature) ve Hazır Uygulama eklentisi (com.android.instantapp) inç Dynamic Feature eklentisini kullanmayı tercih etme (com.android.dynamic-feature) kullanarak Android App Bundle'ları kullanan hazır uygulamalar.

Android Gradle eklentisi 4.0.0 ve sonraki sürümlerde, kullanımdan kaldırılan bu eklentiler tamamen kaldırıldı. Bu nedenle, en yeni Android Gradle eklentisini kullanmak için Android Gradle eklentisini Android Uygulamasını destekleyecek hazır uygulamanız Paketler. Hazır uygulamalarınızı taşıyarak uygulamanın sunduğu avantajlardan yararlanabilirsiniz. ve uygulamanızın modüler yapısını tasarım bölümüne gidin.

Not: Kaldırılan eklentileri kullanan projeleri açmak için Android Studio 4.0 ve sonraki sürümleri, proje Android Gradle eklentisi kullanmalıdır 3.6.0 veya daha eski sürümler.

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

Ek açıklama işlemeyi özel bir göreve ayırma özelliği, emin olun. Bu seçenek, ek açıklama işlemcileri kullanıldığında artımlı Java derlemesi yalnızca Java projelerinde kullanılır; ayarlandıktan sonra bu özellik android.enableSeparateAnnotationProcessing - true gradle.properties dosyası, artık çalışmıyor.

Bunun yerine ek açıklama kullanarak ek açıklamaya işleyenlerin geliştirmenizi sağlar.

includeCompileClasspath desteği sonlandırıldı

Android Gradle eklentisi artık ek açıklama işlemcilerini kontrol etmiyor veya içermiyor ve annotationProcessorOptions.includeCompileClasspath DSL mülkünde artık şu öğe yok: herhangi bir efekti olabilir. Derleme sınıf yoluna ek açıklama işlemcileri eklerseniz şu hatayı alabilirsiniz:

Error: Annotation processors must be explicitly declared now.

Bu sorunu çözmek için annotationProcessor bağımlılık yapılandırmasını kullanan build.gradle dosyaları. Daha fazla bilgi için Ek açıklama ekleme işleyenler hakkında daha fazla bilgi edinin.

Önceden oluşturulmuş bağımlılıkları otomatik olarak paketleme CMake tarafından kullanılıyor

Android Gradle Eklentisi'nin önceki sürümleri, CMake harici yerel derlemeniz tarafından kullanılan önceden oluşturulmuş kitaplıkları jniLibs kullanılıyor. Şurada kütüphaneleriniz olabilir: src/main/jniLibs dizininde veya build.gradle dosyanızda yapılandırılan diğer dizin:

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'da yukarıdaki yapılandırma artık gerekli değildir ve bir 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 bunları otomatik olarak paketler bu nedenle kitaplığı jniLibs ile açık bir şekilde sunmak kopya. Derleme hatasını önlemek için önceden oluşturulmuş kitaplığı bir konuma taşıyın jniLibs dışına çıkın veya jniLibs yapılandırmasını build.gradle cihazınızdan kaldırın dosyası olarak kaydedebilirsiniz.

Bilinen sorunlar

Bu bölümde, Android Gradle eklentisi 4.0.0'da bulunan bilinen sorunlar açıklanmaktadır.

Gradle çalışan mekanizmasındaki yarış durumu

Android Gradle eklentisi 4.0'daki değişiklikler Gradle'da bir yarış koşulunu tetikleyebilir &endash;&endash;no&endash;daemon ve Gradle 6.3 veya daha eski sürümleriyle çalışırken sabitlenmesine olanak tanır.

Bu sorun Gradle 6.4'te düzeltilecektir.