こんにちは。ビルドしてますか?
最近は「Bazel」なんかが話題ですよね。
Bazelの記事は比較的あったのですが「Buck」についての記事をあまり見かけなかったので、書こうと思います。
Buckとは
Facebookが公開しているビルドシステムです。
コードやリソースから小さいモジュールを作成してそれを再利用することでビルドを高速化しているそうです。Android以外のプラットフォームでも利用可能です。
OkBuckとは
Uberが公開しているGradelのプラグインです。Buckのラッパーのようなものです。今回はこれを利用していきます。
OkBuckをインストールする
Buckに必要なものを予めインストールする
$ brew update
$ brew install android-ndk
$ brew install ant
$ brew install watchman
- BuckはOkBuckが自動でインストールしてくれるため必要ありません
Rootのbuild.gradleファイルにokbuckを設定する
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.uber:okbuck:0.17.1'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.uber.okbuck'
OkBuckのバージョンによってgradeのバージョンを書き換える必要があります。0.17.1
なら3.3を要求されるので gradle-wrapper.properties
のdistributionUrl
を編集します。
$ vim gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
$ ./gradlew wrapper
どうしてもバージョンをアップデートしたくないけどOkBuckを使ってみたいという人はOkBuckのバージョンを変更してみましょう。
v0.10.2
なら gradle-2.14.1
を利用しています。
signingConfigsを設定する
いつも通りな感じに設定します。以下は最低限の設定なのでカスタマイズはもちろん自由です。
signingConfigs {
release {
storeFile file("RELEASE_KEY_STORE_FILE_PATH")
storePassword "RELEASE_KEY_STORE_PASSWORD"
keyAlias "RELEASE_KEY_ALIAS"
keyPassword "RELEASE_KEY_PASSWORD"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buckwコマンドでビルドする
ここまで設定できたら buckWrapper
タスクを実行します。
$ ./gradlew :buckWrapper
これでbuckwコマンドが使用できるようになります。
# ビルドできるターゲットの一覧
./buckw targets
# ターゲットをビルド
./buckw build <target>
# ターゲットのAPKをインストール
./buckw install --run <apk-target>
.buckconfig.local
にaliasを指定しておくとコマンド操作が楽です。
[alias]
appDebug = //app:bin_debug
appRelease = //app:bin_release
$ ./buckw install --run appDebug
個人的にはMakefileが好きなので以下のようにaliasはっておくと更に楽です。
installDebug:
./buckw install --run //app:bin_debug
$ make installDebug
OkBuckの各種設定は以下を参考にしてください。
実行結果
gradlew
OkBuck
単純なActivityしかない場合は少しだけ早い(体感的には)っていう感じでした。AndroidStudioにはInstantRunとかありますしね...。複雑に絡み合ったプロジェクトで計測してみたいです。
追記
DataBinding対応がされていないようです
ベンチマーク
http://tkruse.github.io/build-bench/2016_10_commons-math.html