Android 17 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion 為何,凡是在 Android 17 上執行的應用程式,「一律」都會受到下列行為變更所影響。您必須測試自己的應用程式,並視需要進行修改,以便在適當情況下支援這些變更。
另請務必查看僅對指定 Android 17 為目標版本的應用程式造成影響的行為變更。
安全性
Android 17 包含下列裝置和應用程式安全性改善項目。
usesClearTraffic 淘汰計畫
我們計畫在日後推出的版本中淘汰 usesCleartextTraffic 元素。
如果應用程式需要建立未加密 (HTTP) 連線,請改用網路安全性設定檔,指定應用程式需要建立明文連線的網域。
請注意,網路安全性設定檔僅適用於 API 級別 24 以上版本。如果應用程式的最低 API 級別低於 24,您應該同時執行下列兩項操作:
- 將
usesCleartextTraffic屬性設為true - 使用網路設定檔
如果應用程式的最低 API 級別為 24 以上,您可以使用網路設定檔,不必設定 usesCleartextTraffic。
限制隱含 URI 授權
目前,如果应用启动的 intent 包含具有操作 Send、SendMultiple 或 ImageCapture 的 URI,系统会自动向目标应用授予读取和写入 URI 权限。我们计划在 Android 18 中更改此行为。因此,我们建议应用明确授予相关的 URI 权限,而不是依赖系统来授予这些权限。
每個應用程式的金鑰儲存區限制
應用程式應避免在 Android Keystore 中建立過多金鑰,因為這是裝置上所有應用程式共用的資源。從 Android 17 開始,系統會強制限制應用程式可擁有的金鑰數量。如果非系統應用程式指定 Android 17 (API 級別 37) 以上版本,金鑰上限為 50,000 個;其他應用程式的金鑰上限則為 200,000 個。無論目標 API 級別為何,系統應用程式最多只能有 200,000 個金鑰。
如果應用程式嘗試建立超出上限的金鑰,系統會傳回 KeyStoreException,導致建立作業失敗。例外狀況的訊息字串包含金鑰限制的相關資訊。如果應用程式在例外狀況中呼叫 getNumericErrorCode(),傳回值會因應用程式的目標 API 級別而異:
- 以 Android 17 (API 級別 37) 以上版本為目標的應用程式:
getNumericErrorCode()會傳回新的ERROR_TOO_MANY_KEYS值。 - 所有其他應用程式:
getNumericErrorCode()退貨ERROR_INCORRECT_USAGE。
使用者體驗和系統 UI
Android 17 包含下列異動,目的是為了打造更一致、直覺的使用者體驗。
裝置旋轉後自動恢復預設的 IME 版面空間
Beginning with Android 17, when the device's configuration changes (for example, through rotation), and this is not handled by the app itself, the previous IME visibility is not restored.
If your app undergoes a configuration change that it does not handle, and the app needs the keyboard to be visible after the change, you must explicitly request this. You can make this request in one of the following ways:
- Set the
android:windowSoftInputModeattribute tostateAlwaysVisible. - Programmatically request the soft keyboard in your activity's
onCreate()method, or add theonConfigurationChanged()method.
手動輸入
Android 17 包含下列異動項目,這些變更會影響應用程式與鍵盤和觸控板等人類輸入裝置的互動方式。
在指標擷取期間,觸控板預設會傳送相對事件
自 Android 17 起,如果應用程式使用 View.requestPointerCapture() 要求指標擷取,且使用者使用觸控板,系統會辨識使用者觸控時的指標移動和捲動手勢,並以與擷取滑鼠時指標和捲動滾輪移動相同的方式,將這些手勢回報給應用程式。在大多數情況下,支援擷取滑鼠的應用程式不必為觸控板新增特殊處理邏輯。詳情請參閱 View.POINTER_CAPTURE_MODE_RELATIVE 的說明文件。
先前,系統不會嘗試辨識觸控板的手勢,而是以類似觸控螢幕觸控的格式,將原始的絕對手指位置傳送至應用程式。如果應用程式仍需要這項絕對資料,應改為使用 View.POINTER_CAPTURE_MODE_ABSOLUTE 呼叫新的 View.requestPointerCapture(int) 方法。
媒體
Android 17 包含下列媒體行為變更。
背景音訊強化
Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.
If the app tries to call audio APIs while the app is not in a valid lifecycle,
the audio playback and volume change APIs fail silently without throwing an
exception or providing a failure message. The audio focus API fails with the
result code AUDIOFOCUS_REQUEST_FAILED.
For more information, including mitigation strategies, see Background audio hardening.