59
Copyright © 2014 Soichiro Kashima All rights reserved. Android App Development with Gradle & Android Studio Tech Circle #3 2014.8.19 Soichiro Kashima

Android App Development with Gradle & Android Studio

Embed Size (px)

DESCRIPTION

社内の勉強会でGradleとAndroid Studioを紹介したときの資料です。 一部編集してあります。

Citation preview

Page 1: Android App Development with Gradle & Android Studio

Copyright © 2014 Soichiro Kashima All rights reserved.

Android App Development with Gradle & Android Studio

Tech Circle #3 2014.8.19 Soichiro Kashima

Page 2: Android App Development with Gradle & Android Studio

Introduction

‣ Android の新ビルドシステムのご紹介

‣ UI などの 作り方 が注目されがちだが…

‣ ビルド は納品/リリースに関わる重要作業

‣ ストア や OS のアップデートが頻繁にあるため 常に最新仕様でリリースができる知識が必要

2

Page 3: Android App Development with Gradle & Android Studio

Agenda

1. 従来の Android アプリのビルド

2. Gradle & Android Studio

3. Product Flavor 

4. 活用例(CI)

5. まとめ

3

Page 4: Android App Development with Gradle & Android Studio

従来の Android アプリのビルド

4

Page 5: Android App Development with Gradle & Android Studio

アプリの中身

‣ アプリ = APK ファイル = ZIP ファイル

‣ Dalvik VM / ART で動作

‣ Java → .class → .dex

5

Page 6: Android App Development with Gradle & Android Studio

アプリの中身

‣ Java プログラム以外にもいろいろ

‣ AndroidManifest.xml  

‣ リソース

‣ 文字列,画像,色,アニメーション,…

‣ ネイティブライブラリ(*.so)

6

Page 7: Android App Development with Gradle & Android Studio

APK ファイルができるまでの工程

‣ ソースファイル生成(R.java,BuildConfig.java)

‣ コンパイル

‣ ProGuard(難読化)

‣ 署名なし APK ファイル作成

‣ ZipAlign  

‣ 署名

7

Page 8: Android App Development with Gradle & Android Studio

必要になる APK ファイルの種類

‣ デザイン確認用(モックアップ)

‣ デバッグ用

‣ ステージング環境接続用

‣ UAT用(お客様用)

‣ 本番用

8

さらに種類が必要な場合も… Free/Pro,Google Play,

Amazon,…

Page 9: Android App Development with Gradle & Android Studio

手作業での管理は困難

‣ あまりにも種類が多い

‣ 自動化するためにビルドの知識が重要

9

Page 10: Android App Development with Gradle & Android Studio

従来の Android アプリビルド

‣ 元々 Android がサポートしていたビルド方法

‣ Eclipse ADT → Export (GUI)

‣ Ant 

10

Page 11: Android App Development with Gradle & Android Studio

Ant の限界

‣ 表現力が低い

‣ 標準で用意されているのは Debug / Release のみ

‣ 工夫すれば増やせるが…

11

Page 12: Android App Development with Gradle & Android Studio

さすがに無理がある

‣ XXX 環境向けの APK 作って

‣ お客さんが XXX に YYY の設定で試したいって

‣ 途中でもいいから試させて

‣ これ前入れてもらったのと何が変わったの?

12

Page 13: Android App Development with Gradle & Android Studio

新しいシステムへの期待…

‣ ビルドの管理は大変になるばかり…

‣ そろそろ新しい仕組みが必要なのでは?

‣ と思っていたところに…!

13

Page 14: Android App Development with Gradle & Android Studio

Gradle & Android Studio

14

Page 15: Android App Development with Gradle & Android Studio

Android Studio 登場15

https://developer.android.com/sdk/installing/studio.html

Page 16: Android App Development with Gradle & Android Studio

Android Studio 登場

‣ 2013年登場,つい最近までα版,現在β版(0.8.0)

