こんにちは。
今回は、build.gradleでbuild-toolsを指定する際に、自動で自分のインストールしている最新のものを設定してくれるスクリプトを紹介します。
どうして作ったか
たくさんの人とプロジェクトを共有する必要性が生まれ、しかも相手はプログラミング初心者。
そんな時に、毎回build-toolsのバージョンアップでプロジェクトのbuild-toolsのバージョンが低くなってしまい、無駄に設定しなおしたりインストールしたりを繰り返していたので、なんとか出来ないかと思って作りました。
プログラムの説明
gistでも共有しています。
https://gist.github.com/litmon/08ff67f553cb47b0eff0
どういう風にbuild-toolsを自動指定してるか軽く説明していきます。
SDKのPATHを取得する
build.gradleの中からANDROID_SDK_ROOTを取得する方法は色々ありますが、たぶんこれが最良だと思ったので紹介します。
local.properties内にsdk.dirという値が設定されているので(Android Studioが自動で設定してくれる)この値を取得します。
def getSdkDir() {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir', null)
return sdkDir
}
うーん、簡単ですね。
この他にも、commandを使ってwhich android
からSDKのPATHを取得する方法もありましたが、上手くいかなかったので断念しました。
build-toolsの一覧を取得する
sdkの内部を見てみれば分かりますが、フォルダ構造はこんな感じになってます。
sdk
├── SDK\ Readme.txt
├── add-ons
├── build-tools
│ ├── 19.1.0
│ ├── 21.1.1
│ ├── 21.1.2
│ └── 22.0.1
├── docs
├── extras
├── platform-tools
├── platforms
├── samples
├── sources
├── temp
└── tools
build-toolsの中にいくつかdirectoryがあって、それがそのままバージョン番号になってます。
これをそのまま取得しましょう。
def buildToolsList(){
new File(getSdkDir(), 'build-tools').list().sort { a, b -> b <=> a }
}
def latestBuildTools(){
buildToolsList()[0]
}
最新のbuild-toolsを取得するために、ディレクトリのリストを取得した後降順にソートしてます。
ソート後の先頭要素を取得することで、最新のbuild-toolsを取得することが出来るというわけです。
使い方
上のスクリプトをそのままbuild.gradle(app)に書いて、build-toolsのバージョン指定しているところを少し書き換えます。
apply plugin: 'com.android.application'
def getSdkDir() {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir', null)
return sdkDir
}
def buildToolsList(){
new File(getSdkDir(), 'build-tools').list().sort { a, b -> b <=> a }
}
def latestBuildTools(){
buildToolsList()[0]
}
android {
compileSdkVersion 22
// 上で作ったものを適用
buildToolsVersion latestBuildTools()
defaultConfig {
applicationId "com.litmon.build-tools-automation"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
あとはそのままbuildすればOKです。
最後に
groovyを触って間もないので、まだまだやってみたの領域を超えない部分がたくさんあります。(エラー処理とか適当ですし)
現時点でMacでの検証は行いましたが、Windowsでも動作するかはまだ調査してみないと分からないです。
もっとこうしたら?とか、こっちの方がいいよ!とかあったらなんでも言ってください!
参考
こちらの方法でSDK PATHの取得を行いました。
http://stackoverflow.com/questions/28222158/gradle-task-unable-to-find-local-properties-file
これはやってみたけど上手くいかなかったもの。commandを使ってSDKのPATHを取得しています。ここのリストをソートするところとか参考にしました。
http://www.egeek.me/2013/12/07/gradle-auto-detect-android-sdk-and-build-tools-versions/