Google I/O 2023で驚いたところ

**個人的にとくに驚いたところを太字にしておきます。** 太字だけ流し見するのもありかもです。Android多めです。

## Keynote
https://www.youtube.com/watch?v=cNfINi5CNbY

全体的にAIって感じでした。 (夜中にみたのでおぼろげ)

- Magic View：今年リリース予定のImagive Viewに東京を含む。
- **Magic Editor：写真の中の人物の位置変更が可能に。**
    - 単純にすごい
- PaLM2：デバイスごとに最適化したモデルがある。スマホでも動くモデルも。
- Gemini：電子透かしを入れたりなどでAIに責任をもたせる。
- Bard：自然言語処理、画像生成、コード生成など多彩なタスクに対応できるAI言語モデル。日本語でも対応可能。
- Adobe Firefly：Bard内に組み込まれた機能で、画像生成が可能。
- AIとWorkspaceの統合：ジョブディスクリプションを書くなど、Docs内での作業をAIがサポート。
- Duet AI for Workspace：Sidekick、AIチャットが横に出てくる。おすすめの作業内容を提案。
- Google Slideでスピーカーノート作成支援機能あり。
- **Codey: code baseを学習し、入力支援や自動生成など**
    - Copilot的なやつ？
- PaLM 2をチャットAIとしてサービスに統合できる。Firebaseでも利用可能。
- Project Tailwind： **動画を同じような声で通訳するUniversal Translator。**
    - 吹き替えが自動化できそう。
- Android：スパムブロックAI、Find My Deviceでヘッドホンなども探せるように、RCSの画像の送信がE2Eで暗号化対応。
- Recordで翻訳が可能に。
- Pixel 7a、Pixel Tablet、Pixel Foldが発表された。
- Pixel Tablet： Androidアプリが使える。**Google TVアプリを利用でき**たり、いろんな機能がある。ドッグと組み合わせるとNest Hubみたいになる。(499ドル 比較的安い気がする)
    - どういう仕組みなんだろう？両方のアプリ使えるのかな？
- Pixel Fold：フォルダブル。デュアルスクリーンモードでは、両面のディスプレイを使用して、言語通訳。テーブルトップモードの撮影ができる。

## Developer Keynote
https://www.youtube.com/watch?v=r8T0SnwHRNI

 (夜中にみたのでおぼろげ)

- **Android Studio Bot: チャットボットが変更のコードを作成してくれる**
- **Android Studioには、Pixel FoldやPixel Tabletデバイス(Google hosted)のストリーミング機能が追加された、開発者は自分のIDEからデバイス上でアプリの動作を確認できるようになった。(多分Firebase Test Labがデバッグに使えるようになったものっぽい感じ？まだ未公開)**
- Android StudioにAndroid Vitalの連携が導入され、**SDKやアプリへの実装の追加なしに、Play Consoleからクラッシュレポートを取得してAndroidStudio上で表示できるように**
- Composeには、新しいUIコンポーネントが追加され、Android TV、Glance、Horizontal vertical pager、flow layoutなどのサポートが強化された。
- Flutterは、WebAssemblyを使用することで3倍速くなり、JetpackのAPI呼び出しもより簡単になった。
- MediaPipeを使用することで、様々なモデルを利用し、顔の形の変更などの多様な機能を実現することができる。(Python などで)
- Duet AI for Google Cloudを使用することで、独自のモデルを呼び出すことができる？
- 新しいChat APIが発表され、AtlassianのJiraアプリなどを構築することが可能になった。

## What's new in Android
https://www.youtube.com/watch?v=qXhjN66O7Bk

