9.2K Views
October 05, 22
スライド概要
DroidKaigi 2022
Day2 Backdrop 16:20-16:45
https://droidkaigi.jp/2022/timetable/364969
顧客に価値を届け隊
はじめよう ビルドメトリクス komatatsu 1
こまたつ 弥生株式会社 Misocaを中心にAndroidアプリ開発に 従事 2
今日の内容 ● ● 前提の共有 1回のビルドの話 ○ ○ ● 1日のビルドの話 ○ ○ ○ ● ビルド時になにが起きているかを見る方法 さまざまな条件下のビルド結果を確認する方法 1日分を知ろうとするとどうなるか? 実際の計測方法 結果のイメージ まとめ 3
前提として 数値計測によって改善するサイクルを回そうと思ったとき、闇雲にデータをとるのは悪手 です 仮説を作ったうえでそれを証明・反証するためのデータ収集をしてください 4
「なんのために使うデータか?」 5
ビルドにかかる時間を知る 6
Androidアプリのビルドって? ビルドといってもAndroidアプリのビルドにはさまざまな工程があります 実際になにが行われているのかを見てみましょう 本スライドは、デザインの提供のみを目的としています。したがってご利用は、必ずご自身の責 任と判断によって行ってください。これらのデザインの利用、改変、運用の結果について DroidKaigi実行委員会はいかなる責任も負いません。 7
ビルド時になにが行われるか見てみよう Buildウィンドウを開きます ない場合は View > Tool Windows > Build ビルドボタン(▶)を押します 8
ビルド時になにが行われるか見てみよう 9
ビルド時になにが行われるか見てみよう 「> Task」ではじまる行のひとつひとつがgradle taskです debugリソースやAndroidManifestをマージしたり、DataBindingのクラスを作ったり たくさんの作業がgradle taskになっています assemble はたくさんのgradle taskを集めたもの 10
Build Analyzerを使ってみよう 先程のBuildウィンドウにある Build Analyzerを選択し ドロップダウンリストから Task を選択してみましょう 11
Build Analyzerを 使ってみよう タスクごとの実行時間が可視化されて います 12
ビルド時間は毎回おなじではない 13
gradle-profilerを使ってみよう https://github.com/gradle/gradle-profiler スタンドアロンのプロファイラー 複数回ビルドを行ったり、設定に基づいた条件でビルドを計測してくれる 詳しくは: https://developer.android.com/studio/build/profile-your-build 14
gradle-profilerでできること ● ● ● ● 複数回のビルド実行 クリーンビルドや増分ビルドの実行 CPU数や割当メモリを変更してのビルド実行 gradle-pluginのバージョン違いでのビルド実行 これらをシナリオという形でまとめて定義し実行できます 15
16
—profile との違い gradleには profile オプションがあり、インストール不要で使える gradle-profilerに比べると機能は少なく、1回のビルドの詳細なデータをHTMLで出力 する機能のみ Build Analyzerがあるのであまり使うことはなさそうです 17
./gradlew assembleDebug —profile の出力 18
ここまでの話は1回のビルドの時間 19
これが1日になると...? 20
1日に何回ビルドするかは不定 プロジェクトの状態によっても変わってくる たとえばリリース前になると増えてくる...などの時期要因 チームやメンバーによって1日のうちでコードを書ける時間が異なる 21
実際のビルドの記録をとります 22
1日のビルドを計測する ビルドの記録をGoogleAppScriptを経由して スプレッドシートに貯めるようにします 23
1日のビルドを計測する 24
1日のビルドを計測する ● ● APIの実装 クライアント側の実装 a. b. c. ビルド開始の記録 ビルド終了時の処理 ビルド完了時に bで作った処理を呼び出すようにする紐付け 25
1日のビルドを計測する(GASによるAPIの実装) 26
1日のビルドを計測する(クライアント側の実装) まずは app/build.gradle に開始時のタイムスタンプを記録します preBuildのタスクの最初にタイムスタンプをbuildStartTimeに保存 27
1日のビルドを計測する(クライアント側の実装) 28
1日のビルドを計測する(クライアント側の実装) 最後に先程作った sendLog のタスクがビルドの終わりに実行される様に紐付けます 詳しくは: https://docs.gradle.org/current/userguide/build_lifecycle.html#build_lifecyc le_events 29
実際にビルドしてみる 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
1週間後... 集計作業ができる この週は7分ぐらいしかビルド していませんでした..... 32
集計結果 ある日だけ平均速度が遅い 33
平均値が高い理由は? フルビルドしているときとそ うでない時で大きな差があ る 34
まとめ ビルドの中でどこに時間がかかるか知りたい → Build Analyzer 様々な条件下でどれくらいかかるか知りたい → gradle-profiler 実際にどれくらい時間を使ったかを知りたい → gradle taskを作って計測する 35
ありがとうございました 36