SlideShare a Scribd company logo
怖くない
GRADLE設定
とBAZEL
嶋田達哉(@USAGANIKKI)
目次
・自己紹介
gradle
• gradleとは
• ビルドについて
• とりあえずしておくといい設定
• buildTypeを使った署名
• productFlavorsを使った設定
Bazel
• Bazelのプロジェクト構成
• Bazelのjavaプロジェクトビルド
• Bazelのandroidプロジェクトビルド
• Bazelの今後
はじめまして
• 名前
嶋田達哉(@usaganikki)
ネット上では「うさがに」
• ブログ
うさがにっき(http://tiro105.hateblo.jp/)
• 生息地
福井県➡︎富山県➡︎東京
• 会社
SI屋から転々としてリクルート住まいカンパニーに
• 今やってること
Android, iOS, AWS, ARとかとか
DROIDKAIGIで講演するきっかけ
2015/11某日・・・
どうせ受からんやろうし応募してみたろー(ポチー
時は過ぎ、2015/12初頭・・・
あ
り
が
と
う
ご
ざ
い
ま
す
!
!
!
!
!
!
!
GRADLE
Gradleのコア機能とは・・・
• 定型的に繰り返し行う作業を実行化するための仕組み
• 自動化された処理を実行するための部品
ビルドが超得意だけど、ビルド以外でも
使えるんですよ!!!
ビルド方法
初期化
スクリプト
init.gradle
設定
スクリプト
setting.gradle
ビルド
スクリプト
build.gradle
スクリプトファイル
プロパティ
ファイル
gradle.property
環境変数/
コマンドライン引数
src
ビルドを実行
ANDROIDプロジェクトでは・・・
buildscript {
repositories {
jcenter()
}
…
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.android.application’
android {
…
}
dependencies {
…
}
とりあえずしておくと幸せになれる設定
とりあえずしておくと幸せになれる設定
gradle.properties
# deamonで起動
org.gradle.daemon=true
# java memory size設定
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -
XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 並列処理モード(何か実行に条件があるらしい)
org.gradle.parallel=true
# ondeamandモード 大規模プロジェクトで有効
org.gradle.configureondemand=true
BUILDTYPEを使った署名
signingConfigs {
releaseConfig {
keyAlias ’demo'
keyPassword ’password'
storeFile file(’demo.keystore')
storePassword ’keystore'
}
}
buildTypes {
release {
signingConfig signingConfigs.releaseConfig
}
}
BUILDSCRIPTを使った署名
android {
// ...
// signingConfigs
apply from: 'signingConfigs/debug.gradle', to: android
apply from: 'signingConfigs/release.gradle', to: android
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.release
}
}
}
PRODUCTFLAVORSを使った設定
android {
…
productFlavors {
free {
applicationId 'com.example.app.free'
}
pro {
applicationId 'com.example.app.pro'
}
}
}
BUILDTYPEとPRODUCTFLAVORS
• buildTypeとproductFlavorsは同時に設定することができ
る
・・・が同じ名前は設定できない
• 例えば・・・
productFlavors debug statings release
free FreeDebug FreeStating FreeRelease
pro ProDebug ProStating ProRelease
BUILDTYPEとPRODUCTFLAVORS
• AndroidStudioではBuild Variantsメニューから選択
BAZEL
• Googleが社内で使用していたビルドツールを
オープンソース版として開発をしている
• 最近Beta版が公開され、Androidのビルドが可能に
• 2016年12月以降のStable版ではAndroid Studioとの統合という計画
• gradleより構造的に記述することができ、高速らしい
12月からよろしくね!!!!!(予定)
ところで・・・
読みましたか?
怖くないGradle設定とBazel
(
も
う
喋
る
こ
と
)
な
い
じ
ゃ
ん
・
・
・
みんなも読もう!
https://techbooster.booth.pm/items/178226
おしまい!!!!
BAZELの構成
WORKSPACE
• WORKSPACEファイルが配置されたところがworkspaceの
トップディレクトリになる
• ライブラリの外部参照の依存関係の記述
BUILD
• ソースコードの配置やプロジェクトの依存関係
• ライブラリの依存
BAZELのJAVAプロジェクトビルド
├── BUILD
├── WORKSPACE
└── src
└── main
└── java
└── com
└── example
├── Greeting.java
└── ProjectRunner.java
BAZELのJAVAプロジェクトビルド
$ cat BUILD
java_binary(
name = "my-runner",
srcs = glob(["**/*.java"]),
main_class = "com.example.ProjectRunner",
)
BUILDファイルで使えるFunction
http://bazel.io/docs/be/functions.html#glob
BAZELのJAVAプロジェクトビルド
$ bazel build :my-runner
INFO: Found 1 target...
Target //:my-runner up-to-date:
bazel-bin/my-runner.jar
bazel-bin/my-runner
INFO: Elapsed time: 15.839s, Critical Path: 4.91s
$ bazel-bin/my-runner
Hi!
BAZELのANDROIDプロジェクトビルド
公式のサンプルは非常に複雑なため、@tomorrowkeyさんのサ
ンプルを使わせていただきます!!
https://github.com/tomorrowkey/HelloBazel
@tomorrowkeyさんありがとうございます!!
BAZELのANDROIDプロジェクトビルド
├── BUILD
├── HelloBazel
│ └── app
│ ├── proguard-rules.pro
│ └── src
...
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── jp
│ │ └── tomorrowkey
│ │ └── android
│ │ └── hellobazel
│ │ └── MainActivity.java
│ └── res
...
└── WORKSPACE
BAZELのANDROIDプロジェクトビルド
$ cat WORKSPACE
android_sdk_repository(
name="androidsdk",
path="/Users/01011818/Library/Android/sdk",
api_level = 23,
build_tools_version="23.0.2"
)
BAZELのANDROIDプロジェクトビルド
$ cat BUILD
android_binary (
name = "app",
srcs = glob(["HelloBazel/app/src/main/java/**/*.java"]),
custom_package = "jp.tomorrowkey.android.hellobazel",
manifest = "HelloBazel/app/src/main/AndroidManifest.xml",
resource_files = glob(["HelloBazel/app/src/main/res/**"]),
deps = [
"@androidsdk//:appcompat_v4",
"@androidsdk//:appcompat_v7",
"@androidsdk//:appcompat_v7_import",
],
)
BAZELのANDROIDプロジェクトビルド
$ bazel build :app
INFO: Found 1 target...
INFO: From Generating unsigned apk:
THIS TOOL IS DEPRECATED. See --help for more information.
INFO: From Generating signed apk:
THIS TOOL IS DEPRECATED. See --help for more information.
Target //:app up-to-date:
bazel-bin/app_deploy.jar
bazel-bin/app_unsigned.apk
bazel-bin/app.apk
INFO: Elapsed time: 33.836s, Critical Path: 30.55s
$ bazel mobile-install :app
で端末にinstallもできる
BAZELのANDROIDプロジェクトビルド
• WORKSPACE内にmaven_jarを追加することで
mavenリポジトリを参照することも可能
• 自分で作ったaarライブラリを参照することも可能
• 思ったより早くなかった!!
BAZELの今後

More Related Content

怖くないGradle設定とBazel

Editor's Notes

  • #3: まずは目次です 最初に軽く自己紹介させていただいて、次ににgradleについて軽く解説した後、buildTypeとかproductFlavorsなどを使ったやると便利になりそうな設定について解説させていただきます 最後に次世代ビルドツールであるBazelで実際にビルドしてみた話とその感想、今後についてお話しさせていただきます
  • #4: はじめまして 名前はしまだたつやと申します、ネット上ではうさがにで活動してたりもします ブログも徒然に書いてます 出身地は北陸で、北陸をふらふらした後東京に来ました 最近はモバイルアプリでARとかVRとかを実現することを主にやっています
  • #5: ついでにそんな私がDroidKaigiに参加するきっかけですが、2015/11あたりにDroidKaigiのスピーカーを募集していたのでこんな感じの気持ちで応募したんですよ
  • #6: すると12月初頭こんなメールが届きました 遠くの方見えますかね?「DroidKaigiへの採択に内定いたしました!」って書いてあります
  • #7: あれ?みなさん笑わない? ここで笑わないと、もう聞くとこないですよ・・・ こんな感じでしたね やべーなにしゃべろ、スライド作らなきゃ、20分以上もしゃべれるのかよ、でもこの経験はありがたい などなど複雑な思いが交錯した結果の役30分をお楽しみいただければ幸いです
  • #8: ではまずはGradleの簡単な概要から説明していきます 主にビルドツールとして有名なGradleですが、公式サイトにはコアな機能としては定型的に繰り返し処理を行う作業を実行化するための仕組み、自動化された処理を実行するための部品であり、平たく言うとただのスクリプトなんですね ビルドが超得意な言語ではあるんですが、ビルド以外でも使えたりします
  • #9: まずはgradleのビルド方法と各ファイルの役割について説明などなどしていきます Gradleのビルドには初期化スクリプト、設定スクリプト、ビルドスクリプト、プロパティファイル、環境変数、srcの登場人物がいます それぞれ簡単に説明していきます 初期化スクリプト、init.gradle ビルドの最初に実行されるスクリプト、初期設定を行う(init.gradle) ちなみにAndroid Studioで作成されるプロジェクトには無い模様 設定スクリプト、setting.gradle ビルド対象のプロジェクト設定を行う、ビルドに参加するプロジェクトを定義するファイルで、複数プロジェクト(ライブラリがある場合)などには必須 AndroidStudioでは参照プロジェクトを追加したりある場合、ここに記載される ビルドスクリプト、build.gradle ビルドの定義を記述するスクリプト プロジェクトの依存関係などを解決、ビルドの実行などgradleの主役 取り合えるビルドしたいときはこれだけは必須 プロパティファイル、gradle.property 環境によって値が変わるようなパラメータをプロパティに外だししたい場合に使う ビルド実行時に自動的に読み込まれる AndroidStudioではファイル自体は存在しているが、中身は空っぽ 環境変数/コマンドライン引数 Gradleがインストールされているマシンの環境変数と、実行時にコマンドラインから渡す引数のこと Gradleが起動するプロセスに対して環境固有の値を渡す場合に使う あとはソース これらが組み合わされてビルドが実行されます
  • #10: Gradleのファイル構成がふんわりわかった上でAndroidStudio上のファイル構成を見てみましょう Init.gradleはないですね Settings.gradleにはこのプロジェクトは単一アプリなので依存関係が無いため本アプリのことだけが記載されています 参照プロジェクトを追加するときには追記が必要です Gradle.propertiesには初期には何も記載されていません Build.gradleは二つに分割されている topLevelのbuild.gradleにアプリ全体の依存関係などが記載、cleanなどのtaskの定義 ちなみにbuildなどのタスクはAndroidプラグインを読み込む際に自動的に定義されています App内のbuild.gradleではgradleのAndroidプラグインを使うことを定義 Gradleではビルドをする際に、各種プラグインを使うことを宣言します、JavaならJava, ScalaならScalaのプラグインを宣言します 今回はAndroidプラグインを宣言しています そして以下にAndroidプラグインの設定が続きます Androidプラグインの中身はみなさんご存知の通りApplication IdやminSdk, targetSdkなどAndroid独特の設定項目が続きます
  • #11: AndroidStudioにおけるgradleファイルについてわかったところで、ここからはとりあえずしておくと幸せになりそうな設定を説明しておいきます AndroidStudioでは常に最新のGradleがリリースされていないかビルドの度に見に行っています これは結構重い作業になるので上記のようにGradleの設定からOffline Workにチェックを入れておくとビルド速度が目に見えて早くなります ただ一つ注意がありまして、新しく依存パッケージを追加した場合そのパッケージをオンラインで取得しなくちゃいけないのでその際にはoffline workのチェックを外してからビルドするようにしてください
  • #12: 次はgradle.propertiesに書いておくと幸せになれる設定です 最初の設定はgradleを毎回起動するのではなくdeamonで起動するようにする設定 次にjavaのメモリサイズ設定、最初の設定だとわりとoutofmemoryビルド中に履いたりするのでデフォルトの二倍ぐらい取るといい感じです 次に並列処理モードの設定、そしてondeamandモードの設定、この二つは大規模プロジェクトで有効らしいです らしい。。。ってのは何か条件があるらしいのですがちょっと調査が間に合いませんでした、誰かご存知の方教えてくれると嬉しいです!
  • #13: Build.gradleでbuildtypeを使うと例えばreleaseビルド時に同時に署名を行うことができます BuildTypeのrelease時の時だけapkを署名したものをinstallしたい際にはこのような設定をbuild.gradleのAndroidブロック内に署名に必要な情報を記載することによりビルド時に署名が行われます この際に気をつけて欲しいのはsignningCOnfigsブロックを先に書かないとbuildTypeでエラーになるので注意してください それでですね、これのいけてないところはパスワードをじかにgradle.buildファイルに書かなくちゃいけないところですね できればこれを外出ししたいところです いくつか解決策はあります 環境変数にパスワードなどを設定しロードする方法や外部ファイルにsigningConfigsを書く方法 私が使っているのが外部ファイルにsiginigConfigを書く方法ですね
  • #14: こんな感じに署名内容を書いたファイルを外出しすることによりbuild.configからパスワードを外出しすることができます また、debug.gradleの中身を統一して、デバッグ用のキーファイルもコミットしてしまうことによりチーム間でキーが統一され、開発がスムーズになるというメリットもあります
  • #15: buildTypeでは出力するapkごとに設定を変えることができました 今から説明するProductFlavorsでは環境ごとに使うソースを選択することができます 例えば有償版、無償版を同じプロジェクトから作成したいとき、有償版に割り当てるソース、無償版に割り当てるソースを指定してビルドすることができます この例ではcom.example.app.freeとcom.example.app.proという二つのパッケージからapkを作成することができます
  • #16: またbuildTypeとProductFlavorsは同時に設定することができます ですが、buildTypeとProductFlavorsの設定名を同じにすることはできません これはbuildTypeとProductFlavorsの設定項目名がかぶっているためで、名前衝突を防ぐためです buildTypeとProductFlavorsなどの組み合わせをBuildVariantと言います 例えばProductFlavorsをfree, pro BuildTypeをdebug, statings, releaseと振り分けた場合、六つのBuildVariantがあることになります このなかからビルド対象を選択してビルドを行います
  • #17: AndroidStudio上でBuildVariantsを選択するには左側のメニューからBuild Variantsを選択し、対象のBuild Variantsを選択しビルドを行えば、目的のビルドを行えます
  • #18: 次に次世代ビルドツールとして期待しているBazelについて説明していきます 概要としてはご覧の通り、Googleが社内で開発していたビルドツールをbeta版でAndroidにも適応させたよ! 2016/12月以降にAndroid Studioに統合させるよ!Gradleより早いから期待してね!って感じらしいです
  • #19: ところで話は変わりますが、去年の年末もTechboosterさんから新刊が発売されました 非常に良書ばかりで私も勉強になりました その中の一冊Android Internalsというものがあります 別に私が書いたとかじゃ全然ないんですけど、読んだ方いますかー? あーなるほどー 実はですね・・・
  • #20: 遠くの人見えますかね? 次世代ビルドツールBazel!って記事がありまして 。。。えー。。。読んでみたんですよ。。。 非常に素晴らしい内容でした 感想としては
  • #23: こんな感じになりましてー ちょっと心が新年早々折れかけたんですけど、まぁ・・・なんといいますか・・・ きっと買ってない人もいるし! きっと話として聞いたほうがわかりやすい場合もあるし! ということでBazelについてバリバリAndroid Interalを参考にさせていただき、引き続きがんばって解説していきたいと思います
  • #24: Bazelでビルドを行うにはWorkspaceとbuildというファイルが必要になります 具体的な記述方法やプロジェクト構成はプロジェクトによって異なるので後述しますが、それぞれのファイルがどのようなものかだけ確認していきましょう Bazelでのビルドはworkspaceという場所で行われます Workspaceはどこでも問題ないですが、必ずWORKSPACEファイルが配置される必要があります つまりWORKSPACEファイルが配置された場所がworkspaceのトップディレクトリとなります。 WORKSPACEファイルにはライブラリの依存関係を記述します。 もし依存関係がなければからファイルが配置されます BUILDファイルにはソースコードの配置やプロジェクトの依存関係、ライブラリの依存などを記述します
  • #25: 抽象的な話だとわかりにくいので実際にまずはJavaプロジェクトのビルドを行ってみます ディレクトリ構造はこんな感じです WORKSPACEファイルがここにいるので、このディレクトリがworkspaceのトップディレクトリとなります このプロジェクトでは外部依存ライブラリを使っていないためWORKSPACEファイルは空ファイルです Javaの中身はProjectRunnerにメインメソッドがいてGreetingのメソッドを読んでHiと表示するようなプログラムです
  • #26: BUILDファイルの中身はこんな感じです Pythonぽいスクリプトで記載します Javaビルドにはjava_binaryというキーワードを使います このキーワードのことをbazelではルールと言います Nameはこのビルドを一に指定する名前 Srcは対象ソースですね GlobはbazelのBUILD指定時に使える関数で、対象ソースをこんな感じで簡単に指定することができます 他にも色々便利な関数が用意されています あとはmain classを指定します
  • #27: ではworkspaceのtopまで戻ってビルドしてみます my-runner.jarとmy-runnerが作成されます My-runnerを実行するとHi!と表示されました ちなみにBUILDファイルの場所はどこでもいいですが、bazel実行時にBUILDファイルの場所を明示的に指定してやる必要があります
  • #28: 次にAndroidのプロジェクトのビルドについて説明させていただきます 公式のサンプルが非常に複雑なため@tomorrowkeyさんのサンプルを使わせていただいて説明いたします! @tomorrowkeyさんありがとうございます!
  • #29: ではAndroidのプロジェクト構造を見ていきましょう Gradleプロジェクトと違うところはgradle関係のファイルがないところ、BUILD, WORKSPACEファイルがあるところですかね あとはそんなに変わらないですかね
  • #30: 今回はAndroidSDKを参照する必要があるのでWORKSPACEに記載が必要です AndroidSDKの設定にはandroid_sdk_repositoryというルールを使います Nameはandroidsdkを判別する名前、pathはAndroidSDKの場所、あとはapilevelとbuildtoolversionを指定します
  • #31: Androidアプリをビルドするためのルールはandroid_binaryを使います 設定する必要があるものはname, srcs, applicationIdをcustom_packageで指定、manifestファイルの場所をmanifestで指定、resourceファイルの場所をresoure_filesで指定します あと依存するパッケージをdepsで指定しますちょっと指定方法が特殊なんですが、androidsdkの中のappcompatを指定しています
  • #32: さて準備は整ったのでビルドしてみます ビルドを行うとbazel-bin下にapkが作成されます Unsignedとapp.apkが作成されていますが、鍵を用意していないのでおそらく両方ともデバッグapkだと思われます Bazel mobile-install :app でビルドと同時に端末にインストールすることも可能です
  • #33: 今回は最小構成でビルドする様子を説明しましたが、mavenリポジトリを参照して、ライブラリを追加することも可能です また、自分で作ったaarライブラリを追加することも可能です あとやってみた感想なんですけど、手間の割に別にビルド早くなかったです でもまぁ0.13なので今後にこれは期待ですね
  • #34: 最後にBazelの今後についてロードマップを見てみましょう 2016/2の時点で0.3がリリースされている予定なのですが、私が1月の末くらいに落としたときは0.13くらいだったので順調に遅れていますね! 最初にお話ししましたが安定バージョンのリリースが今年の12月に予定されており、その際にAndroidStudioでの運用が予定されているようです また2016/6にAndroidのテストにも対応するようなので期待できそうですね! Gradleのビルドの遅さに辟易している開発者は多いと思うので安定版ではより一層の高速化が望まれますね またリリースの際にgradleとの差異をどのように吸収するかも気になりますね