ツールとライブラリの相互依存関係

ビルド依存関係は、プロジェクトを正常にビルドするために必要な外部コンポーネントです。ビルドは、ライブラリ、プラグイン、サブプロジェクト、Android SDK、KotlinJava コンパイラなどのツール、Android Studio などの開発環境、Gradle 自体に依存します。

各依存関係自体に他の依存関係が必要な場合があります。こうした依存関係は推移的依存関係と呼ばれ、アプリケーションで使用される依存関係全体は急速に増加しています。ライブラリ、ツール、Android SDK など、依存関係をアップグレードすると、そのアップグレードが連鎖的に発生し、他の多くの依存関係もアップグレードされる可能性があります。

多くのライブラリはセマンティック バージョニングというスキームに従っているため、多くの場合、これで問題はありません。これらのライブラリは、下位バージョンとの互換性を確保するために、行う変更のタイプを制限します。

セマンティック バージョニングは major.minor.patch 形式に従います。たとえば、バージョン番号 4.8.3 では、4 が major バージョン、8 が minor バージョン、3 が patch 番号です。major 部分が変更されると、ライブラリの API または動作に破壊的な変更が生じる可能性があります。これにより、ビルドまたはアプリケーションの動作に影響する可能性があります。

minor(新機能)または patch(バグ修正)の部分が変更された場合、ライブラリ デベロッパーは、ライブラリが引き続き互換性があり、アプリに影響しないことを示しています。

このような変更に注意することが重要です。いくつかの依存関係のアップグレード ツールが役立ちます。

ビルド内の関係

Android ビルドには、次の間の関係が含まれます。

  • ソースコード - 自分で管理できるコードとリソース
  • ライブラリの依存関係 - ビルド時にプロジェクトとサブプロジェクトに含める外部ライブラリまたはモジュール
  • ツール - ソースをアプリケーションまたはライブラリに変換するコンパイラ、プラグイン、SDK
依存関係とその関係を構築する
図 1.関係を構築する

ソースコード

ソースコードは、アプリケーションまたはライブラリで記述する Kotlin または Java コードです。(C++ の使用方法については、Android NDK をご覧ください)。

ソースコードはライブラリ(Kotlin および Java ランタイム ライブラリを含む)と Android SDK に依存し、対応する Kotlin または Java コンパイラを必要とします。

一部のソースコードには、追加の処理が必要なアノテーションが含まれています。たとえば、Jetpack Compose コードを記述する場合は、Compose Kotlin コンパイラ プラグインによって処理される必要がある @Composable などのアノテーションを追加します。その他のアノテーションは、Kotlin Symbol Processor(KSP)または別のアノテーション処理ツールによって処理されます。

ライブラリの依存関係

ライブラリには、アプリケーションの一部として取り込まれるバイトコードが含まれています。これには、Java JAR、Android ライブラリ(AAR)、ビルドのサブプロジェクトを指定できます。多くのライブラリはセマンティック バージョニングに準拠しており、アップグレード時に互換性が維持されるかどうかを把握できます。

ライブラリは、再利用のために他のライブラリに依存する場合があります。これは、推移的依存関係と呼ばれます。これにより、明示的に管理する必要がある依存関係が削減されます。直接使用する依存関係を指定すると、Gradle はこれらの推移的依存関係とともにそれらを pull します。直接依存関係をアップグレードすると、それらの推移的依存関係もアップグレードされる可能性があります。

ライブラリで、ランタイム(minSdk)またはコンパイル時(compileSdk)に Android SDK の最小バージョンが必要な場合があります。これは、ライブラリが Android SDK またはその提供の JDK API に含まれる関数を使用する場合に必要です。アプリの有効な minSdk は、アプリがリクエストする最も高い minSdk と、そのすべての直接的および推移的ライブラリ依存関係です。

一部のライブラリを使用するには、特定の Gradle プラグインが必要になる場合があります。多くの場合、これらのヘルパー プラグインは、ライブラリ機能の使用をサポートするためにコードの生成やソースのコンパイルの変更を行う Kotlin Symbol Processor やその他のアノテーション プロセッサをインストールします。たとえば、Jetpack Room には、アノテーションと KSP が含まれています。これらのアノテーションは、生成されたコードに変換され、データベース内のデータの取得と変更を行います。Jetpack Compose では、アノテーション付きの関数を変更して、その関数の再実行方法とタイミングを管理するために、Compose コンパイラ プラグインが必要です。

ツール

Gradle

Gradle は、ビルドファイルを読み取り、アプリやライブラリを生成して、プラグインの機能を拡張するための API を公開するビルドツールです。Gradle は 1 つ以上の Java 仮想マシンで複数のプロセスを実行し、その Java プラグインは JDK 内で Java ツールを呼び出します。

Gradle プラグイン

Gradle プラグインは、新しいタスクと構成を定義することで Gradle を拡張します。ビルドにプラグインを適用すると、ビルド スクリプト内でデータとして構成された特定のビルド機能が有効になります。Android ビルドで最も重要な Gradle プラグインは Android Gradle プラグイン(AGP)です。

コンパイラ

Kotlin または Java コンパイラは、ソースコードを実行可能なバイトコードに変換します。Kotlin コンパイラが公開しているプラグイン API を使用すると、コンパイラ内で直接、外部分析やコード生成を実行し、解析されたコード構造にアクセスできます。

コンパイラ プラグイン

コンパイラ プラグインは、Kotlin コンパイラがコードを分析している間、Kotlin コンパイラで分析とコード生成を行います。コンパイラ プラグインは、Gradle プラグインをビルドに適用するときにインストールされます。

Android SDK

Android SDK には、特定のバージョンの Android 用の Android プラットフォームと Java API、および対応するツールが含まれています。これらのツールは、SDK の管理、アプリのビルド、Android デバイスとの通信とエミュレーションに役立ちます。

各バージョンの Android SDK には、ソースコードがアクセスできる特定の Java API が用意されています。また、以前のバージョンの Android でこれらの API を使用するためのデシュガーリングがサポートされています。

JDK

Java Development Kit。Java ソースをコンパイルして Java アプリケーションを実行するための Java ライブラリと実行可能ファイルが含まれています。Android ビルドには、いくつかの JDK が動作しています。詳しくは、Android ビルドの Java バージョンをご覧ください。

Gradle スコープ

Gradle は、ライブラリ依存関係を異なるスコープ(Gradle API では「構成」と呼びます)にグループ化します。これにより、ビルドのさまざまな部分で使用するさまざまなライブラリ依存関係セットを指定できます。たとえば、公開アプリやライブラリに JUnit などのテスト ライブラリを含める必要はないとしても、単体テストのビルドと実行には必要とする場合があります。また、スコープを使用して、シンボルまたはアノテーション プロセッサを追加してコードを分析します。

たとえば、AGP では implementation スコープと api スコープが定義されています。これらは、依存関係をサブプロジェクトのユーザーに公開するかどうかを指定する手段です。Android ビルドで使用されるこれらのスコープとその他のスコープの説明については、依存関係を設定するをご覧ください。

ビルドファイルの dependencies ブロックに、ライブラリ依存関係を group:artifact:version 文字列として追加します。

Kotlin

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation("com.example:library1:1.2.3")
    api("com.example:library2:1.1.1")
}

Groovy

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation 'com.example:library1:1.2.3'
    api 'com.example:library2:1.1.1'
}

または バージョン カタログで次の操作を行います。

# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"

[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }

[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }

生成された変数をビルドファイルで指定します。

Kotlin

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation(libs.example.library)
}

Groovy

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation libs.example.library
}