- Android 14
    - Privacy
        - 画像へのアクセス、ビデオへのアクセスなどのパーミッションダイアログの追加。ただ、パーミッションよりPhoto Pickerを使うことが推奨。
        - **location パーミッション取得時に、この位置がサードパーティに共有されるかどうかを表示する**
            - <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/9d37a741-d82a-9706-6a54-cb29c4f7a912.png" width=150 />
        - Notification setFullScreenIntentを使うのにパーミッションが必要に。
        - **Broadcast Recieverを使うときに他のアプリに公開するかしないかを指定する必要があるように。意図せずにデータをアプリ外に公開しないように。**
            - registerReciever(broadcastReciever, intentFilter, RECIEVER_EXPORTED または RECIEVER_NOT_EXPORTED)
        - 画面全体を共有するのではなく一つのアプリだけシェアできるように
        - パスキー
            - パスワードへの依存を減らす。
            - Jetpack Credential Manager library(alpha)
                - ユーザークレデンシャルをパスキーとして保存できる
            - Sandbox
                - Jetpackでサポートしていく
                - Cross-web and app attribution。多分ChromeとAndroidアプリでデータを共有できる？
    - Form Factors
        - 画面回転固定していたりするとこうなる(letterbox)。画面回転できるようにすることをおすすめする
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/cda2d97b-52d2-b469-1055-6cdabd15d239.png)
        - Camera
            - Foldableとかで引き伸ばされたりするのでCameraXかCamera2使うなりして対応してね
        - Wear OS
            - 新しいWatchFace Format
        - Android Automotive OS
            - **Android Automotive OSはほとんどモバイルアプリ、タブレット対応と同じコードでいけるそう**
        - Jetpack Glanceがベータに
    - Jetpack Compose
        - TV
            - alpha
            - TV特有のウィジェットが使える
        - Modifierのパフォーマンス改善
            - Textでも22％改善
    - Hedgehog
        - Compose stateの情報がdebuggerで確認できる。multi-preview template。visual lint。Accessibility Test Framework support。
    - Foreground Services
        - Jobタイプが必要になった。例えばmedia playback, navigation(地図のナビ), audio recordingなど
    - ML Kit
        - Face mesh (beta)の追加
        - ドキュメントスキャナ (Q4)
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/28f6c8f6-ce14-ca7a-464a-5e25cd4d21c0.png) https://youtu.be/qXhjN66O7Bk?t=1069 より
        - Acceleration Serviceでデバイス上での機械学習が高速に。
    - Android Runtime 
        - Android Runtime 14
            - Java 17対応
            - コードサイズなどの削減
        - アップデート可能性
            - ART 13はAndrodid 12でも動くように。これによってアプリの起動時間が30％削減できた。
    - Kotlinのセッション紹介
        - K2コンパイラ
        - BuildのKotlin Script
        - kapt -> ksp
        - KMP
    - Android 14のPredictive back animationのサポート
        - **AndroidManifestのActivityのところに宣言を書くことで、ActivityごとにPredictive back animationにマイグレーションできる。**
    - New design hub
        - 複数のform factorでどのようにデザイするのかを理解するのに役立つ
        - **またFigmaファイルによるstarter kitもある**
        - https://d.android.com/design/ui
    - Android 14 HDR 10-bitサポート
        - 撮った時の情報がより保存されて色々できるように
    - Media3 1.0
        - ExoPlayerとの互換性がある
    - Personalization
        - **Android Studio Giraffeから生成してlocaleのファイルを作ってくれるのでper-app language preferencesへの対応が自動でできる。 https://developer.android.com/guide/topics/resources/app-languages**
        - **Android 14 の locale manager APIで、ユーザーは自分が好きな単位を使って気温の温度を見たりできるようになる。**
            - https://developer.android.com/studio/preview/features
        - **言語によってはジェンダーで表現が違ったが、今までは男性のものがデフォルトで使われたりしてきた。これを解決するGrammatical Infection APIが追加**
        - Shareシートがカスタマイズ可能になった。
        - フォントサイズの変更が線形に大きくならないようになった。大きすぎないようになる。
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/8ffd5e1e-5ab9-4c4d-59f9-df8226dab138.png) https://youtu.be/qXhjN66O7Bk?t=1496 より
        - 頻繁に更新される要素があるときに便利な新しいAccessibility API
    - Tools
        - ジラフ ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/392617a7-7bc4-600c-7d21-d21c43488ae5.png)
            - 新しいUI
        - Hedgehog
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/510ffdb6-f12f-05af-513e-a701d56abdb2.png) https://youtu.be/qXhjN66O7Bk?t=1584 より
            - **Studio Bot**
                - Composeでリスト出したいんだけど？っていうような質問に答えてくれる
            - App Quality Insight+
                - Vitalsとの連携。もっと多くのクラッシュの起きた時の状況などの情報が得られるようになる
            - Gradle Plugin 8
                - BaselineProfileによって更に10%高速化
                - Dex Reordering 60%の改善
    - Kotlin Multiplatform
        - Annotation
        - Collection
        - DataSource
    - Architecture Guide
        - Config changeの更新など
    - Saving state androidのセッションでベストプラクティスをチェック
        - いくつかのシナリオでの改善方法など
    - paging test API
    - screenshot testingのセッションも
 
## What's new in Android development tools

https://www.youtube.com/watch?v=7lubRrkxagk

