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

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

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

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

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

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

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

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

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

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

  1. android.experimental.fusedLibrarySupport=truegradle.properties ファイルに追加して、統合ライブラリのサポートを有効にします。
  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 モジュールを右クリック > [新規] > [ファイル])。
  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 のリソース リソースの統合では、異なる Namespace で同じ名前のリソースを選択するときに、指定された依存関係の順序が考慮されます。
AAR メタデータ AAR メタデータのバージョンは、各依存関係ライブラリの最大値を優先して統合されます。これらの値をオーバーライドするための DSL が用意されています。

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Java リソース 複数のライブラリに同じパスの Java リソース ファイルが存在することは許可されず、ビルドが失敗します。

既知の問題

統合ライブラリは新しいプラグインであり、すべてのユースケースに対応するために現在対応中の既知の問題があります。

  • lint.jar ファイルが統合された AAR に含まれていない
  • 他の .aar ファイルに対するファイル依存関係の追加
  • RenderScript アーティファクトと Prefab アーティファクトの統合はサポートされていません

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

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

内部プラグインの依存関係の詳細については、gradle :dependencies タスクを実行してプラグイン構成の状態を表示します。