プロダクト ニュース

Android 17 の 3 回目のベータ版

5 分で読了
Matthew McCullough
Android デベロッパー向けプロダクト マネジメント担当バイス プレジデント

Android 17 は本日、ベータ版 3 でプラットフォームの安定版に正式に到達しました。つまり、API サーフェスがロックされ、最終的な互換性テストを実施して、Android 17 をターゲットとするアプリを Google Play ストアに公開できます。また、ベータ版 3 では、より優れた、より安全で、高度に統合されたアプリケーションを構築するための多くの新機能が導入されています。

アプリ、ライブラリ、ツール、ゲームエンジンを準備しましょう

SDK、ライブラリ、ツール、ゲームエンジンを開発している場合は、互換性の問題によって下流のアプリやゲームのデベロッパーがブロックされないように、必要なアップデートを今すぐ準備することがさらに重要になります。これにより、下流のデベロッパーは最新の SDK 機能を利用できるようになります。Android 17 を完全にサポートするためにアップデートが必要な場合は、下流のデベロッパーにお知らせください。

large_Android17Timeline01.png

テストでは、Google Play またはその他の方法を使用して、Android 17 ベータ版 3 を実行しているデバイスまたはエミュレータに、本番環境アプリまたはライブラリやエンジンを使用するテストアプリをインストールします。アプリのすべてのフローをテストして、機能や UI の問題を探します。動作の変更を確認して、テストに集中できるようにします。Android の各リリースには、プライバシー、セキュリティ、全体的なユーザー エクスペリエンスを向上させるプラットフォームの変更が含まれており、これらの変更はアプリに影響を与える可能性があります。重点的に確認すべき変更点は次のとおりです。

  • 大画面でのサイズ変更: Android 17 をターゲットにすると、大画面での画面の向き、サイズ変更、アスペクト比の制約を維持しないように設定できなくなります。
  • 動的コードの読み込み: アプリが Android 17 以降をターゲットとする場合、Android 14 で DEX ファイルと JAR ファイルに導入された動的コードの読み込み(DCL)の安全性の強化がネイティブ ライブラリにも適用されます。System.load() を使用して読み込まれるネイティブ ファイルはすべて、読み取り専用としてマークする必要があります。そうしないと、システムは UnsatisfiedLinkError をスローします。
  • デフォルトで CT を有効化: Certificate Transparency(CT)がデフォルトで有効になります。(Android 16 では CT を利用できますが、アプリでオプトインする必要がありました)。
  • ローカル ネットワークの保護: Android 17 以降をターゲットとするアプリは、デフォルトでローカル ネットワークへのアクセスがブロックされます。可能な場合はプライバシー保護ピッカーの使用に切り替え、広範で永続的なアクセスには新しい ACCESS_LOCAL_NETWORK を使用してください。

メディアとカメラの機能強化

写真選択ツールのカスタマイズ オプション

Android では、写真選択ツールのビジュアル プレゼンテーションをアプリのユーザー インターフェースに合わせて調整できるようになりました。新しい PhotoPickerUiCustomizationParams API を活用することで、ギャラリー表示のアスペクト比を標準の 1:1 の正方形から 9:16 の縦長表示に変更できます。この柔軟性は ACTION_PICK_IMAGES インテントと埋め込み写真選択ツールの両方に適用されるため、ユーザーがメディアを操作する際に一貫したデザインを維持できます。

large_(Default)11aspectratio.png

これは、プライバシー保護に配慮した Android 写真選択ツールをアプリのエクスペリエンスにシームレスに統合できるようにするための取り組みの一環です。写真選択ツールをアプリに直接埋め込んで、ネイティブなエクスペリエンスを実現する方法について詳しくは、こちらをご覧ください

  val params = PhotoPickerUiCustomizationParams.Builder()
.setAspectRatio(PhotoPickerUiCustomizationParams.ASPECT_RATIO_PORTRAIT_9_16)
.build()
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_UI_CUSTOMIZATION_PARAMS, params)
}
startActivityForResult(intent, REQUEST_CODE)

