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

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

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

単一のライブラリとして配布するメリットは次のとおりです。

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

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

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

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

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

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

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

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 {

}

依存関係を追加する

融合ライブラリのコア機能は、依存関係をバンドルすることです。このプラグインは、ローカル プロジェクトの依存関係と外部ライブラリの追加をサポートしています。パッケージ化する依存関係を指定するには、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 '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 '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 は新しいプラグインであり、すべてのユースケースを満たすために対応中の既知の問題があります。

  • ソース JAR ファイルを生成できない
  • 他の .aar ファイルへのファイル依存関係を追加する
  • RenderScript と Prefab アーティファクトの融合はサポートされていません

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

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

内部プラグインの依存関係に関する追加情報を取得するには、gradle :dependencies タスクを実行してプラグイン構成の状態を表示します。