Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Tools & Performance

Android Tools & Performance

takahirom

June 05, 2022
Tweet

More Decks by takahirom

Other Decks in Programming

Transcript

  1. 基本的にこれまでの Android Studioの おさらい Android Studio Bumblebee Android Studio Chipmunk

    Roadmap
 01 バージョンに関係なく、 便利な機能を いろいろ山盛りでデモで紹介 Demo 02 最後にDemoで触れた内容に少し 触れて、DolphinとElectric Eelに触 れる。 Update 03 What’s new in Android development tools
  2. 基本的にこれまでの Android Studioの おさらい Android Studio Bumblebee Android Studio Chipmunk

    Roadmap
 01 バージョンに関係なく、 便利な機能を いろいろ山盛りでデモで紹介 Demo 02 最後にDemoで触れた内容に少し 触れて、DolphinとElectric Eelに触 れる。 Update 03 What’s new in Android development tools デモから注目ポイントを紹介
  3. What’s new in Android development tools Android Studioの バージョン紹介 アルファベット順になっていて、動物の名前がついている。

    Android Studio Bumblebee 🐝 | 2021.1.1 必要なAndroid Gradle Plugin: 3.2-7.1 Android Studio Chipmunk 🐿 | 2021.2.1 必要なAndroid Gradle Plugin: 3.2-7.2 Android Studio Dolphin 🐬 | 2021.3.1 必要なAndroid Gradle Plugin: 7.3-xxx (現在 Beta) Android Studio Electric Eel ⚡ | 2022.1.1 必要なAndroid Gradle Plugin: 7.4-xxx (現在 Canary)
  4. What’s new in Android development tools 連携していると、クラッシュしている箇所がコード 上で警告が表示される。 そこからクラッシュ数などが確認できる。 クラッシュ一覧をAndroid

    Studio上で確認して、 スタックトレースからコードを追うことも可能。 Firebase Crashlyticsとの連携 https://youtu.be/RFv8GkLd5OY?t=1865 より Android Studio Electric Eelの機能⚡
  5. What’s new in Android development tools Build Analyzerに Check Jetifierが追加

    Jetifierとは、AndroidXの前のライブラリ”Support Library”と”AndroidX”を 一緒に使えるようにライブラリ内のパッケージ名を変換する仕組み。 これが有効になっているとビルドが遅くなる。 Android Studio Chipmunkの機能🐿 android.support.* androidx.* → Jetifierによる変換
  6. What’s new in Android development tools Build Analyzerに Check Jetifierが追加

    ライブラリがSupport Libraryに依存しているとJetifierをオフにできないが、 これまではどのライブラリが昔のSupport Libraryに依存しているかが簡単に分からな かった。 Android Studio Chipmunkの機能🐿
  7. What’s new in Android development tools Android StudioのプロファイラでJankが出ている 部分を教えてくれる。 フレームのデッドラインも表示して、超えた部分

    が赤く表示されて改善するべき場所がかなり分 かりやすい。 UI jank detection 改善するべき場所 デッドライン Android Studio のChipmunk機能🐿
  8. What’s new in Android development tools ログレベルで色分けされたり、コンパクトモードなどが選べ る さまざまなフィルタが使える •

    package:mineで自分のプロセスを見る • tag:タグなどでタグの絞り込み • tag:tag1 -tag:tag2でtag2を含まずtag1だけ検索す る。 • level:ERRORでエラーのみ • is:stacktrace スタックトレースのみの絞り込みがで きる(“is:” フィルタはElectric Eel Alpha 02だとまだ 動かないがいろいろ頑張ると動くが待つのが良さそ う🕵) 新しいLogcat Android Studio Dolphinの機能🐬
  9. What’s new in Android development tools • 実機端末をつないでいるときに Android Studio内で画面が見られるの

    で開発が楽になる。 • 複数端末もつなぐことができる。 Device Mirroring https://www.youtube.com/watch?v=RFv8GkLd5OY より Android Studio Electric Eelの機能⚡
  10. What’s new in Android development tools • 一見通常のエミューレーターのように見え ますが、上からレイアウトの切り替えができ る

    • これによって異なる画面サイズでの確認が 簡単に • それぞれのサイズを最初に開くときにちょっ と重いけど、最初だけだそうです。 Resizable Emulator https://www.youtube.com/watch?v=RFv8GkLd5OY より Android Studio Electric Eelの機能⚡
  11. What’s new in Android development tools Visual Lint • レイアウトで右からLayout

    Validation を 開いて、そこから⚠ボタンを押す。 • Bottom app barは小さい画面にのみ 推奨などが表示される。 • 今はAndroid Viewのみだが、今後 Composeも対応予定 https://www.youtube.com/watch?v=RFv8GkLd5OY より Android Studio Electric Eelの機能⚡
  12. What’s new in Android development tools • Jetpack ComposeはRecompositionがたくさん起きると、 パフォーマンスが悪化する

    • LayoutInspectorでRecomposition Countsにチェックを入れると見られる。 Recomposition Count Android Studio Dolphinの機能🐬
  13. What’s new in Android development tools • Recomposeが起きた場所が赤く表示される。 • またRecomposeが起きたカウントが確認できる

    • (DroidKaigiのアプリ、お気に入りするとだいたい全部Recomposeしている😇) Recomposition Count Android Studio Dolphinの機能🐬
  14. What’s new in Android development tools • Recomposeが起きた場所が赤く表示される。 • またRecomposeが起きたカウントが確認できる

    • (DroidKaigiのアプリ、お気に入りするとだいたい全部Recomposeしている😇) Recomposition Count 🕵うまくスキップできた カウントも表示される Android Studio Dolphinの機能🐬
  15. What’s new in Android development tools • Jetpack Composeでの変更を瞬時に反映できる •

    実機でも動く • Previewでも動く • Interactive Previewでも動く • 変更したコードのみをコンパイルするため、 プロジェクトサイズが大きくなってもビルド速度に影響しない Live Editができること Android Studio Electric Eelの機能⚡
  16. Android What’s new in Android development tools • 🕵 簡単に言うとLive

    Editで挙動を変更するためにクラスを入れ替えて、コンパイ ルしたコードをそのクラスに送って、そのクラスの挙動を変えている。 ◦ ART Tools Interface(ART TI)のRetransformClassesを使って、LiveEditStubsクラスを呼ばせるようにして、そのクラスにビルド し たBytecodeのクラスを流し込んで、その BytecodeをJavaコード上でインタプリタ実行することで、実行時に動作を差し替えているよ うに見える。 Live Editの仕組みと制約 Android Studio アプリ Composable関数の 実際のスコープラムダ LiveEditStubs RetransformClass Java bytecode
  17. What’s new in Android development tools • Live Editを使っている場所はパフォーマンスに影響するのでパフォーマンス計測に適さない ◦

    → Release buildでProfilable apkなどを使う • 例えばNavigationでリスト画面から詳細画面に移動した後に LiveEditするとリストの画面に戻 る ◦ → 部分的なCompositionができるように開発中 • 実機では関数名の変更などができない。 ◦ → Previewではその部分をコンパイルしなおすため Live Editで変更できる。 など Live Editが現状できないこと 参考: https://developer.android.com/studio/run#limitations
  18. なるべく後のフェーズを利用する Performance best practices for Jetpack Compose https://youtu.be/EOQB8PTLkpY?t=633 より drawBehind{}のラムダ内でColorの値を

    使うと
 colorが変わったときに
 CompositionとLayoutを飛ばして、
 Drawフェーズだけ再度行うことができる

  19. • RecyclerViewと似ている。 • たくさんの表示するアイテムが あったとしても、必要に応じてコ ンテンツを作ってくれて、パ フォーマンスを最適化する。 • 現在、LazyColumnや LazyRow、LazyGridが存在す

    る。 一般的な ユースケース
 01 • LazyLayoutという新しいコ ンポーネント • Item animations 新機能 02 いくつかのTips 最適化Tipsと Performance について 03 Lazy Layouts in Compose
  20. • RecyclerViewと似ている。 • たくさんの表示するアイテムが あったとしても、必要に応じてコ ンテンツを作ってくれて、パ フォーマンスを最適化する。 • 現在、LazyColumnや LazyRow、LazyGridが存在す

    る。 一般的な ユースケース
 01 • LazyLayoutという新しいコ ンポーネント • Item animations 新機能 02 いくつかのTips 最適化Tipsと Performance について 03 Lazy Layouts in Compose
  21. • RecyclerViewと似ている。 • たくさんの表示するアイテムが あったとしても、必要に応じてコ ンテンツを作ってくれて、パ フォーマンスを最適化する。 • 現在、LazyColumnや LazyRow、LazyGridが存在す

    る。 一般的な ユースケース
 01 • LazyLayoutという新しいコ ンポーネント • Item animations 新機能 02 いくつかのTips 最適化Tipsと Performance について 03 Lazy Layouts in Compose
  22. Content Typeを渡すAPIが追加 に Lazy Layouts in Compose https://youtu.be/1ANt65eoNhQ?list=PLWz5rJ2E KKc_gLZhqjTRn0vGssFiP_4Kb&t=1302 より

    Compositionを同じコンテントタイプ間で使い回 す。これによって同じような構造をitemが持つと きにもっと効率的になる。 Compose 1.2の機能
  23. • Android Studioのプロファイラ とWebツールのPerfettoがあ り、相互運用可能。 • Perfettoだとtrace processorを 使うとSQLベースで詳細な分析 ができる。

    • Google PlayのAndroid Vitals も利用できる。実際のデバイス でのパフォーマンスが見られ る。なにか異常があったときに 通知が受け取れる。 Performance tools
 01 • ユーザーにいい第一印象 やそうでない印象を与えら れる場所。 • Cold/Warm/Hot Startup。 TTID/TTFD。 Activity#reportFullyDraw n() • Macrobenchmark • Baseline profiles • App Startup Library • JankとJank Stats App Startup / Jank 02 • Mainlining ART • 新しいGarbage Collector(GC) • Runtimeの改善 Runtimeの改 善 03 What's new in app performance
  24. • Android Studioのプロファイラ とWebツールのPerfettoがあ り、相互運用可能。 • Perfettoだとtrace processor を使うとSQLベースで詳細な分 析ができる。

    • Google PlayのAndroid Vitals も利用できる。実際のデバイス でのパフォーマンスが見られ る。なにか異常があったときに 通知が受け取れる。 Performance tools
 01 • ユーザーにいい第一印象 やそうでない印象を与えら れる場所。 • Cold/Warm/Hot Startup。 TTID/TTFD。 Activity#reportFullyDraw n() • Macrobenchmark • Baseline profiles • App Startup Library • JankとJank Stats App Startup / Jank 02 • Mainlining ART • 新しいGarbage Collector(GC) • Runtimeの改善 Runtimeの改 善 03 What's new in app performance
  25. • Android Studioのプロファイラ とWebツールのPerfettoがあ り、相互運用可能。 • Perfettoだとtrace processorを 使うとSQLベースで詳細な分析 ができる。

    • Google PlayのAndroid Vitals も利用できる。実際のデバイス でのパフォーマンスが見られ る。なにか異常があったときに 通知が受け取れる。 Performance tools
 01 • ユーザーにいい第一印象 やそうでない印象を与えら れる場所。 • Cold/Warm/Hot Startup。 TTID/TTFD。 Activity#reportFullyDraw n() • Macrobenchmark • Baseline profiles • App Startup Library • JankとJank Stats App Startup / Jank 02 • Mainlining ART • 新しいGarbage Collector(GC) • Runtimeの改善 Runtimeの改 善 03 What's new in app performance
  26. App Startup TTID/TTFD • TTID : Time to initial display

    プロセスが起動 Objectが初期化 Activityが作成された状態 Layoutが作成された状態 最初のフレームが表示された状態 What's new in app performance ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms https://developer.android.com/topic/performance/vitals/launch-time よ り
  27. App Startup TTID/TTFD • TTFD: Time to full display すべての関連するデータがロードされている。ユーザーが操作可能。

    What's new in app performance https://developer.android.com/topic/performance/vitals/launch-time よ り
  28. App Startup TTID/TTFD • TTFD: Time to full display すべての関連するデータがロードされている。ユーザーが操作可能。

    OSにはTTFDのタイミングがわからない。 AndroidにActivity#reportFullyDrawn()を呼ぶことで、教えることができる。 What's new in app performance
  29. App Startup TTID/TTFD • TTFD: Time to full display すべての関連するデータがロードされている。ユーザーが操作可能。

    OSにはTTFDのタイミングがわからない。 AndroidにActivity#reportFullyDrawn()を呼ぶことで、教えることができる。 startup metricsを収集するのに利用でき、 それだけでなくahead of time(AOT) or just in time(JIT)コンパイラに最適化さ れるべきコードパスの情報をAndroidフレームワークに提供する。 つまり一行追加するだけで、パフォーマンスが改善できる。 What's new in app performance
  30. “Every application should be using this API” Google Android Team

    Activity#reportFullyDrawn()について https://android-developers.googleblog.com/2021/11/improving-app-startup-facebook-app.html
  31. Macrobenchmark ベンチマークビルドは難読化するべきではないので、don't obfuscateを含む別のProguard Ruleファイ ルを作る。 app/benchmark-rules.pro -dontobfuscate What's new in

    app performance val benchmark by creating { initWith(release) signingConfig = signingConfigs.getByName("debug") matchingFallbacks.add("release") proguardFiles("benchmark-rules.pro") } https://github.com/android/nowinandroid より
  32. Baseline Profileの作成方法は? • Macrobenchmarkのためのモジュールを作る • Baseline Profileを作成するためのBaselineProfileRuleを利用したテストを追加す る。 • エミュレーターを起動する。(Managed

    Gradle Devicesでも可) • ベンチマークで効果を確認してみる。 • テストで実行するとadb pullコマンドが表示されるので、それを実行して、取得した プロファイルをbaseline-prof.txtにリネームしてソースフォルダ app/src/main/ に置 く。 • ProfileInstaller libraryをdependenciesに追加。 • ビルドしてリリースする。 What's new in app performance
  33. 勝手にCloud Profileで最適化されるなら、Baseline Profileいらなくない? Google Mapでは週1リリースしていて、Baseline Profileを入れることで30%起動を改善できたみたいで、 実績があるようです。 > Collecting and

    aggregating the profiles usually takes several days, which is a problem when many apps update on a weekly basis. 使えるようになるのに数日かかるため。 参考: https://android-developers.googleblog.com/2022/01/improving-a pp-performance-with-baseline.html 参 考:https://developer.android.com/topic/performance/baselinepro files What's new in app performance
  34. Baseline Profileのハマりポイントは?1 • なるべく新しいライブラリを使おう ◦ うまくベンチマークが取れないことがある(Microbenchmark 1.1.0-rc02以上) ◦ aabにprofileが含まれないバグ(AGP 7.2.1以上)

    ◦ https://issuetracker.google.com/issues/230361284 ◦ Primary dexしかみられないバグ(AGP 7.3.0-beta01以上) ▪ そこまで大きな影響はないかも ▪ > Baseline profiles are only correctly packaged for the primary classes.dex file ▪ https://developer.android.com/topic/performance/baselineprofiles#known-issues What's new in app performance
  35. Baseline Profileのハマりポイントは?2 • Marcobenchmarkによる生成のハマりポイント • Google Playがないエミュレーターで実行する必要がある。(root権限が必要) • Android 12Lなどだと動かなかったりする

    (自分はAPI Level 30で動いた) • Macrobenchmarkを動かすビルドタイプのproguardは-dontobfuscateを使う。難読化されたプロ ファイルは使えない。(リリースでは-dontobfuscateしないようにしてください。リリースとは別のビル ドタイプを作っておくと良いです) • プロダクトフレーバーがある場合は、benchmarkのモジュールが同じプロダクトフレーバーを持つよ うにしないとビルドできないので、benchmarkのモジュールにもフレーバーを追加する • 途中から動かなくなって内部エラーみたいなので落ちる場合にプロファイルたくさん録っているせいで 容量不足になっている場合があるので adb shellして、cd /sdcardして、find .したりして、大きいファイルを探してみる。 What's new in app performance
  36. Thank you! Google Developers Expert for Android DroidKaigi Co-Organizer ABEMA

    Native Team / CyberAgent Developer Experts @new_runnable takahirom(Takahiro Menju) Thanks Yuji Hato, Seiya Kokushi for the review and suggestions.