和先前版本一樣,Android 11 也包含可能會影響應用程式的行為變更。以下行為變更僅適用於指定 Android 11 以上版本的應用程式。如果應用程式將 targetSdkVersion
設為 30
,您應視情況修改應用程式,以便正確支援這些行為。
此外,請務必查看影響所有在 Android 11 上執行的應用程式行為變更清單。
隱私權
Android 11 推出了變更和限制,以強化使用者隱私權,包括:
- 強制使用限定範圍儲存空間:存取外部儲存空間目錄的權限僅限於應用程式特定目錄,以及應用程式已建立的特定媒體類型。
- 自動重設權限:如果使用者已連續數月未與應用程式互動,系統會自動重設應用程式的私密資訊權限。
- 背景位置資訊存取權:使用者必須前往系統設定,才能授予應用程式背景位置資訊存取權。
- 套件瀏覽權限:當應用程式查詢裝置上已安裝的應用程式清單時,系統會對傳回的清單進行篩選。
詳情請參閱「隱私權」頁面。
安全性
堆積指標標記
變更詳細資料
變更名稱:NATIVE_HEAP_POINTER_TAGGING
變更 ID:135754954
如何切換
測試應用程式與 Android 11 的相容性時,您可以使用下列 ADB 指令開啟或關閉此變更:
adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
如要進一步瞭解相容性架構和切換變更,請參閱「在應用程式中測試及偵錯平台行為變更」。
堆積指標現在會在最重要的位元組 (MSB) 中加上非零標記。使用指標不當的應用程式 (包括修改 MSB 的應用程式),現在可能會異常終止或發生其他問題。為了支援未來啟用 ARM Memory Tagging Extension (MTE) 的硬體,這項變更是必要的。詳情請參閱「標記指標」。
如要停用這項功能,請參閱 allowNativeHeapPointerTagging
資訊清單說明文件。
浮動式訊息更新
來自背景的自訂快訊會遭到封鎖
基於安全考量,並為了維持良好的使用者體驗,如果應用程式以 Android 11 以上版本為目標,且從背景傳送含有自訂檢視畫面的浮動式訊息,系統會封鎖這些浮動式訊息。請注意,系統仍允許使用文字彈出式通知,也就是使用 Toast.makeText()
建立的彈出式通知,但不呼叫 setView()
。
如果您的應用程式嘗試在背景發布含有自訂檢視畫面的 Toast,系統就不會向使用者顯示訊息。相反地,系統會在 logcat 中記錄下列訊息:
W/NotificationService: Blocking custom toast from package \ <package> due to package not in the foreground
浮動式訊息回呼
如果您想在 Toast (文字或自訂) 出現或消失時收到通知,請使用 Android 11 中新增的 addCallback()
方法。
文字 Toast API 異動
指定 Android 11 以上版本為目標版本的應用程式,會對文字浮動式訊息產生以下副作用:
getView()
方法會傳回null
。- 下列方法的傳回值不會反映實際值,因此您不應在應用程式中依賴這些值:
- 以下方法是無操作,因此應用程式不應使用這些方法:
連線能力
限制存取 APN 資料庫的讀取權限
變更項目詳情
變更名稱:APN_READING_PERMISSION_CHANGE_ID
變更 ID:124107808
如何切換
測試應用程式與 Android 11 的相容性時,您可以使用下列 ADB 指令開啟或關閉此變更:
adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
如要進一步瞭解相容性架構和切換變更,請參閱「在應用程式中測試及偵錯平台行為變更」。
指定 Android 11 為目標版本的應用程式現在需要 Manifest.permission.WRITE_APN_SETTINGS
特殊權限,才能讀取或存取 Telephony 供應器 APN 資料庫。如果嘗試在沒有這項權限的情況下存取 APN 資料庫,就會產生安全性例外狀況。
無障礙設定
在資訊清單檔案中宣告與 TTS 引擎的互動
由於套件瀏覽權限有所變更,因此指定 Android 11 為目標版本,且與文字轉語音 (TTS) 引擎互動的應用程式,需要在資訊清單檔案中新增下列 <queries>
元素:
<queries> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent> </queries>
在中繼資料檔案中宣告無障礙工具按鈕用途
變更詳細資料
變更名稱:REQUEST_ACCESSIBILITY_BUTTON_CHANGE
變更 ID:136293963
如何切換
測試應用程式與 Android 11 的相容性時,您可以使用下列 ADB 指令開啟或關閉這項變更:
adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
如要進一步瞭解相容性架構和切換變更,請參閱「在應用程式中測試及偵錯平台行為變更」。
從 Android 11 開始,您的無障礙服務無法做出「與系統無障礙按鈕相關聯」的執行階段宣告。如果您將 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
附加至 AccessibilityServiceInfo
物件的 flags
屬性,架構就不會將無障礙按鈕回呼事件傳遞至您的服務。
如要在無障礙服務中接收無障礙回呼事件,請使用無障礙服務中繼資料檔案,宣告服務與無障礙工具按鈕的關聯。在 accessibilityFlags
屬性的定義中加入 flagRequestAccessibilityButton
值。無障礙服務中繼資料檔案的常見位置為 res/raw/accessibilityservice.xml
。
相機
媒體意圖動作需要系統預設攝影機
從 Android 11 開始,只有預先安裝的系統相機應用程式可以回應下列意圖動作:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
如果有多個預先安裝的系統相機應用程式可供使用,系統會顯示對話方塊,讓使用者選取應用程式。如果您希望應用程式使用特定第三方相機應用程式,代為擷取相片或影片,可以為意圖設定套件名稱或元件,明確表示這些意圖。
應用程式封裝和安裝
壓縮的資源檔案
變更詳細資料
變更名稱:RESOURCES_ARSC_COMPRESSED
變更 ID:132742131
如何切換
測試應用程式與 Android 11 的相容性時,您可以使用下列 ADB 指令開啟或關閉這項變更:
adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
如要進一步瞭解相容性架構及切換變更,請參閱「在應用程式中測試及偵錯平台行為變更」。
如果應用程式指定 Android 11 (API 級別 30) 以上版本,且包含壓縮 resources.arsc
檔案,或是此檔案未對齊 4 個位元組邊界,則無法安裝。如果檔案符合上述任一條件,系統就無法將其記憶體對應。無法對應記憶體的資源表格必須讀取 RAM 中的緩衝區,導致系統出現不必要的記憶體壓力,並大幅增加裝置的 RAM 用量。
如果您先前使用的是壓縮的 resources.arsc
檔案,請改用其他策略,例如縮減應用程式資源,或使用其他方法縮減、模糊處理及最佳化應用程式。
現在必須採用 APK Signature Scheme v2
以 Android 11 (API 級別 30) 為目標版本的應用程式,如果目前僅使用 APK 簽名配置 v1 簽署,現在也必須使用 APK 簽名配置 v2 以上版本進行簽署。使用者無法在搭載 Android 11 的裝置上安裝或更新僅使用 APK 簽署配置 v1 簽署的應用程式。
如要確認應用程式是否使用 APK 簽署配置 v2 以上版本進行簽署,您可以使用 Android Studio,或指令列上的 apksigner
工具。
Firebase
Firebase JobDispatcher 和 GCMNetworkManager
如果應用程式指定的是 API 級別 30 以上版本,則在搭載 Android 6.0 (API 級別 23) 以上版本的裝置上,Firebase JobDispatcher 和 GcmNetworkManager API 呼叫會遭到停用。如需遷移資訊,請參閱「從 Firebase JobDispatcher 遷移至 WorkManager」和「從 GCMNetworkManager 遷移至 WorkManager」。
語音辨識
由於套件瀏覽權限有所變更,如果應用程式指定 Android 11 並與語音辨識服務互動,就必須在資訊清單檔案中加入下列 <queries>
元素:
<queries> <intent> <action android:name="android.speech.RecognitionService" /> </intent> </queries>
OnSharedPreferenceChangeListener 的回呼異動
變更詳細資料
變更名稱:CALLBACK_ON_CLEAR_CHANGE
變更 ID:119147584
如何切換
測試應用程式與 Android 11 的相容性時,您可以使用下列 ADB 指令開啟或關閉此變更:
adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
如要進一步瞭解相容性架構和切換變更,請參閱「在應用程式中測試及偵錯平台行為變更」。
針對指定 Android 11 (API 級別 30) 為目標版本的應用程式,現在只要呼叫 Editor.clear
,系統就會使用 null
鍵向 OnSharedPreferenceChangeListener.onSharedPreferenceChanged
發出回呼。
非 SDK 介面限制
基於與 Android 開發人員合作及最新的內部測試,Android 11 包含更新後的受限制非 SDK 介面清單。在限制非 SDK 介面之前,我們盡可能確保公開替代方案的可得性。
如果您的應用程式並不是以 Android 11 為目標版本,則此處所述的某些變更可能不會立即對您造成影響。不過,雖然您目前可使用某些非 SDK 介面 (視應用程式的目標 API 級別而定),但使用任何非 SDK 方法或欄位時,一律可能會導致應用程式停止運作。
如果不確定應用程式是否使用非 SDK 介面,您可以測試應用程式來確認。如果您的應用程式仰賴非 SDK 介面,則建議您開始規劃遷移至 SDK 替代方案。不過,我們瞭解有些應用程式可使用非 SDK 介面運作。如果您除了為應用程式中的某個功能使用非 SDK 介面外,已別無他法,則應要求新的公用 API。
如要進一步瞭解此 Android 版本中的變更,請參閱「Android 11 的非 SDK 介面限制更新內容」。如要進一步瞭解非 SDK 介面的一般資訊,請參閱非 SDK 介面的限制。