RAW14 画像形式のサポート: Android 17 では、新しい ImageFormat.RAW14 定数を使用して、ハイエンド デジタル写真の業界標準である RAW14 画像形式がサポートされます。RAW14 は、1 チャンネル、1 ピクセルあたり 14 ビットの形式で、4 つの連続するピクセルが 7 バイトにパックされる高密度レイアウトを使用します。

ベンダー定義のカメラ拡張機能: Android 17 では、ベンダー定義の拡張機能が追加され、ハードウェア パートナーがカスタムのカメラ拡張モードを定義して実装し、「超解像」や最先端の AI 駆動型機能強化など、最新の優れたカメラ機能にアクセスできるようになります。これらのモードは、isExtensionSupported(int) API を使用してクエリできます。

カメラ デバイスタイプ API: 新しい Android 17 API を使用すると、基盤となるデバイスタイプをクエリして、カメラが内蔵ハードウェア、外付け USB ウェブカメラ、仮想カメラのいずれであるかを特定できます。

Bluetooth LE Audio 補聴器のサポート

Android に、Bluetooth Low Energy(BLE)Audio 補聴器専用のデバイス カテゴリが追加されました。AudioDeviceInfo.TYPE_BLE_HEARING_AID 定数が追加されたことで、アプリは補聴器を通常のヘッドセットと区別できるようになりました。

  val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
val isHearingAidConnected = devices.any { it.type == AudioDeviceInfo.TYPE_BLE_HEARING_AID }

補聴器のきめ細かい音声ルーティング

Android 17 では、特定のシステム音を再生する場所をユーザーが個別に管理できます。通知、着信音、アラームを、接続されている補聴器またはデバイスの内蔵スピーカーにルーティングできます。

拡張 HE-AAC ソフトウェア エンコーダ

Android 17 では、システム提供の拡張 HE-AAC ソフトウェア エンコーダが導入されています。このエンコーダは、統合された音声とオーディオのコーディングを使用して、低ビットレートと高ビットレートの両方をサポートします。このエンコーダには、MediaCodec API を使用して名前 c2.android.xheaac.encoder でアクセスするか、audio/mp4a-latm MIME タイプをクエリすることでアクセスできます。

  val encoder = MediaCodec.createByCodecName("c2.android.xheaac.encoder")
val format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 48000, 1)
format.setInteger(MediaFormat.KEY_BIT_RATE, 24000)
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectXHE)
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

パフォーマンスとバッテリーの機能強化

allow-while-idle アラームのリスナー サポートによりウェイクロックを削減

Android 17 では、AlarmManager.setExactAndAllowWhileIdle の新しいバリアントが導入され、PendingIntent の代わりに OnAlarmListener を受け入れることができます。この新しいコールバック ベースのメカニズムは、現在、継続的なウェイクロックに依存して定期的なタスクを実行しているアプリ(ソケット接続を維持するメッセージング アプリなど)に最適です。

  val alarmManager = getSystemService(AlarmManager::class.java)
val listener = AlarmManager.OnAlarmListener {
// Do work here
}
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000,
listener,
null
)

プライバシーの更新

システム提供の位置情報ボタン

localcafe.jpg

Android では、Android Jetpack ライブラリを使用してアプリのレイアウトに直接埋め込むことができる、システム レンダリングの位置情報ボタンが導入されています。ユーザーがこのシステムボタンをタップすると、アプリには現在のセッションのみの正確な位置情報へのアクセス権が付与されます。これを実装するには、USE_LOCATION_BUTTON 権限を宣言する必要があります。

タッチキーボードと物理キーボードの個別のパスワード表示設定

この機能では、既存の [パスワードを表示] システム設定が、タッチベースの入力と物理(ハードウェア)キーボード入力の 2 つの異なるユーザー設定に分割されます。物理キーボードから入力した文字は、デフォルトですぐに非表示になります。

  val isPhysical = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD
