17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-09

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

17
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?