‣ Eclipse でなく IntelliJ IDEA ベース

‣ Gradle と統合されている

‣ Gradle + Android Gradle Plugin

16

Page 17: Android App Development with Gradle & Android Studio

Android Studio 登場

‣ Gradle は Groovy の DSL であり拡張が容易

‣ Gradle

‣ http://www.gradle.org/

‣ Groovy

‣ http://groovy.codehaus.org/

17

Page 18: Android App Development with Gradle & Android Studio

Android Studio 登場

‣ Product Flavor による複数のビルド設定管理が可能

‣ Ant / Maven / Ivy を統合できる依存関係管理

‣ マルチプロジェクト構成が可能

18

Page 19: Android App Development with Gradle & Android Studio

Android Studio 登場

‣ IDE でもコマンドラインでも同じ動作

19

IDE - Android Studio CLI - Gradle

Page 20: Android App Development with Gradle & Android Studio

Ant と Gradle

‣ ビルド定義

‣ Ant: build.xml = XMLファイル

‣ Gradle: build.gradle = Groovyスクリプト

‣ コマンド

‣ Ant: ant

‣ Gradle: gradle / gradlew

20

Page 21: Android App Development with Gradle & Android Studio

Gradle 自体はインストール不要

‣ Gradle Wrapper という数ファイルだけあれば OK

‣ シェルスクリプトと .bat がセット

‣ バージョン管理すれば皆同じバージョンを使える

‣ IDE がなくても IDE と同じビルドができる

21

Page 22: Android App Development with Gradle & Android Studio

‣ コマンド例

Gradle Wrapper

$ ./gradlew tasks # タスク一覧

$ ./gradlew assembleDebug # Debugビルド

$ ./gradlew assemble # 全種類ビルド

$ ./gradlew installDebug # インストール

$ ./gradlew connectedAndroidTest # 端末接続テスト

$ ./gradlew uninstallDebug # アンインストール

$ ./gradlew uninstallAll # 全アンインストール

22

Page 23: Android App Development with Gradle & Android Studio

依存関係管理

‣ 数行書くだけで簡単にライブラリを取り込める

‣ Eclipse のような面倒な設定が不要

23

Page 24: Android App Development with Gradle & Android Studio

‣ フェーズごとに依存関係を定義できる

依存関係管理

dependencies {

compile 'com.android.support:support-v4:20.0.+'

compile 'com.google.android.gms:play-services:5.0.77'

compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'

! androidTestCompile ‘xxxx:yyyy:1.0.0’

!}

24

APKに含める

テストのみ利用

Page 25: Android App Development with Gradle & Android Studio

‣ 機会があればぜひ使ってみてください!

依存関係管理

dependencies {

// ダイアログライブラリ

compile 'com.github.ksoichiro:simplealertdialog:1.1.1@aar'

// 入力チェックライブラリ

compile 'com.github.ksoichiro:androidformenhancer:1.1.0@aar'

// ボタンUIライブラリ

compile 'com.github.ksoichiro:richbuttons:0.1.1@aar'

}

25

Page 26: Android App Development with Gradle & Android Studio

カバレッジ計測

‣ JaCoCo が使える

‣ リフレクションがあると失敗する…(VerifyError)

26