- Roadmap
    - Flamingo
        - Network InspectorTraffic Injection
            - ヘッダーやステータスコードを変更できる
        - Themed Apps Icon Preview
        - **SDK ExtensionのバージョンのLint。今の宣言以上の新しいAPI使っていたら警告など** 
            - SDK Extensionについてはここで書きました。 https://qiita.com/takahirom/items/7613a28cabdaae3e3f81
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/f5d4c8da-3114-ea86-caba-c09e6fd173e0.png)
- Demo
    - Giraffe, Hedgehog
        - targetSdk migration
            - どのようにアップデートすれば良いのか教えてくれる。また**Web版と違ってコード使って内容をフィルタリングして、必要なステップだけを教えてくれる。**
            - またコードの場所も教えてくれる。
        - Compose
            - LayoutInspectorがデバイスモニタリングのところで使える
                - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/d1ee9d99-79d6-b6f8-74e3-6245cf0cb99a.png)

            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/5267b0be-3cb6-ae0d-5ccc-af302533bc0e.png) https://youtu.be/7lubRrkxagk?list=PLEPxdDW_NeFPoA9iq8yjATfWCHIR-44Rl&t=261 より
            - **is:crashでのクラッシュの絞り込みができる**
            - Studio Bot
                - **Ask StudioBot about his log entryでクラッシュログについて聞ける**
                - **PlayGroundでbotの言っているコードを開ける**
                    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b52d03a1-d075-5e54-a630-aaefaca98a09.png)
                    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/163d3394-b1b9-050b-bd9a-1cc5a2e308eb.png)
                - **Unit testを書くのも頼める**
                - **Insert this Kotlin fileでテストであればテストのディレクトリに入れてくれる**
                - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/4972d4d1-a4a3-9301-4d97-96d2e08fb2d0.png)
                - **またちゃんとimportも入れてくれる**
                - **IDEアクションがわからない時 /stop at 6で6行目にブレークポイント入れたり/debug testって入れてbotがテスト走らせたりできる**
                - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/944d444b-2d9f-41e6-d20e-4b73b638cc75.png)
                - **またBotにリネームさせたりできる**![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/238b1bf4-216d-ece7-e131-81959aa33f64.png) https://youtu.be/7lubRrkxagk?list=PLEPxdDW_NeFPoA9iq8yjATfWCHIR-44Rl&t=519 より
    - Update
        - Firebase crashlytics
            - Vitalsとの連携
        - Google Assistant Plugin
            - Playストアでリリースしなくても試せる
        - Power profiler
            - バッテリー消費
        - DeviceExplorer
            - **Process一覧が表示でき、プロセスキルができるように**
        - Gradle Managed Devices on Firebase
        - Build AnalyzerがConfiguration cacheを有効にした場合にどのぐらい、ビルド時間を削減できるかを表示してくれるようになった。

## Best practices for saving UI state on Android

https://www.youtube.com/watch?v=V-s4z7B_Gnc

 - Congiguration Change
     - マルチウインドウモードや画面回転、ダークモードの切り替えなど
     - **いくつかのConfiguration ChangeのActivityのRecreateはManifestに書いても防ぐことはできない** (知ってはいたけど、これが紹介されるとは思わなかった)
     - ViewModelが使える。
         - UI Stateをconfiguration changeを通じて生き残らせるおすすめの解決方法。
 - システムがリソースが必要な時
     - Saved State API
         - アプリ外のメモリに保持される。
         - リストは使わないで。メモリをめっちゃ使う
         - **Navigation Composeで3回遷移している時、それぞれidがつけられ元の画面のSavedStateで保存されていて、戻るときにremoveStateされる。**

 - ユーザーがアプリを上にスワイプしたとき
     - 消えないストレージに保存する。
       - アプリケーションデータにいい



## What's new in Kotlin for Android

https://www.youtube.com/watch?v=QGtB--ABiNM

