Open1

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

watabeewatabee

What's new in Android

https://www.youtube.com/watch?v=qXhjN66O7Bk&list=PLOU2XLYxmsIIwZQkAPhJZg8jaNrrHk1DH&index=4

Privacy & Security (0:46~)

Android 14 での変更点について

Partial media access (1:08~)

  • アプリがパーミッションをリクエストした際、ユーザーはメディアへの部分的なアクセスを許可でき、許可したもののみ MediaStore でアクセス可能
    • READ_MEDIA_IMAGES, READ_MEDIA_VIDEOS, READ_MEDIA_VISUAL_USER_SELECTED
  • 複雑さを回避するために、ストレージアクセスへの許可をするのではなく、Photo Picker を使うことを推奨

Safety information (1:38~)

  • 位置情報のパーミッション許可のダイアログにクリック可能なセクションを表示
    • アプリは位置情報データをサードパーティに共有することが概要として記載されている
    • このセクション部分をクリックすると、アプリがなぜデータを共有するかが表示され、ユーザーが理由を理解できるようになっている

Full Screen Intent Notifications (2:03~)

  • Android 14 から、アプリは Full Screen Intent のパーミッションのチェックとユーザーからのリクエストが必要になる
    • android.permission.USE_FULL_SCREEN_INTENT のパーミッションが必要
    • ユーザーは設定画面でパーミッションの ON / OFF ができる
  • ターゲット SDK によらず通話アプリとアラームアプリのみが Full Screen Intent を使用する権限を持つべきというように、App store のポリシーが変更される

公開されていないコンポーネントに対して明示的な Intent を作る (2:44~)

val intent = Intent("com.example.app.PAY")
intent.setPackage("com.example.app")
startActivity(intent)

ブロードキャストレシーバーに対するエクスポート動作の指定 (2:50~)

Targte SDK バージョンが34 の場合、システムのブロードキャストのためではないレシーバーを実行時に登録する際に RECEIVER_EXPORTEDRECEIVER_NOT_EXPORTED を指定する。

context.registerReceiver(broadcastReceiver, intentFilter, RECEIVER_EXPORTED)
context.registerReceiver(broadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED)

Target SDK バージョン 23 未満のアプリはインストール不可 (3:00~)

表題の通り。

Partial Screensharing (3:20~)

画面全体を共有するのではなく、特定のアプリのみを共有できる。 何らかのアプリとビデオ通話といったマルチタスクのアプリなどに有効。

// 今まで
val manager = getSystemService<MediaProjectionManager>()
val intent = manager?.createScreenCaptureIntent()
// Android 14
val manager = getSystemService<MediaProjectionManager>()
val intent = manager?.createScreenCaptureIntent(
    MediaProjectionConfig.createConfigForUserChoice()
)

// or 
val intent = manager?.createScreenCaptureIntent(
    MediaProjectionConfig.createConfigForDefaultDisplay()
)

Android 14 では MediaProjection のコールバックに2つのメソッドが導入された。

object : MediaProjection.Callback() {
    override fun onCapturedContentResize(width: Int, height: Int) {
        // ...
    }
    
    override fun onCapturedContentVisibilityChanged(isVisible: Boolean) {
        // ...
    }
}

Health Connect (4:11~)

アプリは Health Connect で端末上にあるユーザーのヘルスデータへアクセスできる。
これによってユーザーはヘルスデータを一箇所で見る、プライバシーコントロールを設定する、お気に入りのアプリ間でデータを教諭する、といったことができる。

詳細は What's new in Android Health のセッションを参照。

Reduce reliance on passwords with passkey support (4:52~)

  • Android 14 からパスワードなしで認証できるパスキーがサポート
  • Credential Manager ではパスキーに加え従来のパスワード、フェデレーションによるサインイン方式を統合
  • 現状アルファ版の Jetpack Credential Manager ライブラリでは Android 5 以上からパスキーをサポート
  • 詳細は How to reduce reliance on passwords in Android apps with passkey support のセッションを参照

Privacy Sandbox (6:27~)

  • プライバシーサンドボックスとは、モバイルデバイスのユーザーのプライバシーを強化し、広告の品質を維持することに焦点を当てている
  • 2つの developer プログラムがある
    1. Developer Preview
    2. Beta Program
  • Privacy Sandbox の API の影響をテストするための新しいツールをリリース
  • Privacy Sandbox を簡単に統合するための Jetpack のライブラリも提供
    • androidx.privacysandbox.ads:ads-adservices:1.0.0-alpha01

Attribution across mobile web browsers and Android apps (7:24~)

