複数の Android ライブラリを 1 つとして公開する(Fused Library)

モジュールが多数あるプロジェクトでは、明確なプロジェクト構造を維持しながら、Android ライブラリをユーザーに配布することが困難な場合があります。多くの場合、意図したよりも多くのライブラリを公開する必要があります。

Android Gradle プラグインにバンドルされている Fused Library プラグインは、複数の Android ライブラリ モジュールを 1 つの公開可能な Android ライブラリにパッケージ化するのに役立ちます。これにより、必要に応じてビルド内でライブラリのソースコードとリソースをモジュール化しながら、配布後にプロジェクトの構造が公開されるのを防ぐことができます。

単一のライブラリとして配布すると、次のようなメリットがあります。

  • 依存関係の簡素化: 複数のライブラリ依存関係を 1 つの AAR に置き換えることで、ユーザーのプロジェクト設定とバージョン管理を効率化します。
  • ライブラリ サイズの縮小: コード圧縮が改善され、AAR が小さくなる可能性があります。
  • セキュリティの向上: 公開されたライブラリの内部実装の詳細をより適切に制御できます。

統合ライブラリを作成する

統合ライブラリをビルドするには、新しい Android モジュールを作成し、依存関係を追加してから、統合ライブラリを公開する必要があります。

前提条件

統合ライブラリ プラグインを使用するには、AGP 9.0 以降を使用します。以前のバージョンの Fused Library プラグインには、AGP 9.0 で修正されたさまざまな動作と問題があります。

新しい統合ライブラリ モジュールを追加する

このプラグインを使用するには、プロジェクトに新しい Android モジュールを追加する必要があります。

この例では、統合ライブラリ モジュールは myFusedLibrary と呼ばれます。

  1. settings.gradle.kts ファイルに include(":myFusedLibrary") を追加します。
  2. gradle/libs.versions.toml ファイルの [plugins] セクションに android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } を追加します。
  3. 最上位の build.gradle.kts ファイルの plugins ブロックに alias(libs.plugins.android.fusedlibrary) apply false を追加します。
  4. myFusedLibrary モジュールを作成するには、myFusedLibrary という名前の新しいディレクトリを作成します([My Application] を右クリック > [New] > [Directory])。
  5. myFusedLibrary モジュールに build.gradle.kts ファイルを作成します(myFusedLibrary モジュールを右クリック > [New] > [File])。
  6. myFusedLibrary/build.gradle.kts ファイルに次の内容を貼り付けます。

Kotlin

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

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

dependencies { }

Groovy

plugins {
    id 'com.android.fused-library'
}

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

dependencies {

}

依存関係を追加する

統合ライブラリのコア機能は、依存関係をバンドルすることです。このプラグインは、ローカル プロジェクトの依存関係と外部ライブラリの追加をサポートしています。パッケージ化する依存関係を指定するには、include 構成を使用します。推移的な依存関係はパッケージ化されません。

次に例を示します。

Kotlin

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

Groovy

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

統合ライブラリを公開する

統合ライブラリを公開する前に、Android ライブラリの公開について理解しておく必要があります。統合ライブラリの公開は、Android ライブラリの公開と似ていますが、統合ライブラリを正しく公開するために考慮する必要がある重要な違いがいくつかあります。

  • Maven Publish プラグインは、Fused Library プラグインが適用されているモジュールにも適用する必要があります。
  • パブリケーションは fusedLibraryComponent から継承する必要があります。これは、統合ライブラリ アーティファクトのコンパイルに必要な依存関係を提供するためです。

パブリケーション構成の例を次に示します。

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 'com.android.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
        }
    }
}

テスト用に統合ライブラリを公開する

Android アプリまたは Android ライブラリから公開された統合ライブラリに依存してテストする必要があります。推奨される方法は、統合ライブラリとそのプロジェクトの依存関係をローカルの Maven リポジトリに公開することです。

統合ライブラリ アーティファクトをローカル リポジトリに公開するには、次のような構成を定義します。

Kotlin

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

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

Groovy

plugins {
    id 'com.android.fused-library'
    id 'maven-publish'
}

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

統合ライブラリをアップロードする

統合ライブラリを配布するには、ライブラリをアップロードするをご覧ください。

動作と安全対策

Android ライブラリの結合は複雑であるため、プラグインが優先度を判断するのが難しい場合があります。たとえば、同じクラスパスを持つ 2 つのライブラリを融合すると、ビルドエラーが発生します。リソースのマージでは、異なるライブラリで同じ名前のリソースを選択する際に、指定された依存関係の順序が考慮されます。

  • 融合ライブラリは、依存関係として追加するために、Android ライブラリ アーティファクト AAR としてのみ公開できます。
  • データ バインディングを使用するライブラリの統合はサポートされていません。
  • 1 つの統合ライブラリ内で複数のビルドタイプとプロダクト フレーバーを統合することはできません。バリアントごとに個別の統合ライブラリを作成する。

必要な構成量と使いやすさのバランスを取るため、プラグインは、あいまいな競合が発生した場合にビルドを失敗させるか、アーティファクトを融合する際にヒューリスティックを使用します。アーティファクトの融合方法の詳細は、次の表のとおりです。

タイプ 動作
クラス 同じクラスパスを持つライブラリは、ライブラリを融合する際にビルドエラーを引き起こします。
Android のリソース リソースの統合では、異なるリソースで同じ名前のリソースを選択するときに、指定された依存関係の順序が考慮されます。
AAR メタデータ AAR メタデータ バージョンは、各依存関係ライブラリの最大値を優先してマージされます。これらの値をオーバーライドするための DSL が用意されています。

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Java リソース 複数のライブラリで同じパスを持つ Java リソース ファイルは許可されず、ビルドエラーが発生します。

既知の問題

Fused Library は新しいプラグインであり、すべてのユースケースに対応するために、既知の問題への対応が進められています。問題が発生した場合は、バグを報告してください。

  • 問題 #454305444: 「proguard.txt」という名前ではないコンシューマー ProGuard ルールを含むライブラリが原因で、ビルドが失敗します。AGP 9.1 以降で修正されました。
  • 問題 #374982739: 他の .aar ファイルにファイル依存関係を追加する
  • 問題 #231433225: RenderScript アーティファクトと Prefab アーティファクトの融合がサポートされていない

統合ライブラリの依存関係を理解する

統合ライブラリにはソースがなく、Android ライブラリを唯一のソースとして効果的に使用します。何がどこから取得されるかを理解することが重要です。結果のアーティファクトにマージされる依存関係と、アーティファクトのビルドに必要な依存関係を一覧表示するには、融合ライブラリで gradle :report タスクを実行します。このタスクは、融合ライブラリの build/reports ディレクトリに保存される JSON レポートを生成します。

内部プラグインの依存関係に関する追加情報については、gradle :dependencies タスクを実行してプラグイン構成の状態を確認してください。