行為變更:所有應用程式

Android 17 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion 為何,凡是在 Android 17 上執行的應用程式,「一律」都會受到下列行為變更所影響。您必須測試自己的應用程式,並視需要進行修改,以便在適當情況下支援這些變更。

另請務必查看僅對指定 Android 17 為目標版本的應用程式造成影響的行為變更

安全性

Android 17 包含下列裝置和應用程式安全性改善項目。

usesClearTraffic 淘汰計畫

我們計畫在日後推出的版本中淘汰 usesCleartextTraffic 元素。 如果應用程式需要建立未加密 (HTTP) 連線,請改用網路安全性設定檔,指定應用程式需要建立明文連線的網域。

請注意,網路安全性設定檔僅適用於 API 級別 24 以上版本。如果應用程式的最低 API 級別低於 24,您應該同時執行下列兩項操作:

  • usesCleartextTraffic 屬性設為 true
  • 使用網路設定檔

如果應用程式的最低 API 級別為 24 以上,您可以使用網路設定檔,不必設定 usesCleartextTraffic

限制隱含 URI 授權

目前,如果應用程式啟動的意圖含有動作 SendSendMultipleImageCapture 的 URI,系統會自動授予目標應用程式讀取和寫入 URI 的權限。我們計畫在 Android 18 中變更這項行為。因此,建議應用程式明確授予相關 URI 權限,而非依賴系統授予權限。

每個應用程式的金鑰儲存區限制

應用程式應避免在 Android Keystore 中建立過多金鑰,因為這是裝置上所有應用程式共用的資源。從 Android 17 開始,系統會強制限制應用程式可擁有的金鑰數量。如果是非系統應用程式,且指定 Android 17 以上版本,則金鑰上限為 50,000 個;如果是其他應用程式,則金鑰上限為 200,000 個。無論目標 API 級別為何,系統應用程式最多只能有 200,000 個金鑰。

如果應用程式嘗試建立超出上限的金鑰,系統會傳回 KeyStoreException,導致建立作業失敗。例外狀況的訊息字串包含金鑰限制的相關資訊。如果應用程式在例外狀況中呼叫 getNumericErrorCode(),傳回值會因應用程式的目標 API 級別而異:

  • 如果應用程式指定 Android 17 以上版本: getNumericErrorCode() 會傳回新的 ERROR_TOO_MANY_KEYS 值。
  • 所有其他應用程式:getNumericErrorCode()退貨ERROR_INCORRECT_USAGE

使用者體驗和系統 UI

Android 17 包含下列異動,目的是為了打造更一致、直覺的使用者體驗。

裝置旋轉後自動恢復預設的 IME 版面空間

從 Android 17 開始,如果裝置設定變更 (例如旋轉) 並非由應用程式本身處理,系統就不會還原先前的輸入法編輯器瀏覽權限。

如果應用程式發生未處理的設定變更,且變更後需要顯示鍵盤,您必須明確提出要求。您可以透過下列方式提出要求:

  • android:windowSoftInputMode 屬性設為 stateAlwaysVisible
  • 在活動的 onCreate() 方法中,以程式輔助方式要求顯示軟鍵盤,或新增 onConfigurationChanged() 方法。

手動輸入

Android 17 包含下列異動項目,這些變更會影響應用程式與鍵盤和觸控板等人類輸入裝置的互動方式。

在指標擷取期間,觸控板預設會傳送相對事件

自 Android 17 起,如果應用程式使用 View.requestPointerCapture() 要求指標擷取,且使用者使用觸控板,系統會辨識使用者觸控時的指標移動和捲動手勢,並以與擷取滑鼠時指標和捲動滾輪移動相同的方式,將這些手勢回報給應用程式。在大多數情況下,支援擷取滑鼠的應用程式不必為觸控板新增特殊處理邏輯。詳情請參閱 View.POINTER_CAPTURE_MODE_RELATIVE 的說明文件。

先前,系統不會嘗試辨識觸控板的手勢,而是以類似觸控螢幕觸控的格式,將原始的絕對手指位置傳送至應用程式。如果應用程式仍需要這項絕對資料,應改為使用 View.POINTER_CAPTURE_MODE_ABSOLUTE 呼叫新的 View.requestPointerCapture(int) 方法。

媒體

Android 17 包含下列媒體行為變更。

背景音訊強化

從 Android 17 開始,音訊架構會強制限制背景音訊互動,包括音訊播放、音訊焦點要求和音量變更 API,確保這些變更是由使用者刻意啟動。

如果應用程式嘗試在無效的生命週期呼叫音訊 API,音訊播放和音量變更 API 會無聲無息地失敗,不會擲回例外狀況或提供失敗訊息。音訊焦點 API 失敗,結果代碼為 AUDIOFOCUS_REQUEST_FAILED

如需更多資訊 (包括緩解策略),請參閱「背景音訊強化」。