Gradle ビルドの概要

Android アプリは通常、Gradle ビルドを使用してビルドされます。 ありませんビルドの構成方法の詳細に入る前に システム全体を理解できるようにします

ビルドとは何ですか?

ビルドシステムはソースコードを実行可能なアプリケーションに変換します。 ビルドでは多くの場合、アプリケーションの分析、コンパイル、リンク、パッケージ化のために、 定義できます。Gradle はタスクベースのアプローチを使用してデータを整理、実行する 使用できます。

タスクは、入力を変換するコマンドをカプセル化します。 出力です。プラグインはタスクとその構成を定義します。適用しています ビルドにプラグインがタスクを登録し、 入出力です。たとえば、Android Gradle プラグイン(AGP)を適用すると、 ビルドファイルに追加すると、APK のビルドに必要なすべてのタスク、または Android ライブラリ。java-library プラグインを使用すると、Java ソースから jar をビルドできます。 できます。Kotlin には他の言語にも同じようなプラグインがありますが、 はプラグインを拡張するものです。たとえば、protobuf プラグインは、 AGP や java-library などの既存のプラグインに対する protobuf サポート。

Gradle は構成よりも規則を優先するので、プラグインは優れた デフォルト値のまま使用できますが、 宣言型のドメイン固有の言語(DSL)です。DSL は、 そのため、ビルド方法ではなくビルド対象を指定することができます。ここでのロジック: プラグインが「方法」を管理します。この構成は複数の プロジェクト(およびサブプロジェクト)内のビルドファイル

タスクの入力には、ファイルとディレクトリのほか、 Java 型(整数、文字列、カスタムクラス)。出力はディレクトリのみにできます。 ディスクに書き込まなければならない場合があるためです。タスク出力を別のデバイスに配線する タスク入力は、タスク同士をリンクして、一方が他方よりも先に実行されるようにします。

Gradle では、ビルド内での任意のコードとタスク宣言の記述がサポートされていますが、 そうしないと、ツールがビルドを理解しにくくなり、 管理するためのツールです。たとえば、プラグイン内のコードのテストを記述できます。 ビルドファイルでは利用できません。代わりに、ビルドロジックとタスクは、アプリケーション の宣言(自分または他のユーザーが定義した)の宣言を追加し、ライブラリの使用法を そのロジックをビルドファイルで使用する必要があります。

Gradle ビルドを実行するとどうなりますか?

Gradle ビルドは 3 つのフェーズで実行されます。これらのフェーズでは、それぞれ異なる部分が実行されます。 使用できます。

  • 初期化は、どのプロジェクトとサブプロジェクトに含めるかを決定します。 ビルドし、ビルドファイルを含むクラスパスを設定し、 使用できます。このフェーズでは主に、プロジェクトを宣言した構成ファイルを作成します。 プラグインとライブラリの取得元を指定します。
  • 構成ではプロジェクトごとにタスクを登録し、ビルドを実行します このファイルを使用して、ユーザーのビルド仕様を適用します。ここで重要なのは 生成されたデータやファイルに構成コードがアクセスできないことを 表示されます。
  • Execution では、実際の「ビルディング」説明します。出力 構成はタスクの有向非巡回グラフ(DAG)です。 ユーザーがリクエストしたすべての必要なビルドステップを表します( (コマンドラインで指定することも、ビルドファイルのデフォルトとして指定することもできます)。この グラフはタスク間の関係を表し、タスクの 入力と出力に基づいて処理できます。タスクに入力が与えられても、 別のタスクの出力である場合、その出力は他のタスクの後に実行する必要があります。この 古いタスクが、グラフで定義された順序で実行されます。タスクの 入力が変更されていない場合、Gradle はこれをスキップします。

詳細については、Gradle のビルド ライフサイクルをご覧ください。

構成 DSL

Gradle はドメイン固有言語(DSL)を使用して構成します。 説明します。この宣言型のアプローチは、データを指定することに重点を置いたものではなく、 ステップバイステップ(命令型)の指示を記述すること。

DSL は、すべてのドメイン専門家やプログラマーが、 小さな言語を定義することで、特定のタスクや より自然な方法で認識できます。Gradle プラグインは DSL を拡張して、 簡単に管理できます。

たとえば、ビルドの Android 部分の構成は次のようになります。

Kotlin

android {
    namespace = "com.example.app"
    compileSdk = 34
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 34
        // ...
    }
}

