Google官方推出的Android 11適配的最佳實(shí)踐!

Android 11 平臺(tái)包含一些行為變更,這些變更可能會(huì)影響您的應(yīng)用。以下行為變更將影響在 Android 11 上運(yùn)行的所有應(yīng)用,無(wú)論其采用哪種?targetSdkVersion?都不例外。您應(yīng)該測(cè)試您的應(yīng)用,然后根據(jù)需要進(jìn)行修改,以適當(dāng)?shù)刂С诌@些變更(如果適用)。
隱私權(quán)
| 隱私權(quán)變更 | 受影響的應(yīng)用 | 緩解策略 |
|---|---|---|
| 分區(qū)存儲(chǔ)強(qiáng)制執(zhí)行以 Android 11 為目標(biāo)平臺(tái)的應(yīng)用始終會(huì)受分區(qū)存儲(chǔ)行為的影響 | 以 Android 11 為目標(biāo)平臺(tái)的應(yīng)用,以及以 Android 10 為目標(biāo)平臺(tái)且未將?requestLegacyExternalStorage?設(shè)為?true?以停用分區(qū)存儲(chǔ)的應(yīng)用 | 更新您的應(yīng)用以使用分區(qū)存儲(chǔ) |
| 一次性權(quán)限通過(guò)一次性權(quán)限,用戶可以向位置、麥克風(fēng)和攝像頭授予臨時(shí)訪問(wèn)權(quán)限 | 以任何版本為目標(biāo)平臺(tái)且請(qǐng)求位置信息、麥克風(fēng)或攝像頭權(quán)限的應(yīng)用 | 在嘗試訪問(wèn)受某項(xiàng)權(quán)限保護(hù)的數(shù)據(jù)之前,檢查您的應(yīng)用是否具有該權(quán)限 |
| 自動(dòng)重設(shè)權(quán)限如果用戶在 Android 11 上幾個(gè)月未與應(yīng)用互動(dòng),系統(tǒng)會(huì)自動(dòng)重設(shè)應(yīng)用的敏感權(quán)限 | 以 Android 11 為目標(biāo)平臺(tái)且在后臺(tái)執(zhí)行大部分工作的應(yīng)用 | 要求用戶阻止系統(tǒng)重置應(yīng)用的權(quán)限 |
| 后臺(tái)位置信息訪問(wèn)權(quán)限Android 11 更改了用戶向應(yīng)用授予后臺(tái)位置信息權(quán)限的方式 | 以 Android 11 為目標(biāo)平臺(tái)且需要訪問(wèn)后臺(tái)位置信息的應(yīng)用 | 通過(guò)對(duì)權(quán)限請(qǐng)求方法的多次單獨(dú)調(diào)用,逐步請(qǐng)求前臺(tái)(粗略或精確)和后臺(tái)位置權(quán)限。必要時(shí),說(shuō)明用戶授予該權(quán)限所能得到的益處 |
| 軟件包可見(jiàn)性Android 11 更改了應(yīng)用查詢同一設(shè)備上的其他已安裝應(yīng)用及與之互動(dòng)的方式 | 以 Android 11 為目標(biāo)平臺(tái)且與設(shè)備上的其他已安裝應(yīng)用交互的應(yīng)用 | 將??元素添加到應(yīng)用的清單 |
| 前臺(tái)服務(wù)類型Android 11 更改了前臺(tái)服務(wù)訪問(wèn)攝像頭和麥克風(fēng)數(shù)據(jù)的方式 | 以 Android 11 為目標(biāo)平臺(tái)且在前臺(tái)服務(wù)中訪問(wèn)攝像頭或麥克風(fēng)的應(yīng)用 | 分別在訪問(wèn)攝像頭數(shù)據(jù)和麥克風(fēng)數(shù)據(jù)的服務(wù)中聲明?camera?和?microphone?前臺(tái)服務(wù)類型 |
安全
因 OTA 更新而重啟設(shè)備后在未提供用戶憑據(jù)的情況下執(zhí)行文件級(jí)加密
設(shè)備接收 OTA 更新并重啟后,放在受憑據(jù)保護(hù)的存儲(chǔ)空間中的憑據(jù)加密密鑰可立即用于執(zhí)行文件級(jí)加密 (FBE) 操作。因此,設(shè)備重啟后,在用戶輸入其 PIN 碼、解鎖圖案或密碼以解鎖設(shè)備之前,您的應(yīng)用可以執(zhí)行與文件級(jí)加密相關(guān)的操作。
SSL 套接字默認(rèn)情況下使用 Conscrypt SSL 引擎
Android 的默認(rèn)?SSLSocket?實(shí)現(xiàn)基于 Conscrypt。從 Android 11 開(kāi)始,該實(shí)現(xiàn)是在 Conscrypt 的?SSLEngine?之上內(nèi)部構(gòu)建的。
Scudo Hardened Allocator
Scudo ERROR:),請(qǐng)參閱 Scudo 問(wèn)題排查文檔。應(yīng)用使用情況統(tǒng)計(jì)信息
為了更好地保護(hù)用戶,Android 11 將每個(gè)用戶的應(yīng)用使用情況統(tǒng)計(jì)信息存儲(chǔ)在憑據(jù)加密存儲(chǔ)空間中。因此,系統(tǒng)和任何應(yīng)用都無(wú)法訪問(wèn)該數(shù)據(jù),除非?isUserUnlocked()?返回?true,這發(fā)生在出現(xiàn)以下某種情況之后:
用戶在系統(tǒng)啟動(dòng)后首次解鎖其設(shè)備。
用戶在設(shè)備上切換到自己的帳號(hào)。
如果您的應(yīng)用已綁定到?UsageStatsManager?的實(shí)例,請(qǐng)檢查您是否是在用戶解鎖其設(shè)備后在此對(duì)象上調(diào)用方法。如果并非如此,該 API 現(xiàn)在會(huì)返回 null 或空值。
相機(jī)
支持并發(fā)使用多個(gè)攝像頭
Android 11 添加了 API 以查詢對(duì)同時(shí)使用多個(gè)攝像頭(包括前置攝像頭和后置攝像頭)的支持。
如需在運(yùn)行應(yīng)用的設(shè)備上檢查支持情況,請(qǐng)使用以下方法:
`getConcurrentCameraIds()` 可返回?cái)z像頭 ID 組合?
Set,這些組合可與有保證的數(shù)據(jù)流組合并發(fā)進(jìn)行流式傳輸(如果它們是由同一應(yīng)用進(jìn)程配置的)。`isConcurrentSessionConfigurationSupported()` 可查詢攝像頭設(shè)備是否可以并發(fā)支持相應(yīng)的會(huì)話配置。
網(wǎng)絡(luò)連接
Open Mobile API 變更
從 Android 11 開(kāi)始,Open Mobile API (OMAPI) 有了額外的功能:
解析運(yùn)營(yíng)商權(quán)限的規(guī)則。
使用以下一項(xiàng)或多項(xiàng)自定義嵌入式安全元件 (eSE) 訪問(wèn)權(quán)限或配置 eSE:
系統(tǒng)特許權(quán)限
可配置的訪問(wèn)規(guī)則應(yīng)用主數(shù)據(jù) (ARA-M) 應(yīng)用標(biāo)識(shí)符 (AID)
用于重置 OMAPI 讀取器的系統(tǒng) API
為讀取器提供清晰的指示符,以便應(yīng)用過(guò)濾設(shè)備功能。
性能和調(diào)試
JobScheduler API 調(diào)用限制調(diào)試
Android 11 為應(yīng)用提供調(diào)試支持,以便確定有可能超過(guò)特定速率限制的?JobScheduler?API 調(diào)用。開(kāi)發(fā)者可以利用此服務(wù)發(fā)現(xiàn)潛在的性能問(wèn)題。對(duì)于?debuggable?清單屬性設(shè)置為 true 的應(yīng)用,超出速率限制的?JobScheduler?API 調(diào)用將返回?RESULT_FAILURE。如此設(shè)置限制,正當(dāng)合理的用例應(yīng)該就不會(huì)受到影響。
文件描述符排錯(cuò)程序 (fdsan)
Android 10 引入了?fdsan(文件描述符排錯(cuò)程序)。fdsan?檢測(cè)錯(cuò)誤處理文件描述符所有權(quán)的錯(cuò)誤,例如 use-after-close 和 double-close。在 Android 11 中,fdsan?的默認(rèn)模式發(fā)生了變化。現(xiàn)在,fdsan?會(huì)在檢測(cè)到錯(cuò)誤時(shí)中止,而以前的行為則是記錄警告并繼續(xù)。如果您在應(yīng)用中發(fā)現(xiàn)由于?fdsan?而導(dǎo)致的崩潰,請(qǐng)參閱?fdsan documentation。
無(wú)障礙
屏幕閱讀器要求定義基于點(diǎn)擊的無(wú)障礙操作
在以前的 Android 版本中,框架會(huì)向未正確處理基于點(diǎn)擊的無(wú)障礙操作的微件分派觸摸事件。通常,這些視圖會(huì)直接處理觸摸事件,而不是注冊(cè)點(diǎn)擊監(jiān)聽(tīng)器。
為了在正確定義無(wú)障礙操作的應(yīng)用中創(chuàng)建更一致的行為,Android 11 絕不會(huì)分派觸摸事件。相反,系統(tǒng)會(huì)完全依賴于基于點(diǎn)擊的無(wú)障礙操作:ACTION_CLICK?和?ACTION_LONG_CLICK。此更改會(huì)影響屏幕閱讀器的行為。
系統(tǒng)會(huì)處理使用?OnClickListener?和?OnLongClickListener?接口的微件。但是,如果您的應(yīng)用使用依賴于?OnTouchListener?接口的自定義程度更高的微件,您需要為基于點(diǎn)擊的無(wú)障礙操作定義自定義處理程序。為此,請(qǐng)為每個(gè)操作調(diào)用?replaceAccessibilityAction()?方法,如以下代碼段所示:
注意:即使在以前的 Android 版本上,您也必須在自定義微件中定義無(wú)障礙操作,以便其他無(wú)障礙服務(wù)(如“開(kāi)關(guān)控制”)按預(yù)期運(yùn)行。為了讓您的應(yīng)用更輕松地與系統(tǒng)的無(wú)障礙服務(wù)進(jìn)行互動(dòng),我們強(qiáng)烈建議您從 Android 的界面類層次結(jié)構(gòu)擴(kuò)展系統(tǒng)微件。
在元數(shù)據(jù)文件中聲明“無(wú)障礙”按鈕使用情況
從 Android 11 開(kāi)始,您的無(wú)障礙服務(wù)無(wú)法在運(yùn)行時(shí)聲明與系統(tǒng)的“無(wú)障礙”按鈕的關(guān)聯(lián)。如果您將?AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON?附加到?AccessibilityServiceInfo?對(duì)象的?flags?屬性,框架就不會(huì)將“無(wú)障礙”按鈕回調(diào)事件傳遞給您的服務(wù)。
應(yīng)在您的無(wú)障礙服務(wù)元數(shù)據(jù)文件(通常為?res/raw/accessibilityservice.xml)中使用?flagRequestAccessibilityButton?標(biāo)記聲明您的無(wú)障礙服務(wù)與“無(wú)障礙”按鈕的關(guān)聯(lián)。
界面
SYSTEM_ALERT_WINDOW 變更
向應(yīng)用授予?SYSTEM_ALERT_WINDOW?權(quán)限的方式發(fā)生了一些變更。這些變更可以讓權(quán)限的授予更有目的性,從而達(dá)到保護(hù)用戶的目的。
根據(jù)請(qǐng)求自動(dòng)向某些應(yīng)用授予 SYSTEM_ALERT_WINDOW 權(quán)限
系統(tǒng)會(huì)根據(jù)請(qǐng)求自動(dòng)向某些類型的應(yīng)用授予?SYSTEM_ALERT_WINDOW?權(quán)限。這些應(yīng)用無(wú)需發(fā)送?ACTION_MANAGE_OVERLAY_PERMISSION?以獲取?SYSTEM_ALERT_WINDOW?權(quán)限,它們只需直接請(qǐng)求?SYSTEM_ALERT_WINDOW?即可。
系統(tǒng)會(huì)自動(dòng)向具有?ROLE_CALL_SCREENING?且請(qǐng)求?SYSTEM_ALERT_WINDOW?的所有應(yīng)用授予該權(quán)限。如果應(yīng)用失去?ROLE_CALL_SCREENING,就會(huì)失去該權(quán)限。
MANAGE_OVERLAY_PERMISSION intent 始終會(huì)將用戶轉(zhuǎn)至系統(tǒng)權(quán)限屏幕
從 Android 11 開(kāi)始,ACTION_MANAGE_OVERLAY_PERMISSION?intent 始終會(huì)將用戶轉(zhuǎn)至頂級(jí)設(shè)置屏幕,用戶可在其中授予或撤消應(yīng)用的?SYSTEM_ALERT_WINDOW?權(quán)限。intent 中的任何?package:?數(shù)據(jù)都會(huì)被忽略。
在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION?intent 可以指定一個(gè)軟件包,它會(huì)將用戶轉(zhuǎn)至應(yīng)用專用屏幕以管理權(quán)限。Android 11 不再支持此功能,而是必須由用戶先選擇要對(duì)其授予或撤消權(quán)限的應(yīng)用。此變更可以讓權(quán)限的授予更有目的性,從而達(dá)到保護(hù)用戶的目的。
應(yīng)用兼容性
非 SDK 接口限制
Android 11 包含更新后的受限制非 SDK 接口列表(基于與 Android 開(kāi)發(fā)者之間的協(xié)作以及最新的內(nèi)部測(cè)試)。在限制使用非 SDK 接口之前,我們會(huì)盡可能確保提供公開(kāi)替代方案。
如果您的應(yīng)用并非以 Android 11 為目標(biāo)平臺(tái),那么其中一些變更可能不會(huì)立即對(duì)您產(chǎn)生影響。雖然您目前仍然可以使用灰名單中的一些非 SDK 接口(取決于您的應(yīng)用的目標(biāo) API 級(jí)別),但如果您使用任何非 SDK 方法或字段,應(yīng)用無(wú)法運(yùn)行的風(fēng)險(xiǎn)始終會(huì)很高。
如果您不確定自己的應(yīng)用是否使用了非 SDK 接口,則可以測(cè)試該應(yīng)用,進(jìn)行確認(rèn)。如果您的應(yīng)用依賴于非 SDK 接口,您應(yīng)該開(kāi)始計(jì)劃遷移到 SDK 替代方案。然而,我們知道某些應(yīng)用具有使用非 SDK 接口的有效用例。如果您無(wú)法為應(yīng)用中的某項(xiàng)功能找到使用非 SDK 接口的替代方案,則應(yīng)該請(qǐng)求新的公共 API。
如需詳細(xì)了解此 Android 版本中的變更,請(qǐng)參閱 Android 11 中有關(guān)限制非 SDK 接口的更新。如需全面了解有關(guān)非 SDK 接口的詳細(xì)信息,請(qǐng)參閱對(duì)非 SDK 接口的限制。
V1 版 Google 地圖共享庫(kù)已移除
Android 11 中已完全移除 V1 版 Google 地圖共享庫(kù)。此庫(kù)之前已被棄用,并已停止在 Android 10 中的應(yīng)用中運(yùn)行。對(duì)于搭載 Android 9(API 級(jí)別 28)或更低版本的設(shè)備,之前依賴于此共享庫(kù)的應(yīng)用應(yīng)改用適用于 Android 的 Google 地圖 SDK。
