カスタム ビルドロジックを適用する

このセクションでは、Android Gradle プラグインの拡張や独自のプラグインの作成に役立つトピックについて詳しく説明します。

バリアント依存関係をカスタム ロジックに公開する

ライブラリに、他のプロジェクトまたはサブプロジェクトで使用したい機能が含まれていることがあります。ライブラリの公開とは、ライブラリが他で使用できるようにするためのプロセスです。ライブラリは、コンパイル時および実行時にアクセスできる依存関係を制御できます。

各クラスパスの推移的な依存関係を保持するために、2 つの異なる構成を使用します。これらはライブラリの利用元により、以下のようにして使用される必要があります。

  • variant_nameApiElements: この構成は、コンパイル時に使用できる推移的な依存関係を保持します。
  • variant_nameRuntimeElements: この構成は、実行時に使用できる推移的な依存関係を保持します。

異なる構成間の関係について詳しくは、Java ライブラリ プラグイン 構成をご覧ください。

カスタム依存関係の解決方針

同じライブラリの 2 つのバージョンへの依存関係がプロジェクトに含まれていることがあります。その場合、依存関係の競合が発生することがあります。たとえば、プロジェクトがモジュール A のバージョン 1 とモジュール B のバージョン 2 に依存し、モジュール A がモジュール B のバージョン 3 に推移的に依存している場合、依存関係のバージョン競合が発生します。

こうした競合を解決するため、Android Gradle プラグインは、「依存関係グラフで同じモジュールの異なるバージョンを検出したときは、デフォルトでバージョン番号が最も大きいものを選択する」という依存関係の解決方針をとります。

ただし、この方針は常に意図したとおりの結果をもたらすとは限りません。依存関係の解決方針をカスタマイズするには、次の構成を使用して、タスクで必要なバリアントの特定の依存関係を解決します。

  • variant_nameCompileClasspath: この構成では、指定したバリアントのコンパイル クラスパスのための解決方針が指定されます。
  • variant_nameRuntimeClasspath: この構成では、指定したバリアントのランタイム クラスパスのための解決方針が指定されます。

Android Gradle プラグインには、各バリアントの構成オブジェクトにアクセスするための getter が用意されています。したがって、次の例に示すように、バリアント API を使用して依存関係の解決をクエリできます。

Kotlin

android {
    applicationVariants.all {
        // Return compile configuration objects of a variant.
        compileConfiguration.resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        runtimeConfiguration.resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        annotationProcessorConfiguration.resolutionStrategy {
            ...
        }
    }
}

Groovy

android {
    applicationVariants.all { variant ->
        // Return compile configuration objects of a variant.
        variant.getCompileConfiguration().resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        variant.getRuntimeConfiguration().resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        variant.getAnnotationProcessorConfiguration().resolutionStrategy {
            ...
        }
    }
}