android { jacoco { version = '0.7.0.201403182114' } : buildTypes { debug { testCoverageEnabled = true

利用するバージョン指定

計測有効化

Page 27: Android App Development with Gradle & Android Studio

ディレクトリ構成

‣ Eclipse と違い自由に構成可能

‣ Java ソースコード

‣ XML リソース

‣ テストコード

‣ AndroidManifest.xml

27

Page 28: Android App Development with Gradle & Android Studio

‣ Eclipse に合わせることも可能 → 段階的に移行可

ディレクトリ構成

android { sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] }

28

Page 29: Android App Development with Gradle & Android Studio

Product Flavor

29

Page 30: Android App Development with Gradle & Android Studio

Product Flavor

// アプリのIDをFlavorごとに分けて同時にインストールできるようにする

productFlavors { dev { // 開発用ID

applicationId "com.domodomo.android.dev" } dgate { // DeployGate用ID

applicationId "com.domodomo.android.dgate" } prod { // 本番用ID

applicationId "com.domodomo.android" } }

30

‣ ビルド時に少しだけ内容を変えられる

Page 31: Android App Development with Gradle & Android Studio

Product Flavor

‣ ソースも分離可能

‣ デバッグ機能の ON / OFF

‣ アプリ名の切り替え

‣ アイコンの切り替え

‣ Permission の有無

31

Page 32: Android App Development with Gradle & Android Studio

Build Variant

‣ ビルド構成を変える要素は2つある

‣ BuildType : ビルド自体の設定を切り替える

‣ ProGuard の有無,署名の種類など

‣ ProductFlavor : プログラムの内容を切り替える

‣ 有料/無料,アプリ名,API接続先など

32

Page 33: Android App Development with Gradle & Android Studio

Build Variant

‣ コマンドは ProductFlavors x BuildTypes

‣ installDevDebug / installDevRelease

‣ installStgDebug / installStgRelease

‣ installProDebug / installProRelease

33

Page 34: Android App Development with Gradle & Android Studio

Build Variant

‣ コマンドがやたら長くなるが省略可能

‣ 単語ごとに識別可能な分だけ入力すればOK

‣ installStagingDebug → iSD

‣ lintDevDebug → lDD

‣ check → ch

34

Page 35: Android App Development with Gradle & Android Studio

Build Variant

‣ 依存関係も Flavor ごとに指定できる

‣ dgateCompile ‘com.deploygate:sdk:2.4.+’

‣ DeployGate 配布用ビルドのみ DeployGate SDK

を含めてビルドする

(dgate という Flavor を定義している場合)

35

Page 36: Android App Development with Gradle & Android Studio

複数の Product Flavor

‣ Flavor の種類が複数ほしい

‣ API X の環境(開発/ステージング/本番)

‣ API Y の環境(開発/ステージング/本番)

36

Page 37: Android App Development with Gradle & Android Studio

複数の Product Flavor

‣ flavorDimensions で複数グループを組み合わせ

37

flavorDimensions "abi", "version"

!!productFlavors {

freeapp {

flavorDimension "version"

...

}

x86 {

flavorDimension "abi"

...

x86-freeapp-debug

x86-freeapp-release

arm-freeapp-debug

arm-freeapp-release

mips-freeapp-debug

mips-freeapp-release

x86-paidapp-debug

x86-paidapp-release

arm-paidapp-debug

arm-paidapp-release

mips-paidapp-debug

mips-paidapp-release

有料/無料アーキテクチャ

少し前まではflavorGroupsだった

Page 38: Android App Development with Gradle & Android Studio

利用例

‣ グルーピング例

‣ API等の外部接続先

‣ アーキテクチャ(ARM,x86,MIPS,…)

‣ リリース先のストア,配布サービス

‣ 製品/サービスのグレード(Lite,Pro)

‣ α/β/製品版(バグレポート自動送信機能の有無等)

38

Page 39: Android App Development with Gradle & Android Studio

Groovy / Gradle の活用

‣ 少しスクリプトを書けばこんなことも

‣ APK ファイル名にバージョン番号を入れる

‣ APK ファイル名にコミットハッシュ値をつける

‣ APK ファイル名に Flavor 名を入れる

39

Page 40: Android App Development with Gradle & Android Studio

Java プラグイン

‣ Javaプラグインと互換性がないのが難点

‣ Javaプラグイン?

‣ 標準的な Java プロジェクトをビルドできる

‣ Java プラグイン依存のライブラリが使えない

40

Page 41: Android App Development with Gradle & Android Studio

Java プラグイン

‣ .gradle ファイルを分ければ OK → CI 等に有効

‣ ./gradlew :app:connectedCheck

‣ 通常の端末接続テスト

‣ ./gradlew -p app -b app/coveralls.gradle coveralls

‣ カバレッジ計測結果を Coveralls へ送信

41

Page 42: Android App Development with Gradle & Android Studio

活用例(CI)

42

Page 43: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に43

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Page 44: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に44

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Page 45: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に45

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Page 46: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に46

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Page 47: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に47

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Page 48: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に48

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Page 49: Android App Development with Gradle & Android Studio

‣ Push をトリガーにして Gradle でビルドDocker container (Ubuntu)

CI で最新アプリを常時利用可能に49

JenkinsDocker

Android SDK

Git repo

GitLab

App project

Gradle Wrapper

APK

PC

1. git push

2. web hook

3. git clone4. docker run

5. ./gradlew assemble

APKAPKAPKMaven Central

android m2repository

Job終了後は Docker containerは破棄, Workspaceは残るので APKダウンロード可能

Page 50: Android App Development with Gradle & Android Studio

‣ Gradle じゃなくてもできる? Gradle だと簡単かも

GitHub + Travis CI + Coveralls

50

GitHubPC Travis CI Coveralls

Page 51: Android App Development with Gradle & Android Studio

‣ Gradle じゃなくてもできる? Gradle だと簡単かも

GitHub + Travis CI + Coveralls

51

GitHubPC

1. git push 2. web hook

Travis CI Coveralls

3. POST

Page 52: Android App Development with Gradle & Android Studio

‣ Gradle じゃなくてもできる? Gradle だと簡単かも

GitHub + Travis CI + Coveralls

52

GitHubPC

1. git push 2. web hook

Travis CI Coveralls

3. POST

複数のAPIレベルのエミュレータで ./gradlew assemble や

./gradlew connectedAndroidTest を実行できる

Page 53: Android App Development with Gradle & Android Studio

‣ Gradle じゃなくてもできる? Gradle だと簡単かも

GitHub + Travis CI + Coveralls

53

GitHubPC

1. git push 2. web hook

Travis CI Coveralls

3. POST

複数のAPIレベルのエミュレータで ./gradlew assemble や

./gradlew connectedAndroidTest を実行できる

成功したら JaCoCoのカバレッジデータを

Coverallsへ送信

Page 54: Android App Development with Gradle & Android Studio

‣ Gradle じゃなくてもできる? Gradle だと簡単かも

GitHub + Travis CI + Coveralls

54

GitHubPC

1. git push 2. web hook

Travis CI Coveralls

3. POST

複数のAPIレベルのエミュレータで ./gradlew assemble や

./gradlew connectedAndroidTest を実行できる

成功したら JaCoCoのカバレッジデータを

Coverallsへ送信

テスト結果やカバレッジは プロジェクトトップページで バッジとして確認できる

Page 55: Android App Development with Gradle & Android Studio

まとめ

55

Page 56: Android App Development with Gradle & Android Studio

Gradle/Android Studio 採用メリット

‣ ビルド管理が従来に比べて圧倒的に柔軟で便利

‣ IDE と CLI の結果が同じでありビルドに安心感

‣ 依存関係管理が手軽でライブラリ導入しやすい

‣ 開発スタートに必要なセットアップが少ない

56

Page 57: Android App Development with Gradle & Android Studio

Gradle/Android Studio 採用リスク

‣ α 版の間は激しく仕様変更があった→今後は…?

‣ Gradle 自体が頻繁にバージョンアップしている

‣ CheckStyle 等,Eclipse と統合してツールを使っていた場合は移行が難しいかも

‣ Eclipse に最適化された人が多いと抵抗があるかも

57

Page 58: Android App Development with Gradle & Android Studio

最新情報をチェックしよう

‣ New Build System - Android Tools Project Site

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

58

Page 59: Android App Development with Gradle & Android Studio

Thank you!

59