Android Gradle Eklentisi 3.6.0 (Şubat 2020)
Android eklentisinin bu sürümü için gerekenler:
-
Gradle 5.6.4. Daha fazla bilgi edinmek için Gradle'ı güncelleme bölümünü okuyun.
-
SDK Derleme Araçları 28.0.3 veya sonraki sürümler.
Bu küçük güncelleme, Android 11'de paket görünürlüğü ile ilgili yeni varsayılan ayarlar ve özelliklerle uyumluluğu destekler.
Ayrıntılar için 4.0.1 sürüm notlarına bakın.
Yeni özellikler
Android Gradle eklentisinin bu sürümü aşağıdaki yeni özellikleri içerir.
Görünüm Bağlama
Görünüm bağlama, kodunuzdaki görünümlere başvururken derleme zamanı güvenliği sağlar. Artık findViewById()
öğesini, otomatik oluşturulan bağlama sınıfı referansıyla değiştirebilirsiniz. Görünüm bağlamayı kullanmaya başlamak için her bir modülün build.gradle
dosyasına aşağıdaki kodu ekleyin:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
Daha fazla bilgi edinmek için Bağlama belgelerini okuyun.
Maven Publish eklentisi için destek
Android Gradle eklentisi, derleme yapılarını Apache Maven deposunda yayınlamanıza olanak tanıyan Maven Publish Gradle eklentisi için destek içerir. Android Gradle eklentisi, uygulama veya kitaplık modüllerinizdeki her derleme varyantı yapısı için bir bileşen oluşturur. Bu bileşeni kullanarak, bir yayını Maven deposuna göre özelleştirebilirsiniz.
Daha fazla bilgi edinmek için Maven Publish eklentisinin nasıl kullanılacağı ile ilgili sayfaya gidin.
Yeni varsayılan sunum aracı
Eklenti, uygulamanızın hata ayıklama sürümünü oluştururken APK'nızı oluşturmak için zipflinger adlı yeni bir paketleme aracı kullanır. Bu yeni araç, derleme hızında iyileştirmeler sağlayacaktır. Yeni paketleme aracı beklediğiniz gibi çalışmıyorsa lütfen hata bildiriminde bulunun. gradle.properties
dosyanıza aşağıdakileri ekleyerek eski paketleme aracını kullanmaya geri dönebilirsiniz:
android.useNewApkCreator=false
Yerel derleme ilişkilendirmesi
Artık Clang'ın projenizdeki her C/C++ dosyasını oluşturup bağlaması için gereken süreyi belirleyebilirsiniz. Gradle, bu derleyici etkinliklerine ait zaman damgalarını içeren bir Chrome izlemesi oluşturabilir. Böylece projenizi oluşturmak için gereken süreyi daha iyi anlayabilirsiniz. Bu derleme ilişkilendirme dosyasının çıktısını almak için aşağıdakileri yapın:
-
Gradle derlemesi çalıştırırken
-Pandroid.enableProfileJson=true
işaretini ekleyin. Örneğin:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Chrome tarayıcıyı açın ve arama çubuğuna
chrome://tracing
yazın. -
Yükle düğmesini tıklayın ve dosyayı bulmak için
<var>project-root</var>/build/android-profile
konumuna gidin. Dosyanın adıprofile-<var>timestamp</var>.json.gz
.
Yerel derleme ilişkilendirme verilerini görüntüleyicinin üst kısmına yakın bir yerde görebilirsiniz:
Davranış değişiklikleri
Eklentinin bu sürümünü kullanırken davranışta aşağıdaki değişikliklerle karşılaşabilirsiniz.
Varsayılan olarak sıkıştırılmamış şekilde paketlenmiş yerel kitaplıklar
Uygulamanızı oluştururken, eklenti artık extractNativeLibs
öğesini varsayılan olarak "false"
değerine ayarlar. Diğer bir deyişle, yerel kitaplıklarınız sayfa hizalanır ve sıkıştırılmamış olarak paketlenir. Bu, yükleme boyutunun daha büyük olmasına neden olsa da kullanıcılarınız şunlardan faydalanır:
- Platform, kitaplıkların kopyasını oluşturmadan doğrudan yüklü APK'dan yerel kitaplıklara erişebildiğinden daha küçük uygulama yükleme boyutu.
- APK'nıza veya Android App Bundle'ınıza sıkıştırılmamış yerel kitaplıklar eklediğinizde Play Store sıkıştırması genellikle daha iyi sonuç verir. Bu nedenle, indirme boyutu daha küçüktür.
Android Gradle eklentisinin bunun yerine sıkıştırılmış yerel kitaplıkları paketlemesini istiyorsanız aşağıdakileri uygulamanızın manifest dosyasına ekleyin:
<application
android:extractNativeLibs="true"
... >
</application>
Not: extractNativeLibs
manifest özelliği, useLegacyPackaging
DSL seçeneğiyle değiştirildi. Daha fazla bilgi için Sıkıştırılmış yerel kitaplıkları paketlemek için DSL'yi kullanma adlı sürüm notuna bakın.
Varsayılan NDK sürümü
NDK'nın birden fazla sürümünü indirirseniz Android Gradle eklentisi artık kaynak kodu dosyalarınızı derlerken kullanılacak varsayılan sürümü seçiyor.
Eklenti önceden NDK'nın indirilen en son sürümünü seçiyordu.
Eklentinin seçtiği varsayılan değeri geçersiz kılmak için modülün build.gradle
dosyasındaki android.ndkVersion
özelliğini kullanın.
Basitleştirilmiş R sınıfı oluşturma
Android Gradle eklentisi, projenizdeki her kitaplık modülü için yalnızca bir R sınıfı oluşturarak ve bu R sınıflarını diğer modül bağımlılıklarıyla paylaşarak derleme sınıf yolunu basitleştirir. Bu optimizasyon, derlemelerin daha hızlı olmasını sağlar ancak aşağıdakileri göz önünde bulundurmanız gerekir:
- Derleyici, R sınıflarını yukarı akış modülü bağımlılıklarıyla paylaştığından projenizdeki her modülün benzersiz bir paket adı kullanması önemlidir.
- Bir kitaplığın R sınıfının diğer proje bağımlılıklarına görünürlüğü, kitaplığı bağımlılık olarak dahil etmek için kullanılan yapılandırma tarafından belirlenir. Örneğin, A Kitaplığı "api" bağımlılığı olarak B Kitaplığı'nı içeriyorsa A Kitaplığı ve A Kitaplığı'na bağlı olan diğer kitaplıklar, Kitaplığı B'nin R sınıfına erişebilir. Ancak diğer kitaplıklar, B Kitaplığı'nın R sınıfına erişemeyebilir. A Kitaplığı,
implementation
bağımlılık yapılandırmasını kullanıyorsa. Daha fazla bilgi edinmek için bağımlılık yapılandırmaları hakkındaki bilgileri okuyun.
Varsayılan yapılandırmada eksik olan kaynakları kaldırın
Kitaplık modüllerinde, varsayılan kaynak grubuna dahil etmediğiniz bir dil için kaynak eklerseniz (örneğin, /values-es/strings.xml
içinde dize kaynağı olarak hello_world
ekler ancak bu kaynağı /values/strings.xml
içinde tanımlamazsanız) Android Gradle eklentisi projenizi derlerken artık bu kaynağı içermez. Bu davranış değişikliği, daha az Resource Not Found
çalışma zamanı istisnasına neden olacak ve derleme hızını artıracaktır.
D8 artık ek açıklamalar için CLASS saklama politikasına uyuyor
D8, uygulamanızı derlerken artık ek açıklamaların CLASS saklama politikası uyguladığını dikkate alıyor ve bu ek açıklamalar çalışma zamanında kullanılamıyor. Bu davranış, daha önce Android Gradle eklentisinin ve D8'in eski sürümlerini kullanarak uygulamanızı derlerken çalışma zamanı sırasında bu ek açıklamalara erişime izin veren API düzeyi 23'e ayarlanır.
Diğer davranış değişiklikleri
-
aaptOptions.noCompress
artık tüm platformlarda (hem APK hem de paketler için) büyük/küçük harfe duyarlı değildir ve büyük harfli karakterlerin kullanıldığı yollara uyar. -
Veri bağlama artık varsayılan olarak artımlı. Daha fazla bilgi edinmek için 110061530 numaralı sorunu inceleyin.
-
RoboElektrik birim testleri de dahil olmak üzere tüm birim testleri artık tamamen önbelleğe alınabilir. Daha fazla bilgi edinmek için 115873047 numaralı sorunu inceleyin.
Hata düzeltmeleri
Android Gradle eklentisinin bu sürümü aşağıdaki hata düzeltmelerini içerir:
- Robolectric birim testleri, artık veri bağlama kullanan kitaplık modüllerinde desteklenmektedir. Daha fazla bilgi edinmek için 126775542 numaralı sorunu inceleyin.
- Artık Gradle'ın paralel yürütme modu etkinken
connectedAndroidTest
görevlerini birden fazla modülde çalıştırabilirsiniz.
Bilinen sorunlar
Bu bölümde, Android Gradle eklentisinin 3.6.0 sürümünde bulunan bilinen sorunlar açıklanmaktadır.
Android Lint görevinin performansı yavaş
Ayrıştırma altyapısındaki bir regresyon nedeniyle Android Lint'in bazı projelerde tamamlanması çok daha uzun sürebilir. Bu da belirli kod yapılarında lambda için tahmin edilen türlerin daha yavaş hesaplamasına neden olur.
Sorun, IDEA'da bir hata olarak bildirilmiş olup Android Gradle Plugin 4.0'da düzeltilecektir.
Manifest sınıfı eksik {:#agp-missing-manifest}
Uygulamanız manifest dosyasında özel izinler tanımlıyorsa Android Gradle eklentisi genellikle özel izinlerinizi dize sabitleri olarak içeren bir Manifest.java
sınıfı oluşturur. Eklenti, bu sınıfı uygulamanızla birlikte paketler. Böylece, çalışma zamanında bu izinlere daha kolay başvurabilirsiniz.
Android Gradle eklentisi 3.6.0'da manifest sınıfı oluşturma işlemi çalışmıyor.
Uygulamanızı eklentinin bu sürümüyle derliyorsanız ve bu sürüm manifest sınıfına referans veriyorsa bir ClassNotFoundException
istisnasıyla karşılaşabilirsiniz. Bu sorunu çözmek için aşağıdakilerden birini yapın:
-
Özel izinlerinize tam nitelikli adlarıyla referans verin. Örneğin,
"com.example.myapp.permission.DEADLY_ACTIVITY"
. -
Kendi sabitlerinizi aşağıda gösterildiği gibi tanımlayın:
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }