📽️

Google I/O 2023 で観たセッションまとめ

2023/06/09に公開

こんにちは!アルダグラムでエンジニアをしている渡邊です!

先日 Google I/O 2023 が開催されました。
全てのセッションは YouTube で公開されております。
個人的に気になったセッションをいくつか視聴したので、その中からポイントを簡単にまとめてみたいと思います。

私が観たセッションはスクラップに雑にまとめておりますので、もしよければ参考にしてみてください。
以下の一覧がスクラップへのリンクとなっております。

ちなみに個人的に一番面白かったのは Scalable UI testing solutions というセッションです。

What's new in Android development tools

https://youtu.be/7lubRrkxagk

Android Studio などの開発ツールに関する機能についてのセッションです。
個人的に良いと思っている機能は以下です。

LiveEdit

  • Compose でコードを変更した際に、変更がすぐにプレビューに反映される

開発速度の向上が見込めそう!

Studio Bot

  • Android Studio に統合された AI チャットボット

開発がかなり楽になりそうな予感!(でも Twitter ではまだ精度があまり良くなさそうな投稿も...)
でもまだ日本では使えなさそう...🥲

Device Explorer のプロセスタブ

  • 実行中のプロセスの一覧が見れるようになった

プロセスキルが簡単にできるので、テストには便利!

Gradle Managed Device と Firebase Test Lab の統合

  • Firebase Test Lab でテスト実行する端末を Gradle で管理できる

まだ試せてないので一回試してみたいです。

What's new in Kotlin for Android

https://youtu.be/QGtB--ABiNM

Kotlin についてのセッションです。

K2コンパイラ

KSP (Kotlin Symbol Processing)

  • Kotlin のコードを直接解析するので kapt であったビルド速度が遅い課題を解決
  • Room、Glide、Moshi はすでに対応済み
  • Dagger / Hilt は対応予定

Kotlin Multiplatform

  • Kotlin のコードで Android、iOS、Web のロジックを共有できる
  • Google Workspace では Kotlin Multiplatform を使って Android、iOS、Web のロジックを共有している
  • Jetpack のライブラリもいくつか対応済み
    • Annotations 1.7.0-alpha02
    • Collections 1.3.0-alpha04
    • DataStore 1.1.0-alpha03

Compose for iOS もアルファ版になったし、Kotlin だけで Android、iOS のモバイルアプリを開発する未来があるかも?🤔

Best practices for saving UI state on Android

https://youtu.be/V-s4z7B_Gnc

UI の状態を保存するためのベストプラクティスを紹介するセッションです。

状態が失われる原因は3つ

  1. 画面回転時などのコンフィグレーションの変更が発生した時
  2. システムのリソースが枯渇して、OS がバックグラウンドにいるアプリを終了させる時
  3. ユーザーが意図的にアプリを終了させる時

コンフィグレーションの変更時のデータ保持方法

  • Jetpack の ViewModel を使う

ユーザーが意図的にアプリを終了させる時

  • データはストレージに保存する必要がある
  • DataStore や Room などが選択肢としてある
  • この方法はコンフィグレーションの変更、OS によってアプリが終了される場合のどちらにも対処可能

OS によってアプリが終了される時

  • Saved State API を使う
    • 大きなデータは保存できず RuntimeException が発生することがある(50KB 以上のデータを保存しないことをオススメ)
    • この方法はコンフィグレーションの変更にも対応できる
  • 保存するデータはユーザーの入力やナビゲーションに関する一時的な状態のもの
    • 例えばリストのスクロール位置、ユーザーが選択したアイテムの状態、テキストフィールドに入力された文字列など
  • Jetpack Compose
    • API : rememberSaveable()
    • テスト : StateRestorationTester
  • ビューシステム
    • API : onSaveInstanceState()
    • テスト : ActivityScenario.recreate()

Android は色々と考えることが多くて大変ですね...🫠

Building for the future of Android

https://youtu.be/WMMPXayjP8g

今後の Android アプリ開発についてのセッションです。

Foreground Service の変更

  • Android 14 をターゲットとするアプリは Foreground Service のタイプの指定が必要
  • location タイプのような Foreground Service はランタイム時にパーミッションが必要
  • shortService という新しいタイプが Android 14 から追加
    • 実行時間が短い重要なタスクで、Foreground service の基準に満たない時のためのもの

Service 関連がまた複雑に...🫠

