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-bu
ild-system/user-guide
● 変更内容:
http://tools.android.com/tech-docs/new-bu
ild-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/p
ublish-aar-package-to-maven-central-with-grad
le
● 最近だと 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 フォーマットができてライブラリ公開がやりや
すくなった
● 便利プラグインや便利ライブラリを作って公開した
りしてコミュニティを盛り上げていきたいですね!

Android アプリ開発における Gradle ビルドシステム

  • 1.
    id:nobuoka (@nobuoka) 株式会社はてな 2014-08-23 京都Android 勉強会 2014.08 Android アプリ開発における Gradle ビルドシステム
  • 2.
    こんにちは、id:nobuoka です ● 普段の仕事:web サービス開発 – サーバーサイド: Perl – クライアントサイド: Web (JS)、Android アプリ (Java) ● Java 好き ● 最近は Docker 周りを調べたりしてる
  • 3.
    概要 ● Gradle とAndroid アプリ開発 ● Gradle や Android Gradle plugin の便利機能 ● AAR パッケージの公開 ● Gradle プラグインの作り方
  • 4.
    Gradle と Android アプリ開発 Gradleでの Android アプリのビルドをしたことがない人向け
  • 5.
    Gradle とは何か ● ビルドシステム –Maven とか Ant とか sbt とか Rake みたいな ● ビルド設定は Groovy による DSL で記述 ● Maven (Ivy) による依存管理が組み込まれている ● Java 界隈で主に使われてる – Java に限ったビルドシステムではない – 最近は C/C++/Objective-C のサポートが向上
  • 6.
    Gradle ビルドスクリプトの例 // build.gradle applyplugin: '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" } }
  • 7.
    Gradle の利点と欠点 ● Groovyの処理を書ける → 自由度が高い ● プラグインも作りやすい! ● Maven リポジトリが使える ● Groovy に慣れるまで難しい – DSL として理解できても Groovy コードとして読めな い – API ドキュメントを見ても処理の流れがわかりづらい
  • 8.
    Android Studio でGradle 採用 ● 最近ベータ版がリリースされた ● 嫌でも Gradle のことを知る必要がある ● IDE 上でのビルドが Gradle に統合されている – IDE 上でもコマンドライン上でも同じ仕組みでビルド – CI がやりやすい
  • 9.
    Gradle による Androidアプリのビルド ● Android Gradle plugin というプラグインでサ ポート ● Android 用ライブラリ → AAR パッケージ – リソースファイル入り JAR みたいな感じ (便利!!) Android アプリプロジェクト or Android ライブラリプロジェクト Gradle + Android Gradle plugin ビルドしたりテストしたり Android Studio コマンドライン 使う 使う
  • 10.
    Gradle や AndroidGradle plugin の便利機能 Android アプリ開発時に知っておくとよいこと
  • 11.
    Gradle wrapper ● プロジェクト内に置けるGradle コマンド (?) ● 「gradlew」、「gradlew.bat」、 「gradle/wrapper」 ● Wrapper の使用が推奨されている – Gradle がインストールされていない環境でも簡単に Gradle タスクを実行できる – Gradle のバージョンを揃えられる http://www.gradle.org/docs/current/userguide/gradle_wrapper.html
  • 12.
    マルチプロジェクト ● 「settings.gradle」 にプロジェクト構成を記述 ●複数のサブプロジェクトで構成 – 大きなアプリを複数のサブプロジェクトに分けるとか – Maven リポジトリのないライブラリ (例: Volley) の コードをサブプロジェクトにするなど http://www.gradle.org/docs/current/userguide/multi_project_builds.html
  • 13.
    Android SDK のMaven リポジトリ ● Support library や Google Play Services の Maven リポジトリ dependencies { compile 'com.android.support:appcompat-v7:20.0.0' }
  • 14.
    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
  • 15.
    buildTypes { release {buildConfigField "boolean", "XXX_DEBUG", "false" } debug { buildConfigField "boolean", "XXX_DEBUG", "true" } } BuildConfig のプロパティをビルド時に 決定 ● ビルドタイプに応じて実行時に動作を変化させる ● 使いすぎると混乱のもとだけど
  • 16.
  • 17.
    AAR パッケージの公開 Android ライブラリをMaven リポジトリで共有する
  • 18.
    AAR パッケージ ● Androidライブラリプロジェクトのバイナリディスト リビューション ● classes.jar や AndroidManifest.xml やリソース ファイルなどが含まれる ● リソースファイルの名前衝突には気を付ける必要 がある (?) ● AAR は JAR と同じく Maven リポジトリに置ける http://tools.android.com/tech-docs/new-build-system/aar-format
  • 19.
    Maven リポジトリへのアップロード ● mavenプラグインを使うのが今のところ良さそう ● 単にアップロードするだけならそれほど大変では ない – ローカル Maven リポジトリ – 社内 Maven リポジトリ
  • 20.
    例: ファイルシステム上へのデプロイ 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
  • 21.
    一般的な Maven リポジトリ ●Maven Central へのデプロイはそこそこ大変 – 手作業でやるべきことがいろいろあるし時間がかかる – 参考: http://vividcode.hatenablog.com/entry/howto/p ublish-aar-package-to-maven-central-with-grad le ● 最近だと Bintray (jCenter) が良さそう? – Android Studio のプロジェクトのひな形でも Maven Central ではなく jCenter を参照するようになってい る
  • 22.
  • 23.
    プラグインの利点 ● ビルド処理を再利用可能な部品にパッケージ化 ● 多くのプロジェクトから利用できる ●他の人との共有も簡単 ● Groovy でも書けるし Java でも Scala でも書ける – 個人的には Java で書くと理解しやすい
  • 24.
    プロジェクト固有の簡単なプラグイン ● 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
  • 25.
    スタンドアロンのプラグインの作成 ● ビルドスクリプトの準備とメタファイルの準備 <build.gradle ファイル> dependencies{ compile gradleApi() compile localGroovy() } <src/main/resources/META-INF/gradle-plugins/xxxx.properties ファイル> implementation-class=your.package.GreetingPlugin
  • 26.
    プラグインを使う側 ● buildscript の依存を定義しておいてapply <build.gradle ファイル> buildscript { repositories { maven { jcenter() } } dependencies { classpath group: 'your.package', name: 'xxxxplugin', version: '1.0' } } apply plugin: 'xxxx'
  • 27.
    Android Gradle pluginと連携する ● アプリ開発では Android Gradle plugin と連携 して動作させたいこともある ● ドキュメントは揃ってないので Android Gradle plugin の実装を読むしかない (と思う)
  • 28.
    例: Android SDKのセットアップ ● ビルドスクリプト内で Android SDK の準備をする Gradle plugin。 – nobuoka/vc-gradle-android-sdk-manager ← 作った – cookpad/gradle-android-sdk-manager – JakeWharton/sdk-manager-plugin ● CI だけでなく手元で開発する際にも便利。
  • 29.
  • 30.
    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
  • 31.
    おわりに ● Gradle +Android Gradle plugin でビルド環境 のカスタマイズがしやすくなった ● AAR フォーマットができてライブラリ公開がやりや すくなった ● 便利プラグインや便利ライブラリを作って公開した りしてコミュニティを盛り上げていきたいですね!