Android StudioでのGradleの概要
Android Studioで作成されたアプリケーションを実行するには、Androidの標準のビルドシステムではantが使われていますが、Android SDKのインストールやantのセットアップをしてプロジェクトをコンパイルしないと実行できません。Gradleと呼ばれるシステムは、これをバックグラウンドで簡単に実行することができます。
ここでは、Gradleを使用してアプリケーションプロジェクトに必要なさまざまな要素のコンパイルとパッケージ化する方法が学べます。Android Studioでのプロジェクトの構築に関してより高度な要件が必要な場合に、このシステムを構成する方法の調査を開始します。
目次
Gradleとは
Gradleとは簡単に言うと、ビルドシステムです。Gradleはプロジェクトを正常にビルドするために必要なビルド構成ファイルや依存関係、ビルドプロセスが含まれますので、簡単にビルドしてくれます。
Gradleの強みは、開発者に提供する柔軟性にあります。Gradleシステムは、プラグインを使用して他の環境に統合できる、自己完結型のコマンドラインベースの環境です。Android Studioの場合、Gradle統合は適切に命名されたAndroid Studioプラグインを通じて提供されます。
プロジェクトをビルドするための設定は、Groovyと呼ばれるJVM上で動くスクリプト言語で書きます。
GradleとAndroid Studio
Gradleは、Androidアプリケーションプロジェクトの構築に多くの強力な機能を提供します。主な機能のいくつかは次のとおりです。
デフォルトの設定
Gradleは、設定より規約と呼ばれる概念を実装しています。これは単に、Gradleに事前に定義された適切なデフォルト構成設定のセットがあり、ビルドファイルの設定で上書きされない限りその設定が使われます。これは開発者が必要とする最小限の構成でビルドを実行できるという事です。デフォルトの構成がビルドの要件を満たさない場合にのみ、ビルドファイルの変更は、必要ありません。
依存関係
Gradle機能の重要な役割の一つに依存関係の領域があります。たとえば、プロジェクト内で別のモジュールをロードするAndroid Studioプロジェクト内のモジュールについて考えてみます。実行時に2番目のモジュールが見つからず起動できない場合、アプリケーションはビルドに失敗するため、最初のモジュールは事実上、2番目のモジュールに依存しています。この依存関係は、最初のモジュールのGradleビルドファイルで宣言して、2番目のモジュールをアプリケーションビルドに含めるか、2番目のモジュールが見つからないかビルドできない場合にエラーのフラグを立てることができます。依存関係がある他の例をあげると、プロジェクトがコンパイルと実行するために依存するライブラリ、JARファイルがあります。
Gradleの依存関係は、ローカルまたはリモートの二種類に分類できます。ローカルの依存関係は、ビルドが実行されているシステムのローカルファイルシステムにあるアイテムを参照します。リモートの依存関係は、リモートサーバー(リポジトリ)にあるアイテムを指しています。
Android Studioプロジェクトのリモート依存関係は、Mavenという別のプロジェクト管理ツールを使用して処理されます。リモート依存関係がMaven構文を使用してGradleビルドファイルで宣言されている場合、依存関係は指定されたリポジトリから自動的にダウンロードされ、ビルドプロセスに含まれます。例えば、下記の依存関係宣言により、AppCompatライブラリがGoogleリポジトリからプロジェクトに追加されます。
1 |
implementation 'com.android.support:appcompat-v7:26.0.2' |
バリアントの作成
依存関係に加えて、GradleはAndroid Studioプロジェクトのビルドバリアントサポートも提供します。これにより、アプリケーションの複数のバリエーションを単一のプロジェクトから構築できます。Androidは、さまざまな種類のプロセッサと画面サイズに対応するさまざまなデバイスで動作します。できるだけ幅広いデバイスタイプとサイズをターゲットにするために、アプリケーションの様々なバリアントを構築する必要があります。Gradleを使用することで、Android Studioでこれが可能になりました。
マニフェストファイル
Android Studioプロジェクトには、アプリケーションに関する構成の詳細AndroidManifest.xmlファイルが関連付けられています。マニフェストエントリをGradleビルドファイルで指定でき、プロジェクトのビルド時にマニフェストファイルに自動生成されます。この機能はビルドバリアント機能を補完するものです。アプリケーションバージョン番号、アプリケーションID、SDKバージョン情報などの要素を、ビルドバリアントごとに別々に構成できます。
APK署名
Android Studioユーザーインターフェースを介して入力された署名情報をGradleビルドファイルに含めることもできるます。その為、コマンドラインから署名済みAPKファイルを生成できます。
ProGuardサポート
ProGuardは、Android Studioに含まれているツールであり、Javaバイトコードを最適化、縮小、難読化して、リバースエンジニアリングをより効率的かつ困難にします(アプリケーションのロジックを、コンパイルされたJavaバイトコードの分析を通じて他の人が特定できる方法) )。Gradleビルドファイルは、ビルド時にアプリケーションでProGuardを実行するかどうかを制御する機能を提供します。
最上位のGradleビルドファイル
完成したAndroid Studioプロジェクトには、Androidアプリケーションの構築に必要な物全て(モジュール、ライブラリ、マニフェストファイル、Gradleビルドファイル)が含まれてます。
各プロジェクトには、最上位のGradleビルドファイルが1つ含まれています。このファイルはbuild.gradleとして保存されますbuild.gradleは、下記の図のようにプロジェクトツールのウィンドウにあります。
デフォルトでは、最上位のGradleビルドファイルの内容は下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } |
現状では、すべてのファイルはjcenterリポジトリを使用してリモートライブラリを取得し、ビルドはGradle用のAndroidプラグインに依存していることを宣言しています。ほとんど、このビルドファイルの変更はしません。
モジュールレベルのGradleビルドファイル
Android Studioアプリケーションプロジェクトは、複数のモジュールで構成されています。たとえば、それぞれModuleXおよびModuleYという名前の2つのモジュールを含むGradleDemoという名前の架空のアプリケーションプロジェクトで考えてみます。この例では、各モジュールに独自のGradleビルドファイルが必要です。プロジェクト構造の観点から、これは下記のように配置されます。
ModuleX / build.gradle
ModuleY / build.gradle
デフォルトでは、ModuleX build.gradleファイルは下記のようなリストになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.ebookfrenzy.ModuleX" minSdkVersion 18 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.0.2' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } |
ファイルの内容から分かるように、ビルドファイルは、Gradle Androidアプリケーションプラグインの使用を宣言することから始まります。
1 |
apply plugin: 'com.android.application' |
androidセクションには、ModuleXのビルド時に使われるSDKのバージョンが記載されています。
1 2 |
android { compileSdkVersion 28 |
defaultConfigセクションで宣言された項目は、ビルド中にモジュールのAndroidManifest.xmlファイルに生成される要素を定義します。ビルドファイルで変更される可能性がある設定は、モジュールが最初に作成されたときにAndroid Studio内で入力された設定から取得されます。
1 2 3 4 5 6 7 |
defaultConfig { applicationId "com.ebookfrenzy.ModuleX" minSdkVersion 28 targetSdkVersion 28 versionCode 1 versionName "1.0" } |
buildTypesセクションには、アプリケーションのリリースバージョンがビルドされたときに、APKファイルでProGuardを実行するかどうか、および実行する方法に関する指示が含まれています。
1 2 3 4 5 6 7 |
buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } |
現在設定されているように、ProGuardはModuleXのビルド時に実行されません。ProGuardを有効にするには、runProguardエントリをfalseからtrueに変更する必要があります。proguard-rules.proファイルは、プロジェクトのモジュールディレクトリにあります。このファイルに加えられた変更は、sdk / tools / proguardの下のAndroid SDKインストールディレクトリにあるproguard-android.txtファイルのデフォルト設定を上書きします。
このファイルではデバッグbuildTypeが宣言されていないため、デフォルトが使用されます(ProGuardなしでビルドされ、デバッグキーで署名され、デバッグシンボルが有効になっています)。
複数のビルドバリアントを作成できるようにするために、productFlavorsというタイトルの追加セクションもモジュールビルドファイルに含めることができます。
最後に、依存関係セクションには、モジュールが依存しているローカルおよびリモートの依存関係が一覧表示されます。最初の依存関係は次のようになります。
1 |
implementation fileTree(dir: 'libs', include: ['*.jar']) |
これは、モジュールのlibサブディレクトリにあるすべてのJARファイルがプロジェクトビルドに含まれることをGradleシステムに通知する標準的な行です。たとえば、myclasses.jarという名前のJARファイルがプロジェクトのGradleDemo / ModuleX / libフォルダーに存在する場合、そのJARファイルはモジュールの依存関係として扱われ、ビルドプロセスに含まれます。
上記のサンプルファイルの最後の依存関係の行は、Androidリポジトリから含める必要があるAndroidライブラリを指定しています。
1 2 |
implementation 'com.android.support:appcompat-v7:26.0.2' implementation 'com.android.support.constraint:constraint-layout:1.0.2' |
依存関係の宣言には、ライブラリのどのバージョンを含める必要があるかを示すバージョン番号を含めることができることに注意してください。
ビルドファイルでの署名設定の構成
この本の「Android App Bundleの作成、テスト、アップロード」の章では、Android Studioユーザーインターフェースを使用してキーを設定し、署名付きリリースAPKファイルを生成する手順を説明しました。これらの設定は、build.gradleファイルのsigningSettingsセクション内でも宣言できます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.ebookfrenzy.gradledemo.ModuleX" minSdkVersion 28 targetSdkVersion 28 versionCode 1 versionName "1.0" } signingConfigs { release { storeFile file("keystore.release") storePassword "your keystore password here" keyAlias "your key alias here" keyPassword "your key password here" } } buildTypes { . . . } |
1 2 3 4 5 6 7 |
release { storeFile file("keystore.release") storePassword System.getenv("KEYSTOREPASSWD") keyAlias "your key alias here" keyPassword System.getenv("KEYPASSWD") } } |
さらに別のアプローチは、ビルドファイルを構成して、Gradleがビルドプロセス中にパスワードの入力を要求するようにすることです。
1 2 3 4 5 6 7 8 9 |
signingConfigs { release { storeFile file("keystore.release") storePassword System.console().readLine ("\nEnter Keystore password: ") keyAlias "your key alias here" keyPassword System.console().readLIne("\nEnter Key password: ") } } |
コマンドラインからGradleタスクを実行する
各Android Studioプロジェクトには、Gradleタスクをコマンドラインから呼び出せるようにするためのGradleラッパーツールが含まれています。このツールは、各プロジェクトフォルダーのルートディレクトリにあります。このラッパーはWindowsシステムで実行可能ですが、使用する前にLinuxおよびmacOSで実行権限を有効にする必要があります。実行権限を有効にするには、ターミナルウィンドウを開き、ラッパーが必要なプロジェクトフォルダーにディレクトリを変更して、次のコマンドを実行します。
1 |
chmod +x gradlew |
ファイルに実行権限があると、実行するには、ファイルの場所を$ PATH環境変数に追加するか、。/で始まる名前を追加する必要があります。例えば:
1 |
./gradlew tasks |
Gradleは、プロジェクトの構築をさまざまなタスクの観点から見ています。現在のプロジェクトで使用できるタスクの完全なリストは、プロジェクトディレクトリ内から次のコマンドを実行して取得できます(macOSまたはLinuxで実行している場合は、コマンドの先頭に./を付けてください)。
1 |
gradlew tasks |
デバイスまたはエミュレーターのテストに適したプロジェクトのデバッグリリースをビルドするには、assembleDebugオプションを使用します。
1 |
gradlew assembleDebug |
または、アプリケーションのリリースバージョンをビルドするには:
1 |
gradlew assembleRelease |
まとめ
ほとんどの場合、Android Studioは、開発者の介入なしにバックグラウンドでアプリケーションのビルドを実行します。このビルドプロセスは、Gradleシステムを使用して処理されます。Gradleシステムは、プロジェクトをビルドする方法を一連のビルド構成ファイルを通じて構成および管理できるように設計された自動ビルドツールキットです。Gradleのデフォルトの動作は、多くの基本的なプロジェクトビルド要件に適していますが、より複雑なプロジェクトでは、ビルドプロセスを構成する必要が避けられません。この章では、Android Studioプロジェクトのコンテキスト内でのGradleビルドシステムと構成ファイルの概要について説明しました。
Ryotin
現役フリーランスエンジニアです。使ってるエージェントはフライテック!得意言語はJava。月収は75万円。SESのフリーランスではこれ以上稼ぐのは厳しそう...とはいってもサラリーマンの時より倍の収入だから家族も喜んでるけどね!