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