Open1

【Google I/O 2023】Building for the future of Android

watabeewatabee

Building for the future of Android

https://www.youtube.com/watch?v=WMMPXayjP8g&list=PLOU2XLYxmsIIwZQkAPhJZg8jaNrrHk1DH&index=35

Interoperability

Background Work on Android 14 (1:01~)

バックグラウンドでタスクを実行する際に、どの方法を選択すればよいか可視化したフローチャート。

  • Foreground service の例
    • メディアプレイバック、オーディオレコーディング、ワークアウトのトラッキング
  • Android 14 をターゲットとするアプリは Foreground Service のタイプの指定が必要
  • location タイプのような Foreground Service はランタイム時にパーミッションが必要

以下は healthlocation のタイプのサービスを定義する例。
タイプは | を使って連結できる。

<manifest ...>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
    
    <application>
        <service
             android:name=".MyFitnessService"
             android:foregroundServiceType="health|location"
             android:exported="false">
        </service>
    </application>
</manifest>    
  • shortService という新しいタイプが Android 14 から追加
    • 必要なパーミッションは FOREGROUND_SERVICE のパーミッションだけ
    • 実行時間が短い重要なタスクで、Foreground service の基準に満たない時のためのもの

Cached apps in Android 14 (3:00~)

アプリがキャッシュステートに移行した場合。

  • 数秒間 CPU の使用時間を得られない
  • 動的に登録されたブロードキャストはキューに入れられる。通知される際にはマージされて通知されることもある

User-initiated data transfer (3:37~)

  • ファイルのダウンロードやアップロードといった、長時間にわたるユーザーが開始したデータ転送のジョブに向いている
  • RUN_USER_INITIATED_JOBS パーミッションがマニフェストに必要
  • アクティブ時には Notification が必要
  • 再スケジュールや制約をサポート

Telecom Jetpack library (3:55~)

  • 通話関連のバックグランドワークをサポート
  • Telecom API の簡略化
  • 新機能に対する下位互換のサポート

Exact Alarms (4:18~)

  • Android 14 の端末で Android 13 をターゲットにしたアプリは正確なアラームが制限される
    • USE_EXACT_ALARM は使用が制限される
    • SCHEDULE_EXACT_ALARM は権限が付与された場合の特殊なもの

Cross Device SDK (4:56~)

Migrating to Predictive Back (5:33~)

  • Predictive Back は Android 13 から導入されたジェスチャーナビゲーションの改善版
    • スワイプで画面を戻る際に、どこの画面に戻るかのプレビューをユーザーに表示する
  • Android 14 ではアプリ内においてアニメーションが追加される
  • バックイベントをインターセプトしていない場合のマイグレーション方法
    • androidx.activity:activity:1.6.0 以上にする
    • マニフェストファイルで android:enableOnBackInvokedCallback="true" に設定する
  • バックイベントをインターセプトしている場合
    • KeyEvent.KEYCODE_BACKonBackPressed を使ってインターセプトは行わないようにする
    • Compose なら BackHandler、ビューシステムなら onBackPressedCallback & onBackPressedDispatcher を使うようにする

BackHandler や onBackPressedCallback を実装する際の Tips

  1. UI State でコールバックを有効・無効にするかを決める
var text by remember {
    mutableStateOf("")
}

TextField(
    value = text,
    onValueChange = {
        text = it
    }
)

BackHandler(text.isNotEmpty()) {
    // handle back event
}
  1. ダイアログを表示する、アニメーションを実行するといった UI の状態を変更する UI ロジックには predictive back のコールバックを使う
  2. 一つの責任だけを持つコールバックを作成する
    • コールバックは複数作成することができ、各コールバックは次のバックジェスチャーをハンドリングする
  3. Android 14 ではコールバック内でアプリのキーモーメントのアニメーションを実行する
// use androidx.activity:activity-ktx:1.8.0-alpha01 or higher

object: OnBackPressedCallback(true) {
    override fun handleOnBackStarted() {
    }
    
    override fun handleOnBackProgressed(backEvent: BackEvent) {
    }
    
    override fun handleOnBackCancelled() {
    }
}

  • Android 14 では各 Activity で Predictive Back のオプトインができる
<manifest ...>
    <application ...
        android:enableOnBackInvokedCallback="false" >
        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...>
        </activity>
    </application>
</manifest>    
  • ドキュメント
    • goo.gle/back-basics
    • goo.gle/navigation-custom-back
    • goo.gle/predictive-back-gesture

Privacy & Security (8:53~)

  • Android Privacy Codelab
    • d.android.com/android-privacy-codelab

Google Play のターゲット SDK のロードマップ。

Target SDK New app App update
34 2024/08/01 2024/11/01
33 2023/08/01 2024/11/01
  • Android 14 以降の端末では、targetSdkVersion が 23 以下のアプリはインストールができない
  • Google Play SDK Index は多くの商用 SDK の情報を持っている
    • それらのターゲット SDK バージョンをチェックできる
  • Data access auditing APIs
    • アプリに含まれている SDK からのデータアクセスを監査
  • Privacy and Security
  • Privacy Sandbox on Android
  • Health Connect
  • Android 12 changed backups
    • Key-Value Pair Backups : 5MB までの制限
    • Cloud Auto Backups : 25MB までの制限
    • Device to Device Auto Backups : 2GB までの制限
    • バックアップ・リストアのテスト
      • d.android.com/guide/topics/data/testingbackup
  • Credential Manager

Personalization (11:18~)

Jetpack Glance

  • goo.gle/glance
  • Compose を使ったウィジェットの作成
  • goo.gle/build-widgets

Themed app icon

  • Adaptive Icon に対応しているなら以下のように monochrome を追加する
<adaptive-icon>
    <background android:drawable="@drawable/background" />
    <foreground android:drawable="@drawable/foreground" />
    <monochrome android:drawable="@drawable/foreground" />
</adaptive-icon>
  • Android Studio Flamingo 以降でプレビューでの確認ができる
  • goo.gle/adaptive-icon-template
  • goo.gle/adaptive-icon-codelab

Per app preferences

  • Android 13 からアプリごとに言語設定が可能になった
    • 以前はアプリがサポートする言語をファイルに全てリスト化する必要があった
    • このファイルを自動生成してくれるようにサポート
      • Android Studio Girafe 以降で Android Gradle Plugin 8.1.0-alpha07 以降
      • res/resources.properties を追加し、デフォルトのロケールを記載する
        • uniqualifiedResLocale=en-US
      • build.gradle に以下を追加
      • (もし追加していた場合は) locale-config のファイルを削除する
android {
    androidResources {
        generateLocaleConfig true
    }
}
  • ユーザーに表示する言語はカスタマイズが可能
    • A/B テストで特定の言語を表示・非表示にすることができる
// i.e. "de,fr,hi,ja" or "de,fr,hi,ja,bn"
val locales = Firebase.remoteConfig["a_b_test"].asString()

val localeManager = applicationContext.getSystemService(LocaleManager::class.java)
localeManager.overrideLocaleConfig = LocaleConfig(LocaleList.forLanguageTags(locales))
LocalePreferences.getTemperatureUnit()
LocalePreferences.getFirstDayOfWeek()

Supporting Grammatical Inflection

  • 言語によっては性別による文法の違いがある
    • デフォルトはたいてい男性的な文法
  • Android 14 では Grammatical Inflection API を使うと性別ごとの文字列リソースを作成できる
    • feminine (女性的), masculine (男性的), neuter (中性的)
values-fr-femenine/strings.xml
<resources>
    <string name="sub">Vous êtes abonnée à...</string>
</resources>  
  • GrammaticalInflectionManager を使って、性別による文法を設定できる
grammaticalInflectionManager
    .setRequestedApplicationGrammaticalGender(
        android.content.res.Configuration.GRAMMATICAL_GENDER_FEMININE
    )

Non-linear font scaling

  • Android 14 では非線形のフォントスケーリングが追加された
  • 大きいテキストサイズほど拡大率が低く、小さいテキストサイズは通常通り拡大される
  • TypedValue の applyDimension()deriveDimension() を使って sp <-> px の変換を行う
  • Configuration や DisplayMetrics によるハードコードな計算は避ける
  • What's new in Android Accessibility

Voice control

Future Hardware (15:15~)

Ultra HDR

  • Android 14 からで、以下のいずれかで使用可能
    • AndroidManifest ファイルの Activity で android:colorMode="hdr" を指定する
    • getWindow().setColorMode(ActivityInfo.COLOR_MODE_HDR)

Android Camera

Android Media

Foldables

64-bit only

On-device ML