[android] モジュール管理で ビルド高速化!

24
[Android] モジュール管理で ビルド高速化! @ichigotake #potatotips 5

Upload: ichigotake-

Post on 14-Apr-2017

2.262 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: [Android] モジュール管理で ビルド高速化!

[Android] モジュール管理で ビルド高速化!

!

@ichigotake

!

#potatotips 5

Page 2: [Android] モジュール管理で ビルド高速化!

Profile

• name: @ichigotake

• hoby: 2013年夏頃からAndroidアプリ開発

!

• work: スタディプラス株式会社

Page 3: [Android] モジュール管理で ビルド高速化!

注意事項• この実験は全て構想段階もしくは模索中のもの

• まだまだ検証不足( 先週から開始

• gradle-android-plugin の仕様・バグを掴んでいないとハマるリスクがとても高い

• 検証の経過報告と思ってください

Page 4: [Android] モジュール管理で ビルド高速化!

Androidアプリ開発の悩み!

•巨大ではなくてもビルド時間がかる

•すぐに30秒越え

•つらい

•ツラい・つらい……

Page 5: [Android] モジュール管理で ビルド高速化!

検証のきっかけ

• ビルド時間を短くしたい!!!!

• LogCatの追記で1分も待たされる…

• ProductFlavors の模索時に気付きを得る

• ???「ライブラリのコンパイル速いよね」

Page 6: [Android] モジュール管理で ビルド高速化!

試しにアプリケーションプロジェクトを

ライブラリ化してみよう!!!!

Page 7: [Android] モジュール管理で ビルド高速化!

まずは結果からassembleDebugの実行時間

0秒

15秒

30秒

45秒

60秒

大きいアプリ(12,000行 リソース/依存多)

そこそこのアプリ(7,000行)

小さいアプリ(3,000行)

8秒10秒12秒

30秒

40秒

60秒

Before After

Page 8: [Android] モジュール管理で ビルド高速化!

前提条件• gradle-android-plugin 0.8.3 ( + AS 0.4.6

• assembleBuild を通す事のみを確認

(アプリは起動しない

• 試行ケース・回数は少なめ

• 実験結果はあくまで理論値

Page 9: [Android] モジュール管理で ビルド高速化!

検証した事1. 既存アプリを丸ごとライブラリ化

- apply plugin: ‘android' +apply plugin: ‘android-library'

!

2. mavenLocal化 !

$ ./gradlew :App:uploadArchives # /repository へ

3. 新アプリモジュール内はAndroidManifestのみ

Page 10: [Android] モジュール管理で ビルド高速化!

言いたい事は1つ

Page 11: [Android] モジュール管理で ビルド高速化!

構成イメージ/ProjectRoot

/App # dependencies { compile “${stock}” }

/Stock # アプリのソース/リソースを詰めたライブラリ

/repository # /Stock のアップロード先

mavenLocal() で /repository を追加しておく

Page 12: [Android] モジュール管理で ビルド高速化!

何がダメだったのか

アプリケーションプロジェクトでは…

• 毎回 mergeResource, preDexCompile を実行

• この2つが一番のボトルネック

• ライブラリは clean しない限り1回だけ実行?

Page 13: [Android] モジュール管理で ビルド高速化!

効能

コードをいじるためのコストが少し増える

• レガシー資産を凍結する仕組みとして

• 処理の共通化・汎用化への意識向上

• 注) デメリットと表裏一体

Page 14: [Android] モジュール管理で ビルド高速化!

考慮すべき事 その1• Activityはライブラリ化しない

• いわゆるコントローラを楽に編集出来ると小回り利く

• 密結合度が高いならI/Fの抽出などしてみる

• 自身のモジュール内に置かないとダメなモノもある

• AndroidManifestで参照する R.* など

Page 15: [Android] モジュール管理で ビルド高速化!

考慮すべき事 その2

既存コードの修正が必要な場合も

• ライブラリでは R.* が定数でなくなる

• R.* はアノテーションの引数・case文に使えない

• IDEで switch文をif-else に変換しよう

Page 16: [Android] モジュール管理で ビルド高速化!

考慮すべき事 その3• 毎回実行されるタスクのコストを下げる

• アプリモジュールにモノを置かない工夫

• モジュール の include を増やさない

• 依存でcompile projectを使わない工夫

Page 17: [Android] モジュール管理で ビルド高速化!

考慮すべき事 その4

1. いちいちuploadArchivesやるのはめんどう!

2. 作業中だけ作業用モジュールで

3. fixしたらライブラリモジュールへ

など、運用の一例として。

Page 18: [Android] モジュール管理で ビルド高速化!

考慮すべき事 そのn

細かい注意点はまだまだ他にも…!!

(5分でまとめるには多すぎる…)

Page 19: [Android] モジュール管理で ビルド高速化!

考慮すべき事 まとめ

• アプリモジュールは「今作業してるもの」のみにすると速くなる

• 用意,運用の手間とビルド時間短縮の費用対効果

• スムーズに移行出来るか,運用で混乱させないか

Page 20: [Android] モジュール管理で ビルド高速化!

実験対象の実測値は?

• でかいものは依存が複雑で難しい

• 各種罠と複雑な運用を避けると…

60秒 -> 2,30秒

くらいにはなりそう(未検証/予測値

Page 21: [Android] モジュール管理で ビルド高速化!

そもそも…

コード量を減らす,汎用処理はライブラリ化などを

実践していればこの実験も工夫もいらないはず…

Page 22: [Android] モジュール管理で ビルド高速化!

新規or小さい規模なら…

• モジュール内に置かないスタイルへの移行はそこまで苦にならないはず

• あわよくば独自汎用ライブラリも充実…するかも

Page 23: [Android] モジュール管理で ビルド高速化!

• 後日 検証結果をまとめて公開します

• おおよそ罠と回避策は見つかった

Page 24: [Android] モジュール管理で ビルド高速化!

Best, :)