Open1
【Google I/O 2023】Building for the future of Android
Building for the future of Android
Interoperability
Background Work on Android 14 (1:01~)
バックグラウンドでタスクを実行する際に、どの方法を選択すればよいか可視化したフローチャート。
- Foreground service の例
- メディアプレイバック、オーディオレコーディング、ワークアウトのトラッキング
- Android 14 をターゲットとするアプリは Foreground Service のタイプの指定が必要
- location タイプのような Foreground Service はランタイム時にパーミッションが必要
以下は health
と location
のタイプのサービスを定義する例。
タイプは |
を使って連結できる。
<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~)
- デバイスの探索、セキュアなコミュニケーション、マルチデバイスセッション
- Android phones & tablet 向け
- https://github.com/google/cross-device-sdk
Migrating to Predictive Back (5:33~)
- Predictive Back は Android 13 から導入されたジェスチャーナビゲーションの改善版
- スワイプで画面を戻る際に、どこの画面に戻るかのプレビューをユーザーに表示する
- Android 14 ではアプリ内においてアニメーションが追加される
- バックイベントをインターセプトしていない場合のマイグレーション方法
-
androidx.activity:activity:1.6.0
以上にする - マニフェストファイルで
android:enableOnBackInvokedCallback="true"
に設定する
-
- バックイベントをインターセプトしている場合
-
KeyEvent.KEYCODE_BACK
やonBackPressed
を使ってインターセプトは行わないようにする - Compose なら
BackHandler
、ビューシステムならonBackPressedCallback
&onBackPressedDispatcher
を使うようにする
-
BackHandler や onBackPressedCallback を実装する際の Tips
- UI State でコールバックを有効・無効にするかを決める
var text by remember {
mutableStateOf("")
}
TextField(
value = text,
onValueChange = {
text = it
}
)
BackHandler(text.isNotEmpty()) {
// handle back event
}
- ダイアログを表示する、アニメーションを実行するといった UI の状態を変更する UI ロジックには predictive back のコールバックを使う
- 一つの責任だけを持つコールバックを作成する
- コールバックは複数作成することができ、各コールバックは次のバックジェスチャーをハンドリングする
- 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
- 新しい Jetpack の Credential Manager API ではパスキーによるパスワードなしの認証がサポートされている
- How to resuce reliance on passwords in Android apps with passkey support
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))
- Regional Preferences
- ユーザーは気温や週といった設定のカスタマイズも可能
- LocalePreferences のライブラリをチェック
-
androidx.core
に LocalePreferences が追加されている - https://developer.android.com/jetpack/androidx/releases/core#1.12.0-alpha01
-
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
- App Actions を使ってアプリと Google アシスタントを統合
- ディープリンクのサポート
- Android App Links が使える
- Optimize performance and app experiences with deep linking
- d.android.com/guide/app-actions/get-started
Future Hardware (15:15~)
Ultra HDR
- Android 14 からで、以下のいずれかで使用可能
- AndroidManifest ファイルの Activity で
android:colorMode="hdr"
を指定する getWindow().setColorMode(ActivityInfo.COLOR_MODE_HDR)
- AndroidManifest ファイルの Activity で
Android Camera
Android Media
Foldables
64-bit only
- Pixel 7は64ビットのみサポート
- 今後の端末も64ビットのみになっていくことが期待される
- Keep your app from failing in a 64-bit only world