Form factors (8:06~)

  • ユーザーは全てのアプリをマルチウィンドウモードで表示でき、またアプリの設定に関係なくデバイスを回転させることができる
  • アプリが固定の向きやリサイズできないように制限した場合、アプリは互換モードになりシステムによってレターボックス化される
    • goo.gle/letterboxing
  • Activity の向きは固定せずにリサイズ可能にしておくことを推奨
  • 折りたたみ端末やレターボックスによって、アスペクト比や UI の向きとカメラセンサーの向きが一致するとは限らなくなった
  • 大きい画面サイズや折りたたみ端末の開発については How to build great Android apps for large screens and foldables のセッションをチェック

Activity embedding (10:16~)

  • 複数の Activity を持つアプリでは、activity embedding によって一つ以上の Activity を並べて表示することができるので、アダプティブレイアウトの実装が簡単になる
  • これは XML によって設定でき、変更が少なく、activity embedding がサポートされていなければ既存の動作のままになる
  • Optimize activity-based apps for large screens のセッションをチェック

Keyboard support (10:49~)

Jetpack Glance (12:17~)

  • Jetpack Glance は現在ベータ版
    • ウィジェットを Jetpack Compose で構築できる

Jetpack Compose (12:46~)

Compose for TV がアルファ版

Modifiers (14:02~)

  • 昨年10月に modifier を新しくより効率的なシステムにするためのマイグレーションを開始 => 2023年5月にリリース
  • 平均して22%のパフォーマンス改善
  • modifier を使うにあたっての変更はなく、今まで通り使える

Text の改善 (14:24~)

  • 最新の emoji バージョンのサポート
  • スクロール可能なコンテナ内でキーボードを表示するとすぐに非表示になるという TextField の不具合を修正
  • テキストのカスタマイズ
    • TextStyle.drawStyle を使ったアウトラインテキスト
    • TextStyle.hyphens を使ったハイフンのサポート
    • TextStyle.lineBreak を使った改行の振る舞いの設定
    • minLines による表示できる最小の行の設定
    • Modifier.basicMarquee によるテキストの移動

新しいレイアウト (14:40~)

  • Pager
  • Flow Layout

Compose のライブラリ (14:58~)

  • Glide
  • Google Maps

Compose Material 3 (15:08~)

Compose Tools in Giraffe (15:37~)

  • Live Edit がデフォルトで有効
  • @Preview の UX の改善
  • Animation Preview のサポート

Compose Tools in Hedgehog (15:49~)

  • デバッガで Compose State の情報を表示
  • Multipreview のテンプレート
  • Visual Lint
  • @Preview での Accessibility Test Framework のサポート
  • @Preview でのスクリーンショットテスト
  • Debugging Jetpack Compose のセッションをチェック

Foreground Services (16:25~)

  • Android 14 をターゲットにしたアプリでは、Foreground Service の実行のためにタイプの指定と、タイプごとの Foreground Service のパーミッションが必須になった
  • Android 14 では Foreground Service の代わりとして、ユーザーが開始したデータ転送を目的とした API を導入

以下は Foreground Service のタイプの指定と、タイプによるパーミッションの指定の例。
FOREGROUND_SERVICE のパーミッションは API 28 から追加されている。

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" />
  
  <application ...>
    <service
      android:name=".MyFitnessService"
      android:foregroundServiceType="health"
      android:exported="false"
      android:process=":trackerProcess">
    </service>
  </application>
</manifest>

Machine Learning

ML Kit on Android (17:38~)

  • API の更新
    • Barcode
    • Pose detection
    • Text recognition
    • Digital ink recognition
    • Smart Reply
  • 新しい API
    • Face mesh (beta)
    • Document scanner (Q4)

Android's custom ML stack

カスタムの ML スタックを使うことで自身の ML モデルを導入でき、APK のサイズを減らすことができる。
3つの主な更新がある。

  1. TensorFlow Lite が Google Play services に
  2. デリゲートによる Hardware acceleration
  3. Acceleration Service がベータに

詳細は How to build smarter Android apps with on-device Machine Learning のセッションを参照。

Android Runtime (ART) 14 (18:27~)

  • Java 17 の言語機能をサポート
  • 新しいガベージコレクタ
    • コードサイズを10%削減
    • ヒープメモリのピークを最大50%まで削減
  • 現在の ART のバージョンである ART 13 では、Android 12 の端末のアップデートに対応し、アプリの起動時間を最大30%改善した
  • ART 14 では Android 12 以降の端末が最新の ART の機能を受けることができる

Kotlin (19:14~)

  • 最新の情報は What's new in Kotlin for Android のセッションをチェック
  • 新しい K2 コンパイラはビルド速度が2倍まで改善
  • Android Studio Giraffe から Gradle のビルドスクリプトがデフォルトで Kotlin になった
  • kapt より KSP (Kotlin Symbol Processing) を使うとよい
  • Kotlin Multiplatform のサポートを継続して取り組んでいる

