Birleştirilmiş kitaplıkla birden fazla Android kitaplığını tek bir kitaplık olarak yayınlama

Çok sayıda modül içeren projelerde, net bir proje yapısını korumaya çalışırken Android kitaplıklarını kullanıcılarınıza dağıtmak zor olabilir. Çoğu durumda, amaçlanandan çok daha fazla kitaplığın yayınlanması gerekir.

Android Gradle eklentisiyle birlikte gelen Fused Library eklentisi, birden fazla Android kitaplık modülünü tek bir yayınlanabilir Android kitaplığına paketlemeye yardımcı olur. Bu sayede, kitaplığınızın kaynak kodunu ve kaynaklarını derlemenizde istediğiniz gibi modüler hale getirebilir, dağıtıldıktan sonra projenizin yapısının açığa çıkmasını önleyebilirsiniz.

Tek bir kitaplık olarak dağıtmanın aşağıdaki avantajları olabilir:

  • Basitleştirilmiş bağımlılıklar: Birden fazla kitaplık bağımlılığını tek bir AAR ile değiştirerek kullanıcılarınız için proje kurulumunu ve sürüm yönetimini kolaylaştırır.
  • Kitaplık boyutunun küçültülmesi: Kod daraltmayı iyileştirerek daha küçük AAR'ler elde edilmesini sağlayabilir.
  • Gelişmiş güvenlik: Yayınlanan kitaplıkların dahili uygulama ayrıntıları üzerinde daha iyi kontrol sağlayabilir.

Birleştirilmiş kitaplık oluşturma

Birleştirilmiş kitaplık oluşturmak için yeni bir Android modülü oluşturmanız, bağımlılıkları eklemeniz ve ardından birleştirilmiş kitaplığı yayınlamanız gerekir.

Yeni bir birleştirilmiş kitaplık modülü ekleme

Eklentiyi kullanmak için projenize yeni bir Android modülü eklemeniz gerekir:

