今回はbuild.gradle
についてです
build.gradleファイルに息をするかのごとくライブラリを追加したり、設定を追加したりすると思いますが、よくよく考えるとbuild.gradleってなんだろうとふと思いまとめてみることにしました
build.gradleとは?
まず、AndroidアプリケーションのビルドにはGradleが採用されています。Google が Gradle用のAndroid プラグインを提供しており、このプラグインを各Android プロジェクトの Gradleスクリプトから利用することでAndroidモジュールのビルドを行えるようになります。build.graldeは「Gradleスクリプト」にあたるものになります
有名なビルドツールにMavenがありますが、GradleはMavenのようにXMLで設定定義するのではなくGroovyという言語を利用して、ビルド定義ができます
Gradle自身もJavaとGroovyで作成されGradleによりビルドされています
また、JVM上で動作するため、基本的にどのような環境でも動作させることができます
build.gradleの種類
Android Studioのプロジェクトを見るとProjectとModuleの2種類のbuild.gradleがあると思います
それぞれどんな役割のために存在しているのでしょうか?
共通の依存関係とか設定とかをProjectのbuild.gradleに記載して、プロジェクト毎の設定はModuleのbuild.gradleに記載します
プロジェクトごとは例えばモジュールを分割した場合などで、分割したモジュールごとにModuleのbuild.gradleが存在してモジュールごとに設定を追加することになります
下記がProjectのbuild.gradleです。最初のコメントにあるようにサブモジュールやサブプロジェクトでも共通で追加する設定を定義します
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.3.71' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.6.3' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version' // 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 }
build.gradleで正しく設定するために
最後にbuild.gradleで正しく定義できるようにファイルに記載されている内容を理解しましょう
まずはProjectのbuild.gradleです。先程のテンプレートを再度記載します
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.3.71' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.6.3' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version' // 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 }
buildscript
ブロックではビルド環境の設定を行います。 テンプレートでは、Mavenリポジトリとしてメジャーな JCenterを使用することや、ビルド用にどのようなプラグインが必要であるかを指定しています
また、上記テンプレートでは、Android アプリケーションをビルドするために必要な Android プラグイン (for Gradle) を使用することを示しています
また、kotlinのバージョンの設定やgradleのバージョン設定などプロジェクト全てに共通する設定を定義します(モジュールを分割しても適用される設定になります)
dependencies
ではコメントにある通りアプリケーションごとの設定はモジュールごとのbuild.gradleに定義することになります(後述します)
allprojects
ブロックを利用すると、すべてのプロジェクト(マルチプロジェクト構成の場合)に対して共通で適用する設定を記述しておくことができます
buildscriptブロックとallprojectsブロックの両方にrepository
が含まれていますが、buildscriptブロックではgradleスクリプトを実行するために必要な依存関係を追加する、allprojectsブロックではプロジェクトを作成するために必要な依存関係を追加するという違いがあります
そして、task cleanは起動したらbuildフォルダを削除するタスクになります。このタスクは、Gradleの設定ファイルを変更した場合、キャッシュされている設定をきれいにする(リセット)ために行います
次にModuleのbuild.gradleのテンプレートを記載します
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.example.test" minSdkVersion 28 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.core:core-ktx:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.viewpager2:viewpager2:1.0.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.navigation:navigation-fragment:2.3.5' implementation 'androidx.navigation:navigation-ui:2.3.5' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
android
ブロックでtargetSdkVersionやapplicationIdなどアプリの設定を行います。モジュールごとに別々の設定になる可能性もあるのでModuleのbuild.gradleで定義します
dependencies
ブロックでは使用するライブラリを定義してインポートできるようにします
apply plugin
では対象アプリのビルドするために必要なプラグインを定義しています。一例を挙げると、kotlin-android
はkotlinで書かれたAndroidのモジュールをビルドするために必要です
このようにbuild.gradleが2種類あるのは設定を適用させる対象が明確に分かれているためなのです
最後に
今回説明したものはほんのさわりの部分で細かいカスタマイズをするためにはさらに設定を追加したりタスクを追加したりする必要があると思います。最後の参照に記法や設定に関するドキュメントのリンクを載せているので参照してください
また、setting.gradle
など他にもファイルがあるため別の記事で説明したいと思います
それにしても奥が深い!!