Android 13 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion
為何,當應用程式在 Android 13 上執行時,下列行為變更都會套用至所有應用程式。您應測試應用程式,並視需要修改,以便在適當情況下支援新版本功能。
另請務必查看僅對指定 Android 13 為目標版本的應用程式造成影響的行為變更清單。
效能與電池
工作管理員
從 Android 13 (API 級別 33) 開始,使用者可以透過通知導覽匣完成工作流程,停止有執行中前景服務的應用程式 (如圖 1 所示)。這個預設用途稱為「工作管理員」。應用程式必須能夠處理使用者啟動的停止動作。
使用 JobScheduler 改善預先擷取工作的處理方式
透過 JobScheduler,應用程式就可以 (使用 JobInfo.Builder.setPrefetch()
) 將特定工作標示為「預先擷取」工作。也就是說,在理想情況下,應用程式應在下次啟動應用程式前 (甚至在下次啟動) 前執行,以改善使用者體驗。以往,JobScheduler 只會使用這項信號,讓預先擷取工作適時使用免費或多餘的資料。
在 Android 13 (API 級別 33) 以上版本中,系統會嘗試判斷下次啟動應用程式的時間,並使用該預估值來執行預先擷取作業。應用程式應嘗試針對任何要在下次啟動應用程式前完成的工作,使用預先擷取工作。
電池資源使用率
Android 13 (API 級別 33) 提供下列方式,可讓系統更有效管理裝置的電池續航力:
- 更新系統將應用程式排入「受限制」的應用程式待命值區的規則。
- 當使用者將應用程式設為「受限制」狀態 (供背景電池用量) 時,應用程式可執行的新限制。
在測試應用程式時,請務必檢查下列事項:
測試應用程式在系統將其排入「受限制」的應用程式待命值區時的回應情形。請使用下列 Android Debug Bridge (ADB) 指令,將應用程式指派至這個值區:
adb shell am set-standby-bucket PACKAGE_NAME restricted
測試應用程式如何回應下列限制,這些限制通常會套用至背景耗電量處於「受限制」狀態的應用程式:
- 無法啟動前景服務
- 現有前景服務會從前景移除
- 無法觸發鬧鐘
- 無法執行工作
請使用下列 ADB 指令,將應用程式設為「受限」狀態:
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
高優先順序 Firebase 雲端通訊 (FCM) 配額
Android 13 (API 級別 33) 更新了 Firebase 雲端通訊 (FCM) 配額,針對會在收到高優先順序 FCM 時顯示通知的應用程式,提升高優先順序 FCM 傳送的可靠性。Android 13 (API 級別 33) 中的以下項目已變更:
- 應用程式待命值區不再決定應用程式可使用的高優先順序 FCM 數量。
- 高優先順序 FCM 配額會隨著向使用者顯示的通知數量,以比例增加。
如同先前 Android 版本,如果高優先順序的 FCM 超過配額,系統會將其降級為一般優先順序。為回應 FCM 啟動前景服務 (FGS) 時,建議您檢查 RemoteMessage.getPriority()
的結果,並確認其為 PRIORITY_HIGH
和/或處理任何潛在的 ForegroundServiceStartNotAllowedException
例外狀況。
如果您的應用程式不一定每次都會回應高優先順序 FCM 的回應,建議您將這些 FCM 的優先順序變更為「一般」,以免導致通知的訊息降級。
隱私權
通知的執行階段權限
Android 13 (API 級別 33) 推出了執行階段通知權限:POST_NOTIFICATIONS
。這項變更可協助使用者關注自己最重視的通知。
我們強烈建議您盡快指定 Android 13 以上版本,才能享有這項功能的額外控管功能和彈性。
進一步瞭解應用程式權限最佳做法。
隱藏剪貼簿中的敏感內容
如果應用程式允許使用者將機密內容 (例如密碼或信用卡資訊) 複製到剪貼簿,您必須在呼叫 ClipboardManager#setPrimaryClip()
之前,為 ClipData 的 ClipDescription
新增標記。加上此標記後,內容預覽畫面就不會顯示敏感內容。
如要為敏感內容加上標記,請在 ClipDescription
中新增布林值附加項目。無論目標 API 級別為何,所有應用程式都必須執行這項作業。
// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with a lower SDK
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
如要進一步瞭解新版剪貼簿 UI,請造訪「複製及貼上」功能頁面。
安全性
捨棄共用使用者 ID
如果應用程式使用已淘汰的 android:sharedUserId
屬性,且不再依賴該屬性功能,您可以將 android:sharedUserMaxSdkVersion
屬性設為 32
,如以下程式碼片段所示:
<manifest ...> <!-- To maintain backward compatibility, continue to use "android:sharedUserId" if you already added it to your manifest. --> android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkVersion="32" ... </manifest>
這項屬性會告知系統,您的應用程式不再依賴共用使用者 ID。如果應用程式宣告 android:sharedUserMaxSdkVersion
,且是新安裝在搭載 Android 13 以上版本的裝置上,則應用程式會如從未定義 android:sharedUserId
一般運作。更新後的應用程式仍會使用現有的共用使用者 ID。
共用的使用者 ID 會在套件管理工具中造成非確定性的行為。應用程式應改用適當的通訊機制 (例如服務和內容供應器),以促進共用元件之間的互通性。
使用者體驗
可關閉的前景服務通知
在搭載 Android 13 以上版本的裝置上,使用者可以關閉與前景服務相關聯的通知。
核心功能
已移除舊版語音服務導入方式
Android 13 會從 Google 應用程式中移除 SpeechService
實作項目,包括語音輸入法編輯器、RecognitionService
和意圖 API。
Android 12 中發生了以下變更:
SpeechService
功能已遷移至 Speech Services by Google app,並成為預設SpeechService
供應器。RecognitionService
功能已移至 Android System Intelligence 應用程式,以支援裝置端語音辨識。
為維持 Android 12 的應用程式相容性,Google 應用程式會使用 Trampoline 將流量導向 Google 應用程式的語音服務。在 Android 13 中,這個 Trampoline 會移除。
應用程式應使用裝置的預設 SpeechService
供應器,而非硬式編碼特定應用程式。