volley(サブプロジェクト)のbuildToolsVersionをafterEvaluateで上書く
Android StudioがBetaになったので、0.8.2に上げようとしたらモジュールのビルドでハマった。
Android Studioのバージョンを上げるときは、build.gradleを弄る時でもある。
Betaに上げるからには最新版のGradleプラグインとAndroid SDKでコンパイル&ビルドできるようにしたい。
// project/gradle/gradle-wrapper.properties
distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
// project/build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
// project/app/build.gradle
android {
compileSdkVersion 20
buildToolsVersion '20.0.0'
}
しかしビルドエラー。
ルートプロジェクトのGradleプラグインのバージョンを0.12に上げると、buildToolsVersionが"19.1"以上でないとビルドできない。
僕の環境ではvolleyをモジュール(submodule)として組み込んでいて、compileSdkVersionとbuildToolsVersionがこのように指定されている。
// modules/volley/build.gradle
android {
compileSdkVersion 19
buildToolsVersion = 19
}
volleyのソースを見る限りbuildToolsVersionを20に上げても特に問題なさそうなので、何とかしてビルドが実行される前にandroid()の中身を上書きしたい。
と思って、Gradle User Guideを眺めていたら、Project.afterEvaluate()というものを見つけた。
Project.afterEvaluate()は、そのプロジェクトのビルドスクリプトが評価された後に実行されるらしい。まさにやりたいことと一致!
Gradleで分からないことがあれば、Gradle User Guideを見るのがオススメ。
Gradleのバージョンごとに用意されているので、使っているものに合わせて見るとよさげ(ちょくちょく変わったりするので)。
subprojects { subproject ->
afterEvaluate {
if (subproject.plugins.hasPlugin('android-library')) {
android {
compileSdkVersion 20
buildToolsVersion '20.0.0'
}
}
}
}
これで、モジュールとして組み込んでいるライブラリプロジェクト全てのcompileSdkVersionとbuildToolsVersionをアプリのそれと合わせることができる。
もし特定のプロジェクトだけどうしても"19.1"でビルドしたければ、プロジェクトごとに指定すればおk。
project(':modules:volley') {
afterEvaluate {
android {
compileSdkVersion 20
buildToolsVersion '19.1'
}
}
}