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

Birçok modülün bulunduğu projelerde, net bir proje yapısı sürdürmeye ç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 sunulan Birleşik Kitaplık eklentisi, birden fazla Android Kitaplığı modülünü tek bir yayınlanabilir Android Kitaplığı'na paketlemenize yardımcı olur. Bu sayede, kitaplığınızın kaynak kodunu ve derlemenizdeki kaynakları dilediğ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.
  • Küçük kitaplık boyutu: Kod daraltmayı iyileştirebilir ve daha küçük AAR'lara yol açabilir
  • 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ü myFusedLibrary olarak adlandırılır.

  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ında [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ında, eklentiler bloğuna alias(libs.plugins.android.fusedlibrary) apply false ekleyin.
  5. myFusedLibrary modülü oluşturmak için myFusedLibrary adlı yeni bir dizin oluşturun ("Uygulamam"ı sağ tıklayın > Yeni > Dizin).
  6. myFusedLibrary modülünde bir build.gradle.kts dosyası oluşturun (myFusedLibrary modülünü sağ tıklayın > Yeni > Dosya).
  7. Aşağıdakileri 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ıklar ekleme

Birleştirilmiş kitaplığın temel işlevi, bağımlılıkları gruplandırmaktır. Bu eklenti, yerel proje bağımlılıkları ve harici kitaplıklar eklemeyi 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'
}
başlıklı makaleyi inceleyin.

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 Yayınlama Eklentisi, Fused Library eklentisinin uygulandığı tüm modüllere de uygulanmalıdır.
  • Yayın, birleştirilmiş kitaplık yapısını derlemek için gereken bağımlılıkları sağladığından fusedLibraryComponent öğesinden devralınmalıdır.

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

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

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

Birleştirilmiş kitaplık yapılarını yerel bir depoya 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 bölümüne bakın.

Davranış ve önlemler

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

  • Birleştirilmiş kitaplıklar, bağımlı olarak eklenebilmeleri için yalnızca Android kitaplık yapıtı 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ü ve ürün çeşidi 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 sağlamak için eklenti, belirsiz çakışmalarda derlemeyi geçersiz kılar veya yapıları birleştirirken sezgisel yöntemler kullanır. Yapıların nasıl birleştirildiğine dair ayrıntıları aşağıdaki tabloda bulabilirsiniz:

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

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Java Kaynakları Birden fazla kitaplıkta aynı yola sahip Java kaynak dosyalarına izin verilmez ve bu durum derleme hatasıyla sonuçlanır.

Bilinen sorunlar

Birleştirilmiş Kitaplık yeni bir eklentidir ve tüm kullanım alanlarını karşılamak için üzerinde çalıştığımız bilinen sorunlar vardır.

  • lint.jar dosyaları birleştirilmiş AAR'a dahil edilmez
  • Diğer .aar dosyalarına dosya bağımlılıkları ekleme
  • RenderScript ve Prefab yapılarının birleştirilmesi desteklenmez

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

Birleştirilmiş kitaplığın kaynağı yoktur ve tek kaynağı olarak Android kitaplıklarını etkili bir şekilde kullanır. Bu nedenle, hangi kaynağın nereden geldiğini anlamanız önemlidir. Sonuçta ortaya çıkan yapıyla birleştirilen bağımlılıkları ve yapıyı 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 bilgi için eklenti yapılandırmalarının durumunu görüntülemek üzere gradle :dependencies görevini çalıştırın.