val shouldShow = android.text.ShowSecretsSetting.shouldShowPassword(context, isPhysical)

セキュリティ

読み取り専用の動的コードの読み込みの強制

コード インジェクション攻撃に対するセキュリティを強化するため、Android では、動的に読み込まれるネイティブ ライブラリを読み取り専用にする必要があります。アプリが Android 17 以降をターゲットとする場合、System.load() を使用して読み込まれるネイティブ ファイルはすべて、事前に読み取り専用としてマークする必要があります。

  val libraryFile = File(context.filesDir, "my_native_lib.so")
// Mark the file as read-only before loading to comply with Android 17+ security requirements
libraryFile.setReadOnly()
System.load(libraryFile.absolutePath)

ポスト量子暗号(PQC)ハイブリッド APK 署名

量子コンピューティングの今後の進歩に備えて、Android では新しい v3.2 APK 署名スキームを通じてポスト量子暗号(PQC)のサポートが導入されています。このスキームでは、従来の署名と ML-DSA 署名を組み合わせたハイブリッド アプローチが採用されています。

ユーザー エクスペリエンスとシステム UI

外部ディスプレイでのウィジェットのサポートの強化

この機能により、DP または SP 単位を使用して、ピクセル密度が異なる接続済みディスプレイまたは外部ディスプレイにアプリ ウィジェットを表示する際の視覚的な一貫性が向上します。

  val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
val displayId = options.getInt(AppWidgetManager.OPTION_APPWIDGET_DISPLAY_ID)
val remoteViews = RemoteViews(context.packageName, R.layout.widget_layout)
remoteViews.setViewPadding(
R.id.container,
16f, 8f, 16f, 8f,
TypedValue.COMPLEX_UNIT_DIP
)

ホーム画面のアプリラベルの非表示

Hiddenapplabelsonthehomescreen.png

Android では、ホーム画面のワークスペースでアプリ名(ラベル)を非表示にするユーザー設定が提供されています。アプリアイコンが明確で認識しやすいことを確認してください。

デスクトップ インタラクティブ ピクチャー イン ピクチャー

従来のピクチャー イン ピクチャーとは異なり、これらの固定ウィンドウは、デスクトップ モードで他のアプリケーション ウィンドウの最前面に表示されたまま操作できます。

  val appTask: ActivityManager.AppTask = activity.getSystemService(ActivityManager::class.java).appTasks[0]
appTask.requestWindowingLayer(
ActivityManager.AppTask.WINDOWING_LAYER_PINNED,
context.mainExecutor,
object : OutcomeReceiver<Int, Exception> {
override fun onResult(result: Int) {
if (result == ActivityManager.AppTask.WINDOWING_LAYER_REQUEST_GRANTED) {
// Task successfully moved to pinned layer
}
}
override fun onError(error: Exception) {}
}
)

画面録画ツールバーのデザイン変更

large_Recording-redesign.png

コア機能

VPN アプリの除外設定

新しい ACTION_VPN_APP_EXCLUSION_SETTINGS インテントを使用すると、アプリはシステム管理の設定画面を起動できます。この画面で、ユーザーは VPN トンネルをバイパスするアプリケーションを選択できます。

  val intent = Intent(Settings.ACTION_VPN_APP_EXCLUSION_SETTINGS)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}

OpenJDK 25 および 21 API の更新

このアップデートでは、OpenJDK 21 と OpenJDK 25 の広範な機能と改善が導入されています。これには、最新の Unicode サポートや、TLS の名前付きグループの SSL サポートの強化などが含まれます。

Android 17 を使ってみる

サポートされている Pixel デバイスを登録するか、Android Emulator で 64 ビットのシステム イメージを使用できます。

  • 新しい SDK でコンパイルし、フィードバック ページで問題を報告してください。
  • 現在のアプリをテストして互換性を確認し、Android 17 の変更がアプリに影響するかどうかを確認してください。

詳細については、Android 17 デベロッパー サイトをご覧ください。

執筆者:

続きを読む