Predictive Back

  • Android 13 から導入され、スワイプで画面を戻る際にどこの画面に戻るかのプレビューをユーザーに表示する
  • Android 14 ではアプリ内においてアニメーションが追加される
  • Android 14 では各 Activity で Predictive Back のオプトインができる
<manifest ...>
    <application ...
        android:enableOnBackInvokedCallback="false" >
        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...>
        </activity>
    </application>
</manifest>  

Per app preferences

  • Android 13 からアプリごとに言語設定が可能になった
    • 以前はアプリがサポートする言語をファイルに全てリスト化する必要があったが、このファイルを自動生成してくれるようにサポート
      • Android Studio Girafe 以降で Android Gradle Plugin 8.1.0-alpha07 以降

弊社のアプリは多言語化対応しているので、この機能はまだ未対応なので将来的にサポートしたいですね。

Regional Preferences

  • ユーザーは気温の単位や週始めの曜日といった設定のカスタマイズも可能
  • androidx.core の LocalePreferences のライブラリをチェック

弊社のアプリにカレンダー機能があるので、週始めの曜日の対応ができそう。

Debugging Jetpack Compose

https://youtu.be/Kp-aiSU8qCU

Compose のデバッグに関するセッションです。

recomposition state

  • Android Studio Hedgehog からデバッガに recomposition state という機能が追加
  • ブレークポイントがヒットすると Composable の各引数ごとに変更状態を確認でき、これには以下の状態がある
    • Unchanged : この引数は変更されていない
    • Changed : この引数は異なる値に変更されている
    • Uncertain : Compose はこの引数が変更されたかどうかを評価している
    • Static : Compose はこの引数を変更がないものとみなしている
    • Unstable : 引数は unstable type

これは便利ですね!

Visual Lint

  • Android Studio Hedgehog から Compose プレビューの Visual Lint がサポート
  • レイアウトを複数のスクリーンサイズで確認することができ、何か問題がある場合は Lint が警告かエラーを出力する

Jank 発生の確認

Jank が発生している場合には、以下の方法で確認する。

  • R8 と Baseline Profile を設定し、かつリリースモードでビルドしたアプリで確認する
  • Layout Inspector で Recompose が発生した回数が見れるので、回数が多いものがないか確認
  • デバッガで recomposition state を確認する
    • もし Unstable のものがあった場合、Composable は頻繁に recomposition されている可能性がある
    • パフォーマンスが改善されているかを確認するためにまず Macrobenchmark でテストを書き、修正前と修正後でパフォーマンスを計測する
    • Unstable のパラメータが List だった場合、PersistentList に変更してみる

しっかりとテストを書くことが大切ですね。(ここはがんばりたい)

What's new in Firebase's Android SDK

https://youtu.be/nYGg_8Ro5VE

Android の Firebase SDK に関するセッションです。

アプリ起動時のパフォーマンス改善

  • 新しい効率的なスレッドプールとバックグラウンドワーカーによって、Android SDK のアプリ開始時の CPU 消費を減らす改善を行った
  • プロダクトが必要になったタイミングでインスタンス化するように、初期化の遅延を行った
  • これらの対応により、Firebase を使用したアプリは平均して3%起動が速くなった(だいたい20ms)

kotlin-first

  • Firebase のコードを Java から Kotlin に
  • Java は引き続き使用できるようにする
  • suspend 関数や Flow のサポートも対応予定

Kotlin Coroutines に対応してくれるのは嬉しいですね🥰

Scalable UI testing solutions

https://youtu.be/L6CSaH0kDnI

テストに関するセッションです。

Espresso Device API

  • 新しい Espresso の Device API で画面回転や折りたたみ端末の開閉などのコンフィグレーションの変更のテストが書ける

以下は画面回転のテストの例。

import androidx.test.espresso.device.action.ScreenOrientation
import androidx.test.espresso.device.rules.ScreenOrientationRule
...
@get:Rule
val screenOrientationRule: ScreenOrientationRule = 
    ScreenOrientationRule(ScreenOrientation.PORTRAIT)
    
@Test
fun myRotationTest() {
    ...
    // Sets the device to landscape orientation during test execution
    onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
    // Checks that the appropriate UI is displayed in this orientation
    composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
    composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
}

以下は折りたたみ端末を開いた時の例。