- Kotlin Foundation
    - GoogleとJetBrainsによって創設された、Kotlinが良く進化するようにする組織
    - K2 GoogleとJetBrainsでやってきた
    - K2のスケジュール
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/5a9708b5-8509-5fb8-42a8-244357258761.png) https://youtu.be/QGtB--ABiNM?list=PLEPxdDW_NeFPoA9iq8yjATfWCHIR-44Rl&t=287 より
    - K2はもう試せるので、フィードバックをお願いしている。
        - kotlin { sourceSets.all { languageSettings { languageVersion = "2.0"...
    - Kotlin DSLがデフォルトに
    - KSP
        - kapt Javaを生成するので遅い
        - KSP 速い、Nullableなどをサポート、MPPで動作
        - マイグレーションドキュメントを用意した
        - Dagger と Hiltも進んでいる
        - 少しずつでもKSP化を始めていくと良い
    - Kotlin Multiplatform
        - **Google WorkspacceではAndroid iOS WEBでKMPでロジックを共有している**
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/3693c1be-6404-1025-ed5b-5be7b09e4c76.png) https://youtu.be/QGtB--ABiNM?list=PLEPxdDW_NeFPoA9iq8yjATfWCHIR-44Rl&t=633


## Debugging Jetpack Compose

https://www.youtube.com/watch?v=Kp-aiSU8qCU

* **Debugは Define, Reproduce, Validate, Fixの順番にやっていくと良い。**
    * Define : 期待動作、実際に何が起こっているか、どうして起こっているか、仮説
    * Reproduce : テストを書く。将来的にまた起こらないようにする
    * Validate : 仮説を確かめる
    * Fix : 修正する
* recompositionには3種類ある
    * Direct Composition: Composable関数でStateを見ている場合
    * Indirect Composition: 親のComposable関数などでStateを見ている場合
    * Unskippaable recomposition: List<T>などでStable typeでなく、Skippableじゃない場合。
        * こういう場合に新しいAndroid Studioのデバッグ機能が使える。 
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/0c8b6509-08c5-b97b-fa0a-cdfca0e7e43c.png) https://youtu.be/Kp-aiSU8qCU?t=246 https://youtu.be/Kp-aiSU8qCU?t=255 
            * **Unstable typeのせいでrecomposeしているときはこれでわかる。**
        * たくさんアニメーションなどでrecomposeが走る場合は向かないので、そういうときはログが良い。
    * アクセシビリティや大画面に適切に対応できているかどうかってどうやったら確認できる？
        * Visual LintがCompose Previewをサポートした
            *![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/ea31e135-392b-79b3-643a-fcd9140e8d82.png)
            * ここではvoiceoverのエラーとtext colorの比率についてLintがでている
    * Jankどうしたら解決できる？
        * LayoutInspectorでまずComposition Countを確認する
            * スクロール中にrecomposeが起きて数が増えている場合は基本的にはもっと改善できるサイン
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/44c27588-c496-a52f-98b2-c18a35e1e3bf.png)
        * LayoutInspectorでHorizontalPagerダブルクリックしてそこでデバッガーを仕掛けて、なぜRecompositionが起きているのかを特定する。
        * 確かめるときにはMacroBenchmarkで確かめる
    * どこにフォーカスするべきか？
        * トレースで見る
        * System trace
            * 高速だが、情報が少ない
        * Method trace
            * 低速だが、情報が多い
        * **Compose Runtime TracingでSystem traceに情報を追加できる (上が下のようなトレースに変わる)**
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c39f95fc-c955-f6d7-099f-081f919de264.png) https://youtu.be/Kp-aiSU8qCU?t=972 より

            * **implementation "androidx.compose.runtime:runtime-tracing"を使う。**
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b8e1e83c-3d06-b470-32c8-8c187ea28040.png) https://youtu.be/Kp-aiSU8qCU?t=1124 より
            * **こういう隙間が空いているところをみつけて、コードを見に行って、原因を見つける**
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/5e5a6686-d9f8-4e3b-9a1f-ddb5e3ac664f.png)

## How to build a data layer

https://www.youtube.com/watch?v=P125nWICYps

データモデルはimmutableとか、repositoryがSSoTだとか知っているところみたいなところは飛ばすので、アーキテクチャのdata layerを読んでください。

- Data layerとは
    - アプリケーションデータを管理する
    - ビジネスロジックも持つ
        - アプリケーションデータがいつ作られ、保存され、アップデートされるか

    - **いいテストの構成方法はgiven-when-then structure。 (これはよく聞くけどGoogleのセッションで聞いたことはなかったかも)**
    - 失敗するからテストから始めるのはいいプラクティス。
    - **observeAll()でFlow<List<Task>>返している。** :eyes: (Flowはまだobserveしていないので、個人的には違和感ある。)
    - Repositoryでアプリ内のモデルにマッピングしている。 (個人的には大体のパターンでは変換しちゃって返しちゃってもいい派ではある)
    - **マッピング関数はそれらが使われる境界(boundaries)にいる必要がある**
        - **例えばLocalTask(DB用のモデル)にマッピング用の関数を置くなど。これによってLocalTaskを使うときに変換できる**
    - **マッピングをwithContextで別スレッドに逃している**
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/62c40e1b-2dc2-0e73-8ae4-48901211a2c0.png)
        - 何回タスクが実行されるのか、それぞれのマッピングが計算量が高くなり得るため
            - (自分はそこまではしていなかった。計測したいところ)


