Open1

【Google I/O 2023】What's new in Firebase's Android SDK

watabeewatabee

What's new in Firebase's Android SDK

https://www.youtube.com/watch?v=nYGg_8Ro5VE&list=PLOU2XLYxmsIIwZQkAPhJZg8jaNrrHk1DH&index=71

Firebase でサポートしているツール (1:52~)

  • Authentication
  • App Check
  • Cloud Functions
  • Cloud Firestore
  • Cloud Storage
  • Firebase ML (beta)
  • Firebase Extensions
  • Hosting
  • Realtime Database
  • App Distribution
  • Crashlytics
  • Performance Monitoring
  • Test Lab
  • A/B Testing
  • Cloud Messaging
  • Dynamic Links
  • In-app Messaging
  • Remote Config

以前の Google I/O からの変更点 (2:28~)

  • Crashlytics (2:38~)
    • Android Studio の App Quality Insights で Crashlytics のクラッシュレポートが見れるようになり、該当のコードへ飛ぶこともできる
  • Performance Monitoring (3:25~)
    • プラットフォームごとにデフォルトの標準パーセンタイルを設定できる
    • Android の Fragment に対するスクリーンパフォーマンスのメトリクスを追加
  • App Distribution (4:29~)
    • アプリの配布を一般利用可能にし、完全にサポートされたプロダクトとして使用する準備ができている
  • App Check (4:58~)
    • Play Integrity API との統合

今後について

アプリ起動時のパフォーマンス改善 (6:00~)

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

kotlin-first (7:08~)

  • Firebase のコードを Java から Kotlin に
  • Java は引き続き使用できるようにする
// Current Android SDK Code
class DocumentReference {
    public Task<DocumentSnapshot> get()
}

// App Code
suspend fun getMovie(name: String) {
    db.collection("movies").document(name).get().await()
}

Task は現状キャンセルを完全にサポートしていないので、キャンセルのリクエストがあってもタスクを停止させることができない。

今後は以下のように Android SDK は suspend 関数を直接公開するようになる。

// Kotlin-first Android SDK Code
class DocumentReference {
    suspend fun get(): DocumentSnapshot
}

// App Code
suspend fun getMovie(name: String): Movie {
    val doc = db.collection("movies").document(name).get()
    return doc.toObject<Movie>()
}

また例として、Firebase Cloud Storage でデータを取得する際には Flow が使えるようになる。

private suspend fun uploadFile(file: File) {
    val uploadTask = Firebase.storage.reference.child("image.jpg").putFile(file)
    uploadTask.taskState.collect { state: TaskState ->
        when (state) {
            is TaskState.InProgress -> {
                val (bytesTransferred, totalByteCount) = state.progress
                val progress = (100.0 * bytesTransferred) / totalByteCount
                Log.d(TAG, "Upload is $progress% done")
            }
            is TaskState.Paused -> {
                Log.d(TAG, "Upload is paused")
            }
        }
    }
}