行為變更:所有應用程式

Android 11 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion 為何,當應用程式在 Android 11 上執行時,下列行為變更將會套用至所有應用程式。您應測試應用程式,並視需要修改,以便在適當情況下支援新版本功能。

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

隱私權

Android 11 導入了多項變更和限制,可進一步保護使用者隱私,包括:

  • 單次授權讓使用者選擇授予位置資訊、麥克風和相機權限的臨時存取權。
  • 權限對話方塊顯示設定如果使用者多次拒絕權限要求,系統會視為「不要再詢問」。
  • 資料存取稽核深入瞭解應用程式在自身程式碼和依附程式庫程式碼中存取私人資料的位置。
  • 系統快訊視窗權限某些類別的應用程式在提出要求後,會自動取得 SYSTEM_ALERT_WINDOW 權限。此外,包含 ACTION_MANAGE_OVERLAY_PERMISSION 意圖動作的意圖一律會將使用者帶往系統設定畫面。
  • 永久 SIM 卡 IDgetIccId() 方法在 Android 11 以上版本中,無法存取無法重設的 ICCID。這個方法會傳回非空值的空白字串。如要找出裝置上安裝的 SIM 卡,請改用 getSubscriptionId() 方法。訂閱 ID 提供索引值 (從 1 開始),用於唯一識別已安裝的 SIM 卡,包括實體和電子 SIM 卡。除非裝置已還原為原廠設定,否則這個 ID 的值在特定 SIM 卡上不會變動。

詳情請參閱「隱私權」頁面。

接觸通知

Android 11 更新平台時,會考量接觸通知系統。現在使用者可以在 Android 11 上執行接觸通知應用程式,不必開啟裝置的位置資訊設定。這項例外情況僅適用於接觸通知系統,因為該系統的設計方式可確保應用程式無法透過藍牙掃描推斷裝置位置資訊。

為保護使用者隱私,除非裝置已開啟位置資訊設定,且使用者已授予位置資訊存取權,否則其他應用程式仍無法執行藍牙掃描。詳情請參閱「接觸通知更新」一文。

安全性

SSL 通訊端預設使用 Conscrypt SSL 引擎

Android 的預設 SSLSocket 實作項目是以 Conscrypt 為基礎。自 Android 11 起,該實作項目是以 Conscrypt 的 SSLEngine 為基礎的內建功能。

Scudo 硬化分配器

Android 11 會在內部使用 Scudo 硬化分配器,處理堆積分配作業。Scudo 可偵測並減輕某些類型的記憶體安全違規行為。如果原生程式碼錯誤報告中顯示與 Scudo 相關的錯誤 (例如 Scudo ERROR:),請參閱 Scudo 疑難排解說明文件。

應用程式使用統計資料

為進一步保護使用者,Android 11 會將每位使用者的應用程式用量統計資料儲存在憑證加密儲存空間中。因此,除非 isUserUnlocked() 傳回 true (發生下列其中一種情況時會傳回),否則系統和任何應用程式都無法存取該資料:

  • 使用者在系統啟動後首次解鎖裝置。
  • 使用者在裝置上切換帳戶。

如果應用程式已繫結至 UsageStatsManager 的執行個體,請確認您是在使用者解鎖裝置後,才呼叫這個物件的方法。否則,API 現在會傳回空值或空白值。

模擬器的 5G 相關支援

Android 11 新增了 5G API,讓應用程式加入尖端功能。如要在新增功能時進行測試,可以使用 Android SDK 模擬器的新功能。這項新功能已在模擬器 30.0.22 版中推出。選取 5G 網路設定會將 TelephonyDisplayInfo 設為 OVERRIDE_NETWORK_TYPE_NR_NSA,修改預估頻寬,並允許您設定計量付費狀態,驗證應用程式是否能適當回應 NET_CAPABILITY_TEMPORARILY_NOT_METERED 狀態的變化。

效能和偵錯

偵錯 JobScheduler API 呼叫限制

Android 11 提供應用程式的偵錯支援,可識別可能超出特定速率限制的 JobScheduler API 呼叫。開發人員可使用這項工具找出潛在的效能問題。如果應用程式的 debuggable 資訊清單屬性設為 true,當 JobScheduler API 呼叫次數超過速率限制時,系統會傳回 RESULT_FAILURE。設定限制時,我們會確保正當用途不受影響。

檔案描述元清除器 (fdsan)

Android 10 導入了 fdsan (檔案描述元清除器)。fdsan 會偵測檔案描述元擁有權的處理不當情形,例如關閉後使用和重複關閉。Android 11 將變更 fdsan 的預設模式。fdsan 現在偵測到錯誤時會中止,先前的行為是記錄警告並繼續。如果應用程式因 fdsan 而當機,請參閱fdsan documentation

非 SDK 介面限制

基於與 Android 開發人員合作及最新的內部測試,Android 11 包含更新後的受限制非 SDK 介面清單。在限制非 SDK 介面之前,我們盡可能確保公開替代方案的可得性。

如果您的應用程式並不是以 Android 11 為目標版本,則此處所述的某些變更可能不會立即對您造成影響。雖然您目前可以使用某些非 SDK 介面 (視應用程式的目標 API 級別而定),但使用任何非 SDK 方法或欄位時,均可能面臨應用程式故障的高度風險。

如果不確定應用程式是否使用非 SDK 介面,可對應用程式進行測試以便確認。如果您的應用程式仰賴非 SDK 介面,則建議您開始規劃遷移至 SDK 替代方案。我們瞭解有些應用程式可使用非 SDK 介面運作。如果您除了為應用程式中的某個功能使用非 SDK 介面外,已別無他法,則應要求新的公用 API

如要進一步瞭解此 Android 版本中的變更,請參閱「Android 11 的非 SDK 介面限制更新」。如要進一步瞭解非 SDK 介面的一般資訊,請參閱「非 SDK 介面的限制」。

已移除 Maps v1 共用資料庫

Android 11 已完全移除地圖共用資料庫第 1 版。這個程式庫先前已遭淘汰,且在 Android 10 中停止運作。如果應用程式先前在搭載 Android 9 (API 級別 28) 以下版本的裝置上,是依賴這個共用程式庫運作,現在應改用 Maps SDK for Android

與其他應用程式互動

分享內容 URI

如果應用程式與其他應用程式共用內容 URI,意圖必須設定至少下列其中一個意圖旗標,授予 URI 存取權限FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION。這樣一來,即使其他應用程式指定 Android 11 為目標,仍可存取內容 URI。即使內容 URI 與應用程式不擁有的內容供應器相關聯,應用程式也必須加入意圖旗標。

如果您的應用程式擁有與內容 URI 相關聯的內容供應者,請確認內容供應者未匯出。我們已建議採用這項安全性最佳做法。

正在載入程式庫

使用絕對路徑載入 ICU 通用程式庫

如果應用程式的目標 API 級別為 28 以下,就無法使用 dlopen(3) 載入 libicuuc,且絕對路徑為「/system/lib/libicuuc.so」。對於這類應用程式,dlopen("/system/lib/libicuuc.so", ...) 會傳回空值控制代碼。

如要載入程式庫,請改用程式庫名稱做為檔案名稱,例如 dlopen("libicuuc.so", ...)