## What’s new in Android Performance — Google I/O 2023 edition

https://medium.com/androiddevelopers/whats-new-in-android-performance-google-i-o-2023-edition-21a1832c9fa3

こちらは動画ではなく記事
- Baseline Profile
    - Baseline Profile Gradle Plugin
        - instrumented testで実行されたメソッドたちを保存する
        - Baseline Profileをapplication module’s source-setにコピーしてくれる
        - baselineProfileブロックで色々設定できる。
    
    ```groovy
    baselineProfile {
    
        // This specifies the managed devices to use that you run the tests on. The default
        // is none.
        managedDevices += "pixel6Api31"
    
        // This enables using connected devices to generate profiles. The default is true.
        // When using connected devices, they must be rooted or API 33 and higher.
        useConnectedDevices = false
    }
    
    ```
    
    https://github.com/android/performance-samples/blob/bpgp/MacrobenchmarkSample/baselineProfile/build.gradle.kts#L57-L66
ドキュメント： https://developer.android.com/topic/performance/baselineprofiles/create-baselineprofile
     
    
     - AGP8のBaselineProfileの置き場所は src/main/baselineProfiles
     - **Android Studio HedgehogではBaseline Profile Generator module wizard templateが追加になった。**
 - **Android Gradle Plugin (AGP) 8.1から、primary dex fileに起動時に必要なコードを集められるようになった。**
     - dex layout optimizationと呼ばれる最適化
     - アプリ起動中のdex page faultsをへらす。
     - **ベースラインプロファイルで30%の改善で、さらに30%の改善ができる結果が出た。**
     - reportFullyDrawnを呼ばないと作るラインが最初のフレームになって、ベースラインプロファイルが作れず、うまく動かないので注意
         - Composeの FullyDrawnReporter なども使える。
 - Macrobenchmarkの更新
     - **Android 13からBaseline Profileを測定する際に、ルートが必要なくなった。(そもそも必要という認識がなかった)**
     - collectBaselineProfileではなく、collectStableBaselineProfileというのが追加になった。


## Scalable UI testing solutions

https://www.youtube.com/watch?v=L6CSaH0kDnI

* Espresso Device API
    * TestコードからバーチャルデバイスでConfiguration Changeが行える。
        * **同期APIなのでsleep関数が必要ないのが一番いいところ**
    * **Last canary versionのAGPとemulator 33.1.10かそれより新しいバージョンが必要**
        * ここにドキュメントがある https://developer.android.com/studio/preview/features#espresso-device-api
        * 思ったより深いAPIっぽい
        * インターネットパーミッションとかも必要
        * Test Ruleと画面回転などのAPIがある
        * **デバイスで実行するときに、foldableじゃない端末ではスキップすることもできる**
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b7ac131b-cd8c-c3cb-0909-1498d4acf054.png) https://youtu.be/L6CSaH0kDnI?t=287 より
    * Gradle Managed Devices
        * Gradleで Firebase Test labの端末を定義、実行できる
        * **IDE上で使える端末の補完が出る**
        * **Groupを定義することで複数の端末を一気に動かせる**
    * スクリーンショットテスト
        *  Reference image
            *  変化がなければテストがパスする
            *  受け入れる場合はそれを新しい画像として受け入れる。
        *  8.2
            *  Previewをhost side screenshot testに変換する機能を提供する
            *  screnshotTest/ディレクトリを作る
                *  その中でPreview関数を書く
            *  ./gradlew debugScreenshotTest --record-reference-images: reference imageの更新
            *  ./gradlew debugScreenshotTest: リグレッションキャッチとアップデート
           
    
 <!-- 
Espresso Device API のライブラリなんか画面回転ができる軽いライブラリかと思ったら、Emulatorにそれ用のコード入れたりして、gRPCで通信したり、ライブラリ内でDagger使ったり、結構頑張ってるっぽい雰囲気がある👀
あとServiceLoaderを使っているので、ちゃんとRobolectricとかもあとから追加できそうな感じになっている。 

今はapp:screenshotTestDebugAndroidTestになっている気がする。
-->


// TODO: もっと色々みたい