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

31
id:nobuoka (@nobuoka) 株式会社はてな 2014-08-23 京都 Android 勉強会 2014.08 Android アプリ開発における Gradle ビルドシステム

Upload: yu-nobuoka

Post on 15-Jan-2015

2.137 views

Category:

Software


4 download

DESCRIPTION

2014 年 8 月 23 日に開催された 「京都 Android 勉強会 2014.08」 での発表資料です。

TRANSCRIPT

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

id:nobuoka (@nobuoka)株式会社はてな

2014-08-23 京都 Android 勉強会 2014.08

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

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

こんにちは、id:nobuoka です

● 普段の仕事: web サービス開発– サーバーサイド: Perl

– クライアントサイド: Web (JS)、Android アプリ (Java)

● Java 好き● 最近は Docker 周りを調べたりしてる

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

概要

● Gradle と Android アプリ開発● Gradle や Android Gradle plugin の便利機能● AAR パッケージの公開● Gradle プラグインの作り方

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

Gradle とAndroid アプリ開発Gradle での Android アプリのビルドをしたことがない人向け

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

Gradle とは何か

● ビルドシステム– Maven とか Ant とか sbt とか Rake みたいな

● ビルド設定は Groovy による DSL で記述● Maven (Ivy) による依存管理が組み込まれている● Java 界隈で主に使われてる

– Java に限ったビルドシステムではない

– 最近は C/C++/Objective-C のサポートが向上

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

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" }}

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

Gradle の利点と欠点

● Groovy の処理を書ける → 自由度が高い● プラグインも作りやすい!● Maven リポジトリが使える● Groovy に慣れるまで難しい

– DSL として理解できても Groovy コードとして読めない

– API ドキュメントを見ても処理の流れがわかりづらい

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

Android Studio で Gradle 採用

● 最近ベータ版がリリースされた● 嫌でも Gradle のことを知る必要がある● IDE 上でのビルドが Gradle に統合されている

– IDE 上でもコマンドライン上でも同じ仕組みでビルド

– CI がやりやすい

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

Gradle による Android アプリのビルド

● Android Gradle plugin というプラグインでサポート

● Android 用ライブラリ → AAR パッケージ– リソースファイル入り JAR みたいな感じ (便利!!)

Android アプリプロジェクトor

Android ライブラリプロジェクト

Gradle + Android Gradle plugin

ビルドしたりテストしたり

Android Studio コマンドライン

使う 使う

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

Gradle や Android Gradle pluginの便利機能Android アプリ開発時に知っておくとよいこと

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

Gradle wrapper

● プロジェクト内に置ける Gradle コマンド (?)● 「gradlew」、「gradlew.bat」、

「gradle/wrapper」● Wrapper の使用が推奨されている

– Gradle がインストールされていない環境でも簡単に Gradle タスクを実行できる

– Gradle のバージョンを揃えられる

http://www.gradle.org/docs/current/userguide/gradle_wrapper.html

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

マルチプロジェクト

● 「settings.gradle」 にプロジェクト構成を記述● 複数のサブプロジェクトで構成

– 大きなアプリを複数のサブプロジェクトに分けるとか

– Maven リポジトリのないライブラリ (例: Volley) のコードをサブプロジェクトにするなど

http://www.gradle.org/docs/current/userguide/multi_project_builds.html

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

Android SDK の Maven リポジトリ

● Support library や Google Play Services の Maven リポジトリ

dependencies { compile 'com.android.support:appcompat-v7:20.0.0'}

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

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

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

buildTypes { release { buildConfigField "boolean", "XXX_DEBUG", "false" } debug { buildConfigField "boolean", "XXX_DEBUG", "true" }}

BuildConfig のプロパティをビルド時に決定

● ビルドタイプに応じて実行時に動作を変化させる● 使いすぎると混乱のもとだけど

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

他の便利機能

● ドキュメント: http://tools.android.com/tech-docs/new-build-system/user-guide

● 変更内容: http://tools.android.com/tech-docs/new-build-system– まだまだ開発中なので変更点を追いかけよう

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

AAR パッケージ

● Android ライブラリプロジェクトのバイナリディストリビューション

● classes.jar や AndroidManifest.xml やリソースファイルなどが含まれる

● リソースファイルの名前衝突には気を付ける必要がある (?)

● AAR は JAR と同じく Maven リポジトリに置ける

http://tools.android.com/tech-docs/new-build-system/aar-format

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

Maven リポジトリへのアップロード

● maven プラグインを使うのが今のところ良さそう● 単にアップロードするだけならそれほど大変では

ない– ローカル Maven リポジトリ

– 社内 Maven リポジトリ

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

例: ファイルシステム上へのデプロイ

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

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

一般的な Maven リポジトリ

● Maven Central へのデプロイはそこそこ大変– 手作業でやるべきことがいろいろあるし時間がかかる

– 参考: http://vividcode.hatenablog.com/entry/howto/publish-aar-package-to-maven-central-with-gradle

● 最近だと Bintray (jCenter) が良さそう?– Android Studio のプロジェクトのひな形でも Maven

Central ではなく jCenter を参照するようになっている

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

プラグインの利点

● ビルド処理を再利用可能な部品にパッケージ化● 多くのプロジェクトから利用できる● 他の人との共有も簡単● Groovy でも書けるし Java でも Scala でも書ける

– 個人的には Java で書くと理解しやすい

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

プロジェクト固有の簡単なプラグイン

● 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

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

スタンドアロンのプラグインの作成

● ビルドスクリプトの準備とメタファイルの準備

<build.gradle ファイル>

dependencies { compile gradleApi() compile localGroovy()}

<src/main/resources/META-INF/gradle-plugins/xxxx.properties ファイル>

implementation-class=your.package.GreetingPlugin

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

プラグインを使う側

● buildscript の依存を定義しておいて apply

<build.gradle ファイル>

buildscript { repositories { maven { jcenter() } } dependencies { classpath group: 'your.package', name: 'xxxxplugin', version: '1.0' }}apply plugin: 'xxxx'

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

Android Gradle plugin と連携する

● アプリ開発では Android Gradle plugin と連携して動作させたいこともある

● ドキュメントは揃ってないので Android Gradle plugin の実装を読むしかない (と思う)

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

例: Android SDK のセットアップ

● ビルドスクリプト内で Android SDK の準備をする Gradle plugin。– nobuoka/vc-gradle-android-sdk-manager ←

作った

– cookpad/gradle-android-sdk-manager

– JakeWharton/sdk-manager-plugin

● CI だけでなく手元で開発する際にも便利。

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

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

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

おわりに

● Gradle + Android Gradle plugin でビルド環境のカスタマイズがしやすくなった

● AAR フォーマットができてライブラリ公開がやりやすくなった

● 便利プラグインや便利ライブラリを作って公開したりしてコミュニティを盛り上げていきたいですね!