Bu örnekte, birleştirilmiş kitaplık modülüne myFusedLibrary adı verilecek.

  1. gradle.properties dosyasına android.experimental.fusedLibrarySupport=true ekleyerek birleştirilmiş kitaplık desteğini etkinleştirin.
  2. include(":myFusedLibrary") adlı alanı settings.gradle.kts dosyasına ekleyin.
  3. gradle/libs.versions.toml dosyasındaki [plugins] bölümünün altına android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } ekleyin.
  4. Üst düzey build.gradle.kts dosyasındaki eklentiler bloğuna alias(libs.plugins.android.fusedlibrary) apply false simgesini ekleyin.
  5. myFusedLibrary modülünü oluşturmak için myFusedLibrary adlı yeni bir dizin oluşturun (My Application'ı sağ tıklayın > New > Directory).
  6. build.gradle.kts modülünde myFusedLibrary dosyası oluşturun (myFusedLibrary modülünü sağ tıklayın > Yeni > Dosya).
  7. Aşağıdaki kodu myFusedLibrary/build.gradle.kts dosyasına yapıştırın:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {
    namespace = "com.example.myFusedLibrary"
    minSdk = 21
}

dependencies { }

Groovy

plugins {
    id 'fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

Bağımlılık ekleme

Birleştirilmiş kitaplığın temel işlevi, bağımlılıkları paketlemektir. Eklenti, yerel proje bağımlılıklarının ve harici kitaplıkların eklenmesini destekler. Paketlenecek bağımlılıkları belirtmek için include yapılandırmasını kullanın. Geçişli bağımlılıklar paketlenmez.

Örneğin:

Kotlin

dependencies {
    include(project(":image-rendering"))
    include("mycoolfonts:font-wingdings:5.0")
}

Groovy

dependencies {
    include project(':image-rendering')
    include 'mycoolfonts:font-wingdings:5.0'
}

Birleştirilmiş kitaplığınızı yayınlama

Birleştirilmiş kitaplık yayınlamadan önce Android kitaplığı yayınlama hakkında bilgi edinmeniz gerekir. Birleştirilmiş kitaplık yayınlamak, Android kitaplığı yayınlamaya benzer. Ancak birleştirilmiş kitaplığı doğru şekilde yayınlamak için dikkate almanız gereken bazı önemli farklılıklar vardır:

  • Maven Publish Plugin, FusedLibrary eklentisinin uygulandığı tüm modüllere de uygulanmalıdır.
  • Yayın, fusedLibraryComponent öğesinden devralmalıdır. Çünkü bu, birleştirilmiş kitaplık yapısını derlemek için gereken bağımlılıkları sağlar.

Yayın yapılandırması örneğini aşağıda görebilirsiniz:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {  }

dependencies {  }

publishing {
    publications {
        register<MavenPublication>("release") {
             groupId = "my-company"
             artifactId = "my-fused-library"
             version = "1.0"
             from(components["fusedLibraryComponent"])
        }
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

androidFusedLibrary {  }

dependencies {  }

publishing {
    publications {
        release(MavenPublication) {
            groupId = "my-company"
            artifactId = "my-fused-library"
            version = "1.0"
            afterEvaluate {
            from components.fusedLibraryComponent
        }
    }
}

Test için birleştirilmiş kitaplığınızı yayınlama

Bir Android uygulamasından veya Android kitaplığından yayınlanmış birleştirilmiş kitaplığa bağlı olarak test yapmanız gerekir. Önerilen yöntem, birleştirilmiş kitaplığı ve proje bağımlılıklarını yerel bir Maven deposunda yayınlamaktır.

Birleştirilmiş kitaplık yapılarını yerel bir depoda yayınlamak için aşağıdakine benzer bir yapılandırma tanımlayın:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

repositories {
    maven {
        name = "myLocalRepo"
        url = uri(layout.buildDirectory.dir("myLocalRepo"))
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

repositories {
    maven {
        name 'myLocalRepo'
        url layout.buildDirectory.dir('myLocalRepo')
    }
}

Birleştirilmiş kitaplığınızı yükleme

Birleştirilmiş kitaplığınızı dağıtmak için Kitaplığınızı yükleme başlıklı makaleyi inceleyin.

Davranış ve güvenlik önlemleri

Android kitaplıklarını birleştirme işlemi, eklentinin öncelikler hakkında akıl yürütmesini zorlaştırabilecek karmaşık özellikler içerir. Örneğin, aynı sınıf yoluna sahip iki kitaplık, kitaplık birleştirilirken derleme hatasına neden olur. Kaynak birleştirme, farklı kitaplıklarda aynı ada sahip bir kaynak seçilirken belirtilen bağımlılıkların sırasını dikkate alır.

  • Bir bağımlı kaynak olarak eklenebilmesi için birleştirilmiş kitaplıklar yalnızca Android kitaplık artefaktı AAR olarak yayınlanabilir.
  • Veri bağlama kullanan kitaplıkların birleştirilmesi desteklenmez.
  • Tek bir birleştirilmiş kitaplıkta birden fazla derleme türünü ve ürün çeşidini birleştiremezsiniz. Farklı varyantlar için ayrı birleştirilmiş kitaplıklar oluşturun.

Gerekli yapılandırma miktarı ile kullanım kolaylığı arasında denge kurmak için eklenti, belirsiz çakışmalarda derlemeyi başarısız kılar veya yapay nesneleri birleştirirken sezgisel yöntemler kullanır. Yapıların nasıl birleştirildiğiyle ilgili ayrıntılar aşağıdaki tabloda verilmiştir:

Tür Davranış
Sınıflar Aynı sınıf yoluna sahip kitaplıklar, kitaplık birleştirilirken derleme hatasına neden olur.
Android Kaynakları Kaynak birleştirme, farklı birimlerde aynı ada sahip bir kaynak seçilirken belirtilen bağımlılıkların sırasını dikkate alır.
AAR meta verileri AAR meta veri sürümleri, her bağımlılık kitaplığındaki en yüksek değere öncelik verilerek birleştirilir. Bu değerleri geçersiz kılmak için bir DSL sağlanır.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Java Kaynakları Aynı yollara sahip birden fazla kitaplıktaki Java kaynak dosyalarına izin verilmez ve bu durum derleme hatasına neden olur.

Bilinen sorunlar

Fused Library yeni bir eklentidir ve tüm kullanım alanlarını karşılamak için üzerinde çalışılan bilinen sorunlar vardır.

  • Kaynak JAR dosyaları oluşturulamıyor
  • Diğer .aar dosyalarına dosya bağımlılıkları ekleme
  • RenderScript ve Prefab yapılarını birleştirme desteği yok

Birleştirilmiş kitaplığın bağımlılıklarını anlama

Birleştirilmiş kitaplığın kaynakları yoktur ve tek kaynak olarak Android kitaplıklarını etkili bir şekilde kullanır. Bu nedenle, neyin nereden geldiğini anlamak önemlidir. Sonuçta ortaya çıkan yapıtla birleştirilen bağımlılıkları ve yapıtı oluşturmak için gereken bağımlılıkları listelemek üzere birleştirilmiş kitaplıkta gradle :report görevini çalıştırın. Görevler, birleştirilmiş kitaplığın build/reports dizinine kaydedilen bir JSON raporu oluşturur.

Dahili eklenti bağımlılıklarıyla ilgili ek bilgiler için eklenti yapılandırmalarının durumunu görüntülemek üzere gradle :dependencies görevini çalıştırın.