Android Gradle Plugin API güncellemeleri

Bu sayfada, Android Gradle eklentisi (AGP) API için desteğin sonlandırılması ve kaldırılması izlenmekte ve kodunuzu uygun şekilde nasıl güncelleyeceğiniz hakkında bilgiler verilmektedir.

API'leri kullanımdan kaldırma ve kaldırma izleyicisi

Aşağıdaki tabloda, AGP API'lerin ne zaman kullanımdan kaldırıldığı ve kaldırıldığı zaman AGP sürümü bağlamında özetlenmiştir.

API AGP sürümünde kullanımdan kaldırıldı AGP sürümünden kaldırıldı
Component.setAsmFramesComputationMode 7,2
Component.transformClassesWith 7,2
RenderScript 7,2
Dönüşüm 7,2 8.0

AGP 8,0

Aşağıda, AGP 8.0 için önemli API güncellemeleri verilmiştir.

Transform API kaldırıldı

AGP 8.0'dan itibaren Transform API'si kaldırılmıştır. Bu durumda, com.android.build.api.transform paketindeki tüm sınıflar kaldırılır.

Transform API, derleme performansını iyileştirmek için kaldırılıyor. Transform API AGP'yi kullanan projeler, derleme için daha az optimize edilmiş bir akış kullanmaya başlar. Bu durum, derleme sürelerinde büyük regresyonlara yol açabilir. Transform API'yi kullanmak ve diğer Gradle özellikleriyle birleştirmek de zordur. Bunların yerine gelecek API'ler, performans veya düzeltme sorunları oluşturmadan AGP'nin genişletilmesini kolaylaştırmayı amaçlar.

Yedek API'ler

Transform API'nin tek bir alternatifi yoktur. Her kullanım alanı için yeni ve hedeflenmiş API'ler vardır. Tüm yedek API'ler androidComponents {} bloğundadır. Bu API'lerin tümü AGP 7.2 tarafından kullanılabilir.

Bayt kodunu dönüştürme desteği

Bayt kodunu dönüştürmek için Instrumentation API'yi kullanın. Kitaplıklarda bir aracı yalnızca yerel proje sınıfları için kaydedebilirsiniz. Uygulamalar ve testlerde, araçları yalnızca yerel sınıflar veya yerel ve uzaktan bağımlılıklar dahil tüm sınıflar için kaydetmeyi seçebilirsiniz. Bu API'yi kullanmak için araçlar her sınıfta bağımsız olarak çalışır ve sınıf yolundaki diğer sınıflara sınırlı erişim sunar (daha fazla bilgi için bkz. createClassVisitor()). Bu kısıtlama, hem tam hem de artımlı derlemelerin performansını iyileştirir ve API yüzeyini basit tutar. Her kitaplık, tüm derleme tamamlandıktan sonra değil, hazır olduğunda paralel olarak ayarlanır. Ayrıca, tek bir sınıfta yapılan değişiklik, yalnızca etkilenen sınıfların artımlı bir derlemede yeniden uygulanması gerektiği anlamına gelir. Örneğin, Enstrümantasyon API'sinin nasıl kullanılacağıyla ilgili olarak Sınıfları ASM ile dönüştürme AGP tarifine bakın.

Uygulamanıza oluşturulmuş sınıflar ekleme desteği

Uygulamaya yeni oluşturulmuş sınıflar eklemek için Artifacts API'yi MultipleArtifact.ALL_CLASSES_DIRS ile kullanın. Özellikle,

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

MultipleArtifact.ALL_CLASSES_DIRS ile oluşturabilirsiniz. Artifacts API, özel göreviniz için otomatik olarak benzersiz bir konum seçer. Bu API'nin nasıl kullanılacağına dair bir örnek için addToAllClassroom tarifine bakın.

Tüm program analizine dayalı dönüşüm desteği

Tüm program analizine dayalı dönüşümler uygulamak için tüm sınıflar tek bir görevde birlikte dönüştürülebilir. Bu yaklaşım, Enstrümantasyon API'sini kullanmaya kıyasla çok daha yüksek bir derleme performansı maliyetine sahip olduğundan dikkatli bir şekilde kullanılmalıdır. Eklentiniz bu API'yi kullanıyorsa uygulama geliştiricisinin bunu geliştirme derlemeleri için devre dışı bırakabilmesi için dönüşümün her derleme türü için etkinleştirilmesi önerilir.

Tüm sınıfları dönüştüren bir görevi kaydetmek için Android Gradle eklentisi 7.4, Artifacts.forScope API'sini kullanıma sundu. Mevcut projedeki tüm sınıfları dönüştürmek için Artifacts.forScope.PROJECT kodunu kullanın. Mevcut projedeki tüm sınıfları, içe aktarılan projeleri ve tüm harici bağımlılıkları dönüştürmek için Artifacts.forScope.ALL kullanın. Aşağıdaki kod, tüm sınıfları birlikte dönüştüren bir görevi kaydetmek için Artifacts.forScope.ALL özelliğinin nasıl kullanılacağını gösterir:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

Bu API'nin nasıl kullanılacağıyla ilgili bir örnek için modifyProjectSınıf tarifine, özel uzantıların Android derleme türlerine nasıl kaydedileceğine dair bir örnek için customizeAgpDsl tarifine bakın.

Kullanım alanınız AndroidBileşenleri API'lerinin hiçbiri kapsamında değilse lütfen hata bildiriminde bulunun.

Firebase performans izleme eklentisi (1.4.1, AGP 8.0 ile uyumludur) ve Hilt Gradle eklentisi (2.40.1, AGP 8.0 ile uyumludur) dahil olmak üzere, yaygın olarak kullanılan birçok eklenti bu yeni API'leri kullanmak için halihazırda taşınmıştır. AGP Yükseltme Asistanı, proje geliştiricilerinin gerektiğinde yaygın olarak kullanılan eklentileri yükseltmesine de yardımcı olur.

Transform API'yi bir üçüncü taraf eklentisi aracılığıyla kullanıyorsanız lütfen yazarına, eklentisinin AGP 8.0 için yeni API'lerle çalışacak şekilde güncellenmesi gerektiğini bildirin.

AGP 7,2

Aşağıda, AGP 7.2 için önemli API güncellemeleri verilmiştir.

RenderScript desteği sonlandırıldı

RenderScript API'leri AGP 7.2'den itibaren kullanımdan kaldırılmıştır. Bunlar çalışmaya devam eder, ancak uyarı çağırır ve gelecekteki AGP sürümlerinde tamamen kaldırılır. RenderScript'ten geçiş yapma konusunda yardım için RenderScript'ten taşıma bölümüne bakın.

Component.transformClassesWith ve Component.setAsmFramesComputationMode desteği sonlandırıldı

AGP 7.2'den itibaren, sınıf bayt kodu enstrümantasyon API'leri Component.transformClassesWith ve Component.setAsmFramesComputationMode kullanımdan kaldırılmıştır. Ekip, araçlar işleminin yapılandırılmasıyla ilgili tüm API'leri içeren Component.instrumentation adlı yeni bir bloka taşındı. Bu araç özelliklerini kullanmaya devam etmek için yeni blokta aşağıdaki kod snippet'inde gösterildiği gibi ilgili API'leri kullanın:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }