行為變更:所有應用程式

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

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

核心功能

Android 17 (API 級別 37) 包含下列異動項目,這類變更會修改或擴充 Android 系統的各種核心功能。

應用程式記憶體限制

Android 17 會根據裝置的總 RAM 導入應用程式記憶體限制,為應用程式和 Android 使用者打造更穩定且可預測的環境。在 Android 17 中,系統會保守地設定限制,建立系統基準,以極端的記憶體流失和其他離群值為目標,避免這些情況觸發全系統不穩定,導致 UI 延遲、電池耗電量增加和應用程式遭終止。我們預期絕大多數應用程式工作階段受到的影響極小,但仍建議您遵循下列記憶體最佳做法,包括建立記憶體基準。

您可以在 ApplicationExitInfo 中呼叫 getDescription,判斷應用程式工作階段是否受到影響;如果受到影響,結束原因會是 REASON_OTHER,說明則會包含 "MemoryLimiter:AnonSwap" 字串和其他資訊。您也可以搭配使用觸發式剖析TRIGGER_TYPE_ANOMALY,在達到記憶體上限時收集堆積傾印。

Android Studio Profiler 中的 LeakCanary 工作。

為協助您找出記憶體流失問題,Android Studio Panda 直接在 Android Studio 分析器中新增 LeakCanary 整合功能,做為專用工作,並在 IDE 中提供相關資訊,且完全整合至您的原始碼。

隱私權

Android 17 包含下列異動項目,可提升使用者隱私權。

簡訊動態密碼防護

從 Android 17 開始,Android 將擴大對含有動態密碼 (OTP) 的簡訊提供保護。

在舊版 Android 中,這項保護措施主要著重於簡訊擷取器格式。含有簡訊擷取器雜湊值的訊息傳送作業延遲了三小時,大多數應用程式都受到影響。不過,某些應用程式 (例如預設 SMS 處理常式) 可免除延遲,擁有雜湊的應用程式也適用這項豁免。

從 Android 17 開始,這項保護措施也適用於 WebOTP 格式的訊息。如果應用程式有權讀取簡訊,但並非 WebOTP 訊息的預期收件者 (由網域驗證決定),應用程式必須等到收到訊息三小時後,才能存取該訊息。這項異動的目的是提升使用者安全性,確保只有與訊息中提及的網域相關聯的應用程式,才能以程式輔助方式讀取驗證碼。

在這三小時的延遲期間,SMS_RECEIVED_ACTION 廣播會暫緩,且 SMS 供應商資料庫查詢會經過篩選。延遲後,這些應用程式就能存取簡訊。這項異動適用於所有應用程式,無論目標 API 級別為何。

預設訊息助理應用程式、連結裝置的隨附應用程式等特定應用程式,則不受這項延遲限制。如果應用程式需要讀取簡訊來擷取動態密碼,請改用 SMS RetrieverSMS User Consent API,確保功能不受影響。

安全性

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

usesClearTraffic 淘汰計畫

我们计划在未来的版本中弃用 usesCleartextTraffic 元素。需要建立未加密 (HTTP) 连接的应用应迁移为使用网络安全配置文件,该文件可让您指定应用需要与哪些网域建立明文连接。

请注意,网络安全配置文件仅在 API 级别 24 及更高版本中受支持。如果您的应用的最低 API 级别低于 24,您应执行以下两项操作:

  • usesCleartextTraffic 属性设置为 true
  • 使用网络配置文件

如果应用的最低 API 级别为 24 或更高,您可以使用网络配置文件,而无需设置 usesCleartextTraffic

限制隱含 URI 授權

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

每個應用程式的 Keystore 限制

應用程式應避免在 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

封鎖跨設定檔迴路流量

從 Android 17 開始,系統預設不再允許跨設定檔迴路流量。同一設定檔內的迴路流量不受影響。無論應用程式指定哪個 API 級別,只要在 Android 17 以上版本上執行,都會受到這項變更影響。

使用者體驗和系統 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

如需了解详情(包括缓解措施),请参阅后台音频安全加固

連線能力

Android 17 包含下列異動項目,可提升裝置連線能力。

藍牙配對遺失時自動重新配對

Android 17 推出自主重新配對連線功能,這項系統層級的強化功能旨在自動解決藍牙連線中斷問題。

以往,如果連線遺失,使用者必須手動前往「設定」取消配對,然後重新配對周邊裝置。這項功能以 Android 16 的安全性提升為基礎,可讓系統在背景重新建立連線,使用者不必手動前往「設定」解除配對並重新配對周邊裝置。

雖然大多數應用程式不需要變更程式碼,但開發人員應留意藍牙堆疊的下列行為變更:

  • 新的配對情境:ACTION_PAIRING_REQUEST 現在包含 EXTRA_PAIRING_CONTEXT 額外內容,可讓應用程式區分標準配對要求,以及自主系統啟動的重新配對嘗試。
  • 有條件的金鑰更新:只有在重新配對成功,且新連線達到或超過先前連結的安全等級時,現有的安全金鑰才會遭到取代。
  • 修改意圖時間:現在只有在自主重新配對嘗試失敗時,才會廣播 ACTION_KEY_MISSING 意圖。如果系統在背景成功復原連線,應用程式就不必進行不必要的錯誤處理。
  • 使用者通知:系統會透過新的 UI 通知和對話方塊管理重新配對作業。系統會提示使用者確認重新配對嘗試,確保他們知道裝置要重新連線。

周邊裝置製造商和隨附應用程式開發人員應確認硬體和應用程式能妥善處理配對轉換。如要測試這項行為,請使用下列任一方法模擬遠端連結遺失:

  • 手動從周邊裝置移除配對資訊
  • 手動取消配對裝置:依序前往「設定」>「已連結的裝置」