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 Tools &
    Performance
    takahirom

    View Slide

  2. セッションの範囲

    View Slide

  3. 時間の関係で、網羅性よりも開発へのインパクトや、
    技術的な面白さが個人的にあった部分を選出して紹介します。
    また、調べたり、試したりして、動画にはない情報🕵も紹介します。
    どう紹介するか

    View Slide

  4. 時間の関係で、網羅性よりも開発へのインパクトや、
    技術的な面白さが個人的にあった部分を選出して紹介します。
    また、調べたり、試したりして、分かったことなど、
    動画にはない情報も紹介します。
    今回の2大推し機能はLive Editと Baseline Profileです。
    どう紹介するか

    View Slide

  5. Tools
    What’s new in
    Android
    development
    tools

    View Slide

  6. 基本的にこれまでの 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

    View Slide

  7. 基本的にこれまでの 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
    デモから注目ポイントを紹介

    View Slide

  8. 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)

    View Slide

  9. What’s new in Android development tools
    連携していると、クラッシュしている箇所がコード
    上で警告が表示される。
    そこからクラッシュ数などが確認できる。
    クラッシュ一覧をAndroid Studio上で確認して、
    スタックトレースからコードを追うことも可能。
    Firebase Crashlyticsとの連携
    https://youtu.be/RFv8GkLd5OY?t=1865 より
    Android Studio Electric Eelの機能⚡

    View Slide

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

    Jetifierによる変換

    View Slide

  11. What’s new in Android development tools
    Build Analyzerに
    Check Jetifierが追加
    ライブラリがSupport Libraryに依存しているとJetifierをオフにできないが、
    これまではどのライブラリが昔のSupport Libraryに依存しているかが簡単に分からな
    かった。
    Android Studio Chipmunkの機能🐿

    View Slide

  12. What’s new in Android development tools
    ビルドが終わると
    Build Analyzerへのリンクが出ている
    これをクリックする
    Android Studio Chipmunkの機能🐿

    View Slide

  13. What’s new in Android development tools
    Warningのリストへ
    Android Studio Chipmunkの機能🐿

    View Slide

  14. What’s new in Android development tools
    Warningのリスト
    ここではJetifierが必要に
    なっている
    という警告が出ている
    Android Studio Chipmunkの機能🐿

    View Slide

  15. What’s new in Android development tools
    どのライブラリが昔の Support Libraryに
    依存しているかが簡単にわかるように Android Studio Chipmunkの機能🐿

    View Slide

  16. What’s new in Android development tools
    ライブラリをアップデートする前に、
    アップデートするときにどのバージョンがいいのか
    QuickFixでGoogle Play SDK Indexが確認でき
    るように
    Android Studio Electric Eelの機能⚡

    View Slide

  17. What’s new in Android development tools
    SDKの利用データなどを利用して、SDK
    を選ぶのを助けるサイト。
    実際ここではこのURLが開かれた。🕵
    https://play.google.com/sdks/details/com-googl
    e-firebase-firebase-auth
    そのSDKの一般的に導入されている
    バージョンなどが確認できる。
    Google Play SDK Indexとは?

    View Slide

  18. What’s new in Android development tools
    Androidはフレームごとに描画しているが、処理
    時間がフレームを超えるとそのフレームはそのま
    まになり、もたつくような動き (= Jank)になる。
    UI jank detection
    Android Studio のChipmunk機能🐿

    View Slide

  19. What’s new in Android development tools
    Android StudioのプロファイラでJankが出ている
    部分を教えてくれる。
    フレームのデッドラインも表示して、超えた部分
    が赤く表示されて改善するべき場所がかなり分
    かりやすい。
    UI jank detection
    改善するべき場所
    デッドライン
    Android Studio のChipmunk機能🐿

    View Slide

  20. 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の機能🐬

    View Slide

  21. What’s new in Android development tools
    ● 実機端末をつないでいるときに
    Android Studio内で画面が見られるの
    で開発が楽になる。
    ● 複数端末もつなぐことができる。
    Device Mirroring
    https://www.youtube.com/watch?v=RFv8GkLd5OY より
    Android Studio Electric Eelの機能⚡

    View Slide

  22. What’s new in Android development tools
    ● 一見通常のエミューレーターのように見え
    ますが、上からレイアウトの切り替えができ

    ● これによって異なる画面サイズでの確認が
    簡単に
    ● それぞれのサイズを最初に開くときにちょっ
    と重いけど、最初だけだそうです。
    Resizable Emulator
    https://www.youtube.com/watch?v=RFv8GkLd5OY より
    Android Studio Electric Eelの機能⚡

    View Slide

  23. 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の機能⚡

    View Slide

  24. What’s new in Android development tools
    ● Jetpack ComposeはRecompositionがたくさん起きると、
    パフォーマンスが悪化する
    Recomposition Count
    Android Studio Dolphinの機能🐬

    View Slide

  25. What’s new in Android development tools
    ● Jetpack ComposeはRecompositionがたくさん起きると、
    パフォーマンスが悪化する
    ● LayoutInspectorでRecomposition Countsにチェックを入れると見られる。
    Recomposition Count
    Android Studio Dolphinの機能🐬

    View Slide

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

    View Slide

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

    View Slide

  28. Composeの変更を瞬時に反映する
    Live Edit
    Android Studio Electric Eelの機能⚡

    View Slide

  29. Preview Emulator
    Android Studio Electric Eelの機能⚡

    View Slide

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

    View Slide

  31. 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

    View Slide

  32. What’s new in Android development tools
    実際にコードを変えているわけではないので、さまざまな制約がこの仕組みのため生
    じる。
    Live Editの仕組みと制約

    View Slide

  33. 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

    View Slide

  34. Performance
    Performance
    best practices
    for Jetpack
    Compose

    View Slide

  35. Adobe Stock#243026154
    releaseでR8を使ってパフォーマンスの
    検証を行ってください。デバッグではデ
    バッグの体験を良くするために最適化
    をオフしているため。
    Configuration
    たくさんのJetpack Composeの
    パフォーマンスを最適化できる
    ポイント
    Gotchaは落とし穴みたいな意味で使
    われるようです。
    Gotchas
    Performance best practices for Jetpack
    Compose

    View Slide

  36. Adobe Stock#243026154
    releaseでR8を使ってパフォーマンス
    の検証を行ってください。デバッグでは
    デバッグの体験を良くするために最適
    化をオフしているため。
    Configuration
    たくさんのJetpack Composeの
    パフォーマンスを最適化できる
    ポイント
    Gotchaは落とし穴みたいな意味で使
    われるようです。
    Gotchas
    Performance best practices for Jetpack
    Compose

    View Slide

  37. Adobe Stock#243026154
    releaseでR8を使ってパフォーマンスの
    検証を行ってください。デバッグではデ
    バッグの体験を良くするために最適化
    をオフしているため。
    Configuration
    たくさんのJetpack Composeの
    パフォーマンスを最適化できる
    ポイント
    Gotchaは落とし穴みたいな意味で使
    われるようです。
    Gotchas
    Performance best practices for Jetpack
    Compose

    View Slide

  38. ● (ディライブと読む)
    derivedStateOf{}を使って
    Recomposeを減らす
    Performance best practices for Jetpack
    Compose

    View Slide

  39. Proprietary + Confidential
    “上にスクロールボタン”を
    ちょっとスクロールしていたら出したい
    https://youtu.be/EOQB8PTLkpY?t=304 より

    View Slide

  40. Proprietary + Confidential
    最初に見えているItemが1個目じゃなければ
    ボタンを表示。。。
    https://youtu.be/EOQB8PTLkpY?t=304 より

    View Slide

  41. Proprietary + Confidential
    このComposable関数の中で
    listStateを読み込むと
    不必要にスクロールのフレームごとに
    このComposable関数全体を再度実行する😂
    https://youtu.be/EOQB8PTLkpY?t=304 より

    View Slide

  42. Proprietary + Confidential
    derivedStateOf{}で
    スクロールの変化があったときにこのラムダ内
    だけ実行して、計算結果が変わったときだけ
    外側のComposable関数が再実行される
    https://youtu.be/EOQB8PTLkpY?t=304 より

    View Slide

  43. ComposeにはComposition -> Layout -> Drawというフェーズがあり、もし
    Compositionをもう一度行うと、すべてフェーズが実行される
    なるべく後のフェーズを利用する
    Performance best practices for Jetpack
    Compose
    https://youtu.be/EOQB8PTLkpY?t=
    558 より

    View Slide

  44. なるべく後のフェーズを利用する
    Performance best practices for Jetpack
    Compose
    https://youtu.be/EOQB8PTLkpY?t=633 より
    色のアニメーションをしたいときに、これだと色が変わるたびに
    Composition -> Layout -> Drawが走る。

    View Slide

  45. なるべく後のフェーズを利用する
    Performance best practices for Jetpack
    Compose
    https://youtu.be/EOQB8PTLkpY?t=633 より
    drawBehind{}のラムダ内でColorの値を
    使うと

    colorが変わったときに

    CompositionとLayoutを飛ばして、

    Drawフェーズだけ再度行うことができる


    View Slide

  46. Performance
    Lazy Layouts in
    Compose

    View Slide

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

    01
    ● LazyLayoutという新しいコ
    ンポーネント
    ● Item animations
    新機能
    02
    いくつかのTips
    最適化Tipsと
    Performance
    について
    03
    Lazy Layouts in Compose

    View Slide

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

    01
    ● LazyLayoutという新しいコ
    ンポーネント
    ● Item animations
    新機能
    02
    いくつかのTips
    最適化Tipsと
    Performance
    について
    03
    Lazy Layouts in Compose

    View Slide

  49. LazyLayout
    今のLazyColumnなどでサポートされていないものを利用した
    いときに利用する。

    例えばWearのスクロールで大きさが変わるレイアウト
    ScalingLazyColumnが

    これを使って作られている。


    RecyclerViewに対するLayoutManagerに似ている。

    Lazy Layouts in Compose
    https://developer.android.com/codelabs/compose-for-
    wear-os?hl=ja#6 より
    Compose 1.2.0 alpha08〜の機能


    View Slide

  50. Item animations
    https://youtu.be/1ANt65eoNhQ?t=722 より
    並び替えのアニメーションに対応している。

    アニメーションのスペックのカスタマイズも可能。

    itemにkeyを渡すことを忘れないようにする。

    itemに渡すkeyはStringなどの他に、parcelableである必要が
    あるが、この理由は画面回転を通して生き残るために
    rememberSavable{}が中で使われているから。



    Lazy Layouts in Compose
    Compose 1.1の機能


    View Slide

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

    01
    ● LazyLayoutという新しいコ
    ンポーネント
    ● Item animations
    新機能
    02
    いくつかのTips
    最適化Tipsと
    Performance
    について
    03
    Lazy Layouts in Compose

    View Slide

  52. 0ピクセルアイテムを使わない
    例えば、LazyColumnでは上からア
    イテムを埋めていくが、 0の高さだと
    いくらでも入るので、
    全部のアイテムを作ってしまう。
    そして、それぞれのアイテムで画像
    が読み込まれて、その後見えるとこ
    ろ以外は破棄する動きになる。 😇
    → 固定の大きさを入れておくと良
    い。
    Lazy Layouts in Compose
    https://youtu.be/1ANt65eoNhQ?list=PLWz5rJ2EKKc_gLZhqjTRn0
    vGssFiP_4Kb&t=850 より

    View Slide

  53. Content Typeを渡すAPIが追加

    Lazy Layouts in Compose
    https://youtu.be/1ANt65eoNhQ?list=PLWz5rJ2E
    KKc_gLZhqjTRn0vGssFiP_4Kb&t=1302 より
    Compositionを同じコンテントタイプ間で使い回
    す。これによって同じような構造をitemが持つと
    きにもっと効率的になる。
    Compose 1.2の機能

    View Slide

  54. Tools &
    Performance
    What's new in
    app
    performance

    View Slide

  55. ● 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

    View Slide

  56. ● 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

    View Slide

  57. ● 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

    View Slide

  58. App Startup
    ユーザーにいい第一印象やそうでない印象を与えられる場所。
    なぜ早くする必要があるのか今回は省略します。
    What's new in app performance

    View Slide

  59. 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 よ

    View Slide

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

    View Slide

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

    View Slide

  62. 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

    View Slide

  63. “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

    View Slide

  64. Macrobenchmark
    アプリのユースケースをテストできる。アプリの起動やスクロールのパフォーマンスなど。
    CIで継続的にチェック可能。
    App StartupではCold、Warm、Hot startupを見られる。
    Android Studio Bumblebee 🐝よりNew moduleから簡単に追加できるようになった。
    What's new in app performance

    View Slide

  65. 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 より

    View Slide

  66. Profileを提供することで、パフォーマンスの改善できる
    Baseline Profile

    View Slide

  67. Baseline Profile
    AndroidのAhead of time(AOT)コンパイラに情報を与えることができるツール。
    与えられた情報はAndroid runtimeによってクリティカルパスをプリコンパイルするために
    使われる。
    アプリの起動時間を改善する。

    Jank frameも軽減する。

    ライブラリでも提供でき、Composeなどはすでに提供している。
    What's new in app performance

    View Slide

  68. Baseline Profileの作成方法は?
    ドキュメントを参考にすれば簡単にできる。
    https://developer.android.com/topic/performance/baselineprofiles
    基本的には2ステップ
    ● Macrobenchmarkを動かしてプロファイルを作る
    ● プロファイルをアプリに入れてリリースする
    Android StudioにMacrobenchmarkモジュールを追加してくれる機能があ
    るので比較的楽にできる。
    What's new in app performance

    View Slide

  69. 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

    View Slide

  70. “AndroidのAhead of time(AOT)コンパイラに情報を与
    える”っていうのは何を提供するの?
    起動時に使われているメソッドのリスト。
    Baseline ProfileはMacrobenchmarkで実際にアプリを動かして
    使われたメソッドのリストを作る。
    前についているHSPは
    H = Hot
    S = Startup
    P = Post Startup
    を示す。
    What's new in app performance
    baseline-prof.txtの中身

    View Slide

  71. Composeなどはすでにライブラリで提供しているってこ
    とだったけど、アプリではやらなくていいってこと?
    アプリ内のメソッドについては事前コンパイルされないので、アプリでもできればやったほうが良い。
    ちなみにアプリのものとライブラリのものがマージされるみたい。
    What's new in app performance

    View Slide

  72. Baseline Profileが向いているアプリとかある?
    頻繁にリリースするアプリに向いている。数ヶ月に一回ならいらなそうかも。
    なぜなら、クラウドプロファイルという仕組みがあり、リリースから数日経つとGoogle Playから同じ仕組み
    でプロファイルが提供されるため。 (Cloud Profile)
    What's new in app performance

    View Slide

  73. 勝手に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

    View Slide

  74. Macrobenchmarkでは難読化しないっていうことだった
    けど、それでプロファイル作ったら、難読化されずに
    aab/ apkにプロファイル入っちゃわない?
    実際にaab/apkにアプリに組み込まれるときにマッピングファイルを見て、置き換えするので、問題ないよ
    うです。
    What's new in app performance

    View Slide

  75. 7〜最新OSまで対応。
    おそらくユーザーの90%以上はいるはず。
    7〜8.1に関してはクラウドプロファイルにも対応していないので、
    Baseline Profileを使う以外に最適化する方法がない。
    What's new in app performance
    対応OSは?Android 12以降だけ?

    View Slide

  76. What's new in app performance
    GDEのすたぜろさんがGitHubActionsで動かす例を書いてくれています。
    これをリリースのタイミングに動かすのが良いかもしれません。
    https://github.com/STAR-ZERO/DagashiApp/blob/main/.github/workflows/baseline-profile.yml#L55-L57
    継続的にBaseline Profileを

    更新していくには?

    View Slide

  77. 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

    View Slide

  78. 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

    View Slide

  79. 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.

    View Slide