Groovy

android {
    namespace 'com.example.myapplication'
    compileSdk 34
    // ...

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 24
        // ...
    }
}

バックグラウンドで、DSL コードは次のようになります。

fun Project.android(configure: ApplicationExtension.() -> Unit) {
    ...
}

interface ApplicationExtension {
    var compileSdk: Int
    var namespace: String?

    val defaultConfig: DefaultConfig

    fun defaultConfig(configure: DefaultConfig.() -> Unit) {
        ...
    }
}

DSL の各ブロックは、ラムダを受け取る関数で表現されます。 同じ名前でアクセスするためのプロパティが必要です。これにより、 データ仕様のように感じられます。

外部依存関係

Maven ビルドシステムには、依存関係の仕様が導入されています。 ストレージと管理のシステムです。ライブラリは リポジトリ(サーバーまたはディレクトリ)。メタデータには以下が含まれます。 他のライブラリへの依存関係も確認します。どの Pod が 使用する依存関係のバージョン、リソースの ダウンロードされます。

Maven アーティファクトはグループ名(会社、デベロッパーなど)、アーティファクトで識別されます name(ライブラリの名前)とそのアーティファクトのバージョンです。これは通常 group:artifact:version として表されます。

このアプローチにより、ビルド管理が大幅に改善されます。よく耳にするのは 「Maven リポジトリ」と呼ばれるものですが、 パッケージ化され、公開されます。これらのリポジトリとメタデータは を含む複数のビルドシステムで再利用できます(Gradle は できます。公開リポジトリを使用すると、誰でも共有でき、 社内のリポジトリに保持されています

プロジェクトをサブプロジェクトモジュール化することもできます。 (Android Studio では「モジュール」)。このモジュールは、 確認します。各サブプロジェクトで生成される出力(jar など)は、 プロジェクト別または最上位 レベルのプロジェクトですこれによりビルド時間を短縮できる 再構築が必要な部分を切り分けることができ 責任を担います。

依存関係を指定する方法については、ビルドを追加する 依存関係にあります

ビルド バリアント

Android アプリを作成するとき、通常は複数のアプリをビルドし、 バリアント。バリアントが異なるコードを含むか、バリアントが異なる ビルドタイプとプロダクト フレーバーで構成されています。

ビルドタイプは、宣言されたビルド オプションによって異なります。デフォルトでは、AGP は「リリース」を設定します。 「debug」と入力できます。ビルドタイプを調整できますが、調整してさらに追加することもできます( 使用する場合があります。

デバッグビルドではアプリが圧縮または難読化されず、 すべてのシンボルをそのままビルドして保持します。また、アプリケーションが 汎用のデバッグキーで署名して、デバッグ可能なコンテナに デバイスにインストールされたアプリケーション ファイルを確認します。これにより、 アプリケーションの実行中にファイルやデータベースにデータを保存できます。

リリースビルドでは、アプリを最適化し、リリースキーで署名します。 インストールされているアプリケーション ファイルを保護します。

プロダクト フレーバーを使用すると、含まれるソースと依存関係を変更できます。 バリアントを作成します。たとえば、「demo」というテキストを と「full」さまざまなフレーバー、または「free」などのと「有料」提供します。 共通のソースを "main" ブロックにソースセット ディレクトリ、および ソースを上書きするか、フレーバーに基づいて名前を付けたソースセットに追加します。

AGP は、ビルドタイプとプロダクト フレーバーの組み合わせごとにバリアントを作成します。条件 フレーバーを定義しない場合、バリアントにはビルドタイプの名前が付けられます。もし 両方を定義した場合、バリアントの名前は <flavor><Buildtype> になります。たとえば、build Build を使用して タイプ releasedebug、フレーバー demofull の場合、AGP は バリアント:

  • demoRelease
  • demoDebug
  • fullRelease
  • fullDebug

次のステップ

ビルドのコンセプトを理解したところで、次は「Android ビルド 構成する必要があります。