Predictive Back (19:45~)

  • Android 13 からジェスチャーナビゲーションの改善のために predictive back が導入された
    • スワイプで戻る際の戻り先のプレビューをユーザーに表示する
  • Android 14 ではアプリに predictive back のアニメーションを追加
    • Activity から Activity へ戻るアニメーションを含む
  • Android 14 にマイグレーションする際に、各 Activity ごとにオプトインできる
    • android:enableOnBackInvokedCallback=true|false を各 Activity ごとに設定していく
  • AndroidX の Activity のバージョンを最新にし、Compose であれば BackHandler を、View システムであれば onBackPressed コールバックを使う
  • 詳細は Building for the future of Android のセッションをチェック

New design hub (20:56~)

  • d.android.com/design/ui
  • Android のデザインのためのドキュメントで starter kits をダウンロードできる

Ultra HDR (21:15~)

  • Android 14 で HDR 10ビット圧縮静止画像がサポートされた
    • これにより写真を撮影する際にセンサーからの情報をより多く保持でき、結果的に画質が向上する
  • Ultra HDR のために後方互換性のある JPEG フォーマットを設計中

Media3 (21:36~)

Personalization (22:22~)

Android Studio Giraffe 以降ではロケールファイルの自動生成をサポートし、Android 13 から導入されたアプリごとの言語設定機能の統合を簡単にする。

android {
    androidResources {
        generateLocaleConfig true
    }
}

Android 14 では、新しい LocaleManager API を使ってユーザーが設定画面でより関連のある言語を設定するための設定ができる。

localeManager.overrideLocaleConfig = LocaleConfig(
    LocaleList.forLanguageTags(regional_locales)
)

また Android 14 では、ユーザーは好みの気温の単位や最初の週の選択をすることができる。

LocalePreferences.getTemperatureUnit()
LocalePreferences.getFirstDayOfWeek()

Supporting Grammatical Inflection (23:22~)

Android 14 から Grammatical Inflection API が追加された。
これによって性別によって区別された文字列リソースを作成できる。
詳細は Building for the future of Android のセッションをチェック。

Sharing updates (23:59~)

  • システムのシェアのシートが app actions のカスタマイズにサポート
    • Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS
  • 新しいプレビュー UI
    • カルーセルで複数の画像、ビデオサムネイルをプレビューでき、画像とリンクの両方をシェアできる
  • ダイレクトシェアの共有先のランキング品質を向上
    • ダイレクトシェアのランキングの改善のため、アプリは ShortcutInfoCompat.Builder#addCapabilityBinding("actions.intent.SEND_MESSAGE") でレポートできるようになった

Non-linear font scaling (24:42~)

  • Android 14 から最大200%までの非線形フォントスケーリングが追加された
    • 大きいフォントサイズほどあまり拡大されなくなる
  • テキストサイズは SP 単位で指定する
  • sp と px 間の変換は TypedValue の applyDimension()deriveDimension() を使う

New Accessibility APIs (25:00~)

詳細は What's new in Android Accessibility をチェック。

Android Studio

Android Studio Giraffe (25:47~)

  • Device Explorer
  • New UI (Opt-in)
  • 新規プロジェクト時にビルドスクリプトの Kotlin スクリプトと Gradle Version Catalog がオプトイン
  • Android Gradle Plugin によるアプリごとの言語設定のサポート
  • Live Edit for Jetpack Compose
  • Gradle Version Catalog のサポート
  • Compose Animation Preview
  • バグレポートの統合

Android Studio Hedgehog (26:06~)

  • Studio Bot
  • Lite Mode
  • Build Analyzer
  • Compose Visual Lint & Accessibility Test
  • Host-side Screenshot Testing
  • Gradle Managed Devices on Firebase
  • Baseling Profiles Gradle Plugin
    • goo.gle/android-perf-news-io23
    • R8 と Dex Reordering によるアプリの起動時間と全体の UI パフォーマンスの改善
      • 起動時に必要となるコードをプライマリの dex ファイルに配置し、起動時以外のコードを別の dex ファイルに配置
  • App Quality Insights + Android Vitals
  • Espresso Device API
  • Power profiler
  • Layout inspector integrations into running device window

詳細は What's new in Android development tools のセッションをチェック。

Architecture

Kotlin Maltiplatform Jetpack Libraries (28:28~)

  • Annotations 1.7.0-alpha02
  • Collections 1.3.0-alpha04
  • DataStore 1.1.0-alpha03

Architecture Guidance (28:43~)

  • 新しいアーキテクチャガイドを追加
    • Configuration Changes のハンドリングのベストプラクティスなど
    • goo.gle/android-arch
  • Best practices for saving UI state on Android のセッションをチェック

Paging Test (29:20~)

  • 新しい Paging のテスト API
  • goo.gle/paging-test