はじめようビルドメトリクス

7.7K Views

October 05, 22

スライド概要

DroidKaigi 2022
Day2 Backdrop 16:20-16:45
https://droidkaigi.jp/2022/timetable/364969

profile-image

顧客に価値を届け隊

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

はじめよう ビルドメトリクス komatatsu 1

2.

こまたつ 弥生株式会社 Misocaを中心にAndroidアプリ開発に 従事 2

3.

今日の内容 ● ● 前提の共有 1回のビルドの話 ○ ○ ● 1日のビルドの話 ○ ○ ○ ● ビルド時になにが起きているかを見る方法 さまざまな条件下のビルド結果を確認する方法 1日分を知ろうとするとどうなるか? 実際の計測方法 結果のイメージ まとめ 3

4.

前提として 数値計測によって改善するサイクルを回そうと思ったとき、闇雲にデータをとるのは悪手 です 仮説を作ったうえでそれを証明・反証するためのデータ収集をしてください 4

5.

「なんのために使うデータか?」 5

6.

ビルドにかかる時間を知る 6

7.

Androidアプリのビルドって? ビルドといってもAndroidアプリのビルドにはさまざまな工程があります 実際になにが行われているのかを見てみましょう 本スライドは、デザインの提供のみを目的としています。したがってご利用は、必ずご自身の責 任と判断によって行ってください。これらのデザインの利用、改変、運用の結果について DroidKaigi実行委員会はいかなる責任も負いません。 7

8.

ビルド時になにが行われるか見てみよう Buildウィンドウを開きます ない場合は View > Tool Windows > Build ビルドボタン(▶)を押します 8

9.

ビルド時になにが行われるか見てみよう 9

10.

ビルド時になにが行われるか見てみよう 「> Task」ではじまる行のひとつひとつがgradle taskです debugリソースやAndroidManifestをマージしたり、DataBindingのクラスを作ったり たくさんの作業がgradle taskになっています assemble はたくさんのgradle taskを集めたもの 10

11.

Build Analyzerを使ってみよう 先程のBuildウィンドウにある Build Analyzerを選択し ドロップダウンリストから Task を選択してみましょう 11

12.

Build Analyzerを 使ってみよう タスクごとの実行時間が可視化されて います 12

13.

ビルド時間は毎回おなじではない 13

14.

gradle-profilerを使ってみよう https://github.com/gradle/gradle-profiler スタンドアロンのプロファイラー 複数回ビルドを行ったり、設定に基づいた条件でビルドを計測してくれる 詳しくは: https://developer.android.com/studio/build/profile-your-build 14

15.

gradle-profilerでできること ● ● ● ● 複数回のビルド実行 クリーンビルドや増分ビルドの実行 CPU数や割当メモリを変更してのビルド実行 gradle-pluginのバージョン違いでのビルド実行 これらをシナリオという形でまとめて定義し実行できます 15

17.

—profile との違い gradleには profile オプションがあり、インストール不要で使える gradle-profilerに比べると機能は少なく、1回のビルドの詳細なデータをHTMLで出力 する機能のみ Build Analyzerがあるのであまり使うことはなさそうです 17

18.

./gradlew assembleDebug —profile の出力 18

19.

ここまでの話は1回のビルドの時間 19

20.

これが1日になると...? 20

21.

1日に何回ビルドするかは不定 プロジェクトの状態によっても変わってくる たとえばリリース前になると増えてくる...などの時期要因 チームやメンバーによって1日のうちでコードを書ける時間が異なる 21

22.

実際のビルドの記録をとります 22

23.

1日のビルドを計測する ビルドの記録をGoogleAppScriptを経由して スプレッドシートに貯めるようにします 23

24.

1日のビルドを計測する 24

25.

1日のビルドを計測する ● ● APIの実装 クライアント側の実装 a. b. c. ビルド開始の記録 ビルド終了時の処理 ビルド完了時に bで作った処理を呼び出すようにする紐付け 25

26.

1日のビルドを計測する(GASによるAPIの実装) 26

27.

1日のビルドを計測する(クライアント側の実装) まずは app/build.gradle に開始時のタイムスタンプを記録します preBuildのタスクの最初にタイムスタンプをbuildStartTimeに保存 27

28.

1日のビルドを計測する(クライアント側の実装) 28

29.

1日のビルドを計測する(クライアント側の実装) 最後に先程作った sendLog のタスクがビルドの終わりに実行される様に紐付けます 詳しくは: https://docs.gradle.org/current/userguide/build_lifecycle.html#build_lifecyc le_events 29

30.

実際にビルドしてみる Executing tasks: [:app:assembleDevDebug] in project /Users/komatatsu/dev/repo/sample Configuration on demand is an incubating feature. > Task :app:preBuild > Task :app:preDevDebugBuild (中略) > Task :app:assembleDevDebug > Task :app:sendLog build time: 1.982sec send log: 200 You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 2m 37s 42 actionable tasks: 42 executed Build Analyzer results available 30

31.

完成! 31

32.

1週間後... 集計作業ができる この週は7分ぐらいしかビルド していませんでした..... 32

33.

集計結果 ある日だけ平均速度が遅い 33

34.

平均値が高い理由は? フルビルドしているときとそ うでない時で大きな差があ る 34

35.

まとめ ビルドの中でどこに時間がかかるか知りたい → Build Analyzer 様々な条件下でどれくらいかかるか知りたい → gradle-profiler 実際にどれくらい時間を使ったかを知りたい → gradle taskを作って計測する 35

36.

ありがとうございました 36