// Test starts in folded state and check for a compact mode layout
@Test
fun myUnfoledTest() {
    // Starts the test with the device in a folded state.
    onDevice().setClosedMode()
    composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed()
    composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist()
    ...
    // Unfolds the device into a flat posture.
    onDevice().setFlatMode()
    composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
    composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
}

端末が折りたたみできない場合に、テストをスキップすることも可能。

@Test
// Test skips on devices that don't support a FLAT posture.
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
    ...
}

Screenshot testing

  • Android Gradle Plugin 8.2 から実験的機能として、レイアウトのプレビューから画像を作成し、スクリーンショットテストに使えるように
  • あらかじめプレビューから画像を作成して保存しておき、意図しないコンポーネントの変更によって画面レイアウトに差分が生じたことを、画像を比較してテストできる

これは激アツ機能ですね🔥🔥🔥

What's new in Firebase

https://youtu.be/emIxn-f9bK0

Cloud Functions for Firebase

  • 昨年第二世代の Cloud Functions のパブリックプレビューを公開
  • シングルインスタンスで複数のリクエストを同時にハンドリングできる
    • コールドスタートの削減、レイテンシーの改善、費用削減
  • 各 Cloud Function は最大1000リクエストを並列にハンドリングできる
  • Cloud Functions は現在多くのイベントに応答できる
    • Crashlytics のイベントやPerformance Monitoring のイベントなど
  • 先月、第二世代の Cloud Functions に Firestore のトリガーがサポートされた
  • 第二世代の Cloud Functions にパブリックプレビューとして Python がサポートされた

Firebase Extensions

  • Google やサードパーティによってメンテナンスされたオープンソースの extension で、リッチなエコシステムを提供
      • Full Text Search (Algolia)
      • Manage Marketing (Mailchimp)
      • Send Messages (Twillo)
  • Extension は Google のサーバレスのインフラストラクチャ上に構築されるので、自動的にスケールされる
  • 新しい Extension として PaLM API を使った chat bot がパブリックプレビューに
    • Google の最新の generative language API と Firestore インスタンスを繋げる
  • https://extensions.dev
  • Extension の作成と公開が誰でもできるようになった(ベータ)

Firestore

  • 昨年 count のクエリのサポートを発表
  • or クエリをサポート
val hotels = firestore.collection("hotels")
val snapshot = hotels.where(
    Filter.or(
        Filter.InArray("neighborhood", listOf("Chelsea", "SoHo")),
        Filter.greaterThanOrEqualTo("stars", 4)
    )
)

Web Frameworks

  • 昨年、Firebase Hosting で Next.js や Angular Universal といった Web フレームワークのデプロイを簡単に行えるようになった
  • Astro、SvelteKit、Nuxt のサポートを追加
  • さらに Flask と Django の実験的サポートも追加
  • 現在 Firebase Hosting に Preview Channel の機能がある
    • サイトに異なるバージョンをデプロイでき、指定した時間以降に有効期限が切れるプレビューの URL が生成される
    • これは静的なコンテンツしかサポートされていなかった
  • そこで Dynamic Preview Channels をサポート
    • Astro、Next.js、Angular Universal といったフレームワークで作られたサイトのプレビューを共有できるようになった

App Distribution の In-App Feedback

弊社では Jira を使っているので、これで QA の不具合報告が簡単にできそうですね。

Remote Config

  • Real-time Remote Config
    • リアルタイムの更新ができるようになった
    • Android、iOS、Unity でサポート
private func setupRemoteConfig() {
    let remoteConfig = RemoteConfig.remoteConfig()
    remoteConfig.addOnConfigUpdateListener { configUpdate, error in
        guard let configUpdate, error == nil else { return }
        remoteConfig.activate()
    }
}

今まではたしか反映までに最大24時間かかるといった感じだったかと思うので、リアルタイムに反映されるようになると活用シーンが増えそうですね!

Manage Firebase projects with Terraform

https://youtu.be/32SKh-jGXI4

Firebase のプロジェクトを Terraform で構築する方法を紹介するセッションです。

こちらについては弊社エンジニアの sukechannnn が先日書いたこちらのブログが非常に参考になるので、セッション動画と合わせて参考にしてみてください!

最後に

以上、簡単にですが個人的に気になったセッションを紹介しました。
もし気になったセッションがあれば観てみてはいかがでしょうか。
この記事がどなたかの参考になれば幸いです!

アルダグラム Tech Blog

Discussion