id:nobuoka (@nobuoka) 株式会社はてな 2014-08-23 京都 Android 勉強会 2014.08 Android アプリ開発における Gradle ビルドシステム
id:nobuoka (@nobuoka)株式会社はてな
2014-08-23 京都 Android 勉強会 2014.08
Android アプリ開発におけるGradle ビルドシステム
こんにちは、id:nobuoka です
● 普段の仕事: web サービス開発– サーバーサイド: Perl
– クライアントサイド: Web (JS)、Android アプリ (Java)
● Java 好き● 最近は Docker 周りを調べたりしてる
概要
● Gradle と Android アプリ開発● Gradle や Android Gradle plugin の便利機能● AAR パッケージの公開● Gradle プラグインの作り方
Gradle とAndroid アプリ開発Gradle での Android アプリのビルドをしたことがない人向け
Gradle とは何か
● ビルドシステム– Maven とか Ant とか sbt とか Rake みたいな
● ビルド設定は Groovy による DSL で記述● Maven (Ivy) による依存管理が組み込まれている● Java 界隈で主に使われてる
– Java に限ったビルドシステムではない
– 最近は C/C++/Objective-C のサポートが向上
Gradle ビルドスクリプトの例
// build.gradle
apply plugin: 'com.android.application'
android { compileSdkVersion 19 buildToolsVersion "20.0.0"
defaultConfig { applicationId "info.vividcode.android.app.seminar.kyotoandroid" minSdkVersion 10 targetSdkVersion 19 versionCode 1 versionName "1.0" }}
Gradle の利点と欠点
● Groovy の処理を書ける → 自由度が高い● プラグインも作りやすい!● Maven リポジトリが使える● Groovy に慣れるまで難しい
– DSL として理解できても Groovy コードとして読めない
– API ドキュメントを見ても処理の流れがわかりづらい
Android Studio で Gradle 採用
● 最近ベータ版がリリースされた● 嫌でも Gradle のことを知る必要がある● IDE 上でのビルドが Gradle に統合されている
– IDE 上でもコマンドライン上でも同じ仕組みでビルド
– CI がやりやすい
Gradle による Android アプリのビルド
● Android Gradle plugin というプラグインでサポート
● Android 用ライブラリ → AAR パッケージ– リソースファイル入り JAR みたいな感じ (便利!!)
Android アプリプロジェクトor
Android ライブラリプロジェクト
Gradle + Android Gradle plugin
ビルドしたりテストしたり
Android Studio コマンドライン
使う 使う
Gradle や Android Gradle pluginの便利機能Android アプリ開発時に知っておくとよいこと
Gradle wrapper
● プロジェクト内に置ける Gradle コマンド (?)● 「gradlew」、「gradlew.bat」、
「gradle/wrapper」● Wrapper の使用が推奨されている
– Gradle がインストールされていない環境でも簡単に Gradle タスクを実行できる
– Gradle のバージョンを揃えられる
http://www.gradle.org/docs/current/userguide/gradle_wrapper.html
マルチプロジェクト
● 「settings.gradle」 にプロジェクト構成を記述● 複数のサブプロジェクトで構成
– 大きなアプリを複数のサブプロジェクトに分けるとか
– Maven リポジトリのないライブラリ (例: Volley) のコードをサブプロジェクトにするなど
http://www.gradle.org/docs/current/userguide/multi_project_builds.html
Android SDK の Maven リポジトリ
● Support library や Google Play Services の Maven リポジトリ
dependencies { compile 'com.android.support:appcompat-v7:20.0.0'}
Build Variants や Manifest Placeholder
● デバッグ時だけ機能を変化させるとかできる● Build Variants : Build Types と Product
Flavors の組– Build types : Release build, debug build, など
– Product Flavors : 同じプロジェクトから複数アプリ
● AndroidManifest.xml 中の文字列を build.gradle 側で指定できる– http://ninjinkun.hatenablog.com/entry/2014
/08/18/102849
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
buildTypes { release { buildConfigField "boolean", "XXX_DEBUG", "false" } debug { buildConfigField "boolean", "XXX_DEBUG", "true" }}
BuildConfig のプロパティをビルド時に決定
● ビルドタイプに応じて実行時に動作を変化させる● 使いすぎると混乱のもとだけど
他の便利機能
● ドキュメント: http://tools.android.com/tech-docs/new-build-system/user-guide
● 変更内容: http://tools.android.com/tech-docs/new-build-system– まだまだ開発中なので変更点を追いかけよう
AAR パッケージの公開Android ライブラリを Maven リポジトリで共有する
AAR パッケージ
● Android ライブラリプロジェクトのバイナリディストリビューション
● classes.jar や AndroidManifest.xml やリソースファイルなどが含まれる
● リソースファイルの名前衝突には気を付ける必要がある (?)
● AAR は JAR と同じく Maven リポジトリに置ける
http://tools.android.com/tech-docs/new-build-system/aar-format
Maven リポジトリへのアップロード
● maven プラグインを使うのが今のところ良さそう● 単にアップロードするだけならそれほど大変では
ない– ローカル Maven リポジトリ
– 社内 Maven リポジトリ
例: ファイルシステム上へのデプロイ
apply plugin: 'com.android.library'// … Android ライブラリプロジェクトの設定いろいろ …
apply plugin: 'maven'version = "1.0-SNAPSHOT"group = "org.example.android.sugoi.project"uploadArchives { repositories.mavenDeployer { repository(url: "file:test-repo") pom.artifactId = 'sugoi-library' pom.project { name 'Sugoi library' packaging 'aar' description 'This is Sugoi library' url 'http://sugoi.android.example.org/' } }}
● gradle uploadArchives
一般的な Maven リポジトリ
● Maven Central へのデプロイはそこそこ大変– 手作業でやるべきことがいろいろあるし時間がかかる
– 参考: http://vividcode.hatenablog.com/entry/howto/publish-aar-package-to-maven-central-with-gradle
● 最近だと Bintray (jCenter) が良さそう?– Android Studio のプロジェクトのひな形でも Maven
Central ではなく jCenter を参照するようになっている
Gradle プラグインの作り方http://www.gradle.org/docs/current/userguide/custom_plugins.html
プラグインの利点
● ビルド処理を再利用可能な部品にパッケージ化● 多くのプロジェクトから利用できる● 他の人との共有も簡単● Groovy でも書けるし Java でも Scala でも書ける
– 個人的には Java で書くと理解しやすい
プロジェクト固有の簡単なプラグイン
● Plugin<Project> インターフェイスを実装したクラス
● ビルドスクリプト中に定義して apply
apply plugin: GreetingPlugin
class GreetingPlugin implements Plugin<Project> { void apply(Project project) { project.task('hello') << { println "Hello from the GreetingPlugin" } }}
Plugin<T> : http://www.gradle.org/docs/current/javadoc/org/gradle/api/Plugin.html
(http://www.gradle.org/docs/current/userguide/custom_plugins.html より)
Plugin<T> : http://www.gradle.org/docs/current/javadoc/org/gradle/api/Plugin.html
スタンドアロンのプラグインの作成
● ビルドスクリプトの準備とメタファイルの準備
<build.gradle ファイル>
dependencies { compile gradleApi() compile localGroovy()}
<src/main/resources/META-INF/gradle-plugins/xxxx.properties ファイル>
implementation-class=your.package.GreetingPlugin
プラグインを使う側
● buildscript の依存を定義しておいて apply
<build.gradle ファイル>
buildscript { repositories { maven { jcenter() } } dependencies { classpath group: 'your.package', name: 'xxxxplugin', version: '1.0' }}apply plugin: 'xxxx'
Android Gradle plugin と連携する
● アプリ開発では Android Gradle plugin と連携して動作させたいこともある
● ドキュメントは揃ってないので Android Gradle plugin の実装を読むしかない (と思う)
例: Android SDK のセットアップ
● ビルドスクリプト内で Android SDK の準備をする Gradle plugin。– nobuoka/vc-gradle-android-sdk-manager ←
作った
– cookpad/gradle-android-sdk-manager
– JakeWharton/sdk-manager-plugin
● CI だけでなく手元で開発する際にも便利。
Windows ユーザーへ朗報
build.gradle が UTF-8 で解釈される
● Gradle 1.x 系では、build.gradle の文字エンコーディングはデフォルトエンコーディングで解釈
● UTF-8 で書かれた build.gradle を日本語 Windows 上の Gradle で解釈させると…!!
● Gradle 2.0 では常に UTF-8 として解釈される!– http://vcs.hatenablog.com/entry/20131227/
1388097109
おわりに
● Gradle + Android Gradle plugin でビルド環境のカスタマイズがしやすくなった
● AAR フォーマットができてライブラリ公開がやりやすくなった
● 便利プラグインや便利ライブラリを作って公開したりしてコミュニティを盛り上げていきたいですね!