build.gradleでbuild-toolsのバージョンを自動で最新に指定する

More than 1 year has passed since last update.

こんにちは。
今回は、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/

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.