Android 10 遷移 Android 11
官方地址:https://developer.android.com/distribute/best-practices/develop/target-sdk?hl=zh-cn#prepie
主要是2個部分 隱私權(quán)和安全性
隱私權(quán)
從 Android 11 開始操灿,使用分區(qū)存儲模型的app只能訪問自身的應(yīng)用專用緩存文件搅方。
從 Android 11 開始,應(yīng)用無法在外部存儲設(shè)備上創(chuàng)建自己的應(yīng)用專用目錄黔州。如需訪問系統(tǒng)為您的應(yīng)用提供的目錄者疤,請調(diào)用 getExternalFilesDirs()福澡。
強制執(zhí)行分區(qū)存儲:
對外部存儲目錄的訪問僅限于應(yīng)用專屬目錄,以及應(yīng)用已創(chuàng)建的特定類型的媒體驹马。
**什么是應(yīng)用專屬存儲空間革砸?**
存儲僅供應(yīng)用使用的文件,可以存儲到內(nèi)部存儲卷中的專屬目錄或外部存儲空間中的其他專屬目錄糯累。使用內(nèi)部存儲空間中的目錄保存其他應(yīng)用不應(yīng)訪問的敏感信息算利。(只有應(yīng)用自己可以訪問)
從內(nèi)部存儲空間訪問,可以使用 getFilesDir() 或 getCacheDir() 方法泳姐;從內(nèi)部存儲空間訪問不需要任何權(quán)限 其他應(yīng)用不能訪問 app卸載后文件將移除
從外部存儲空間訪問效拭,可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法 如果應(yīng)用在搭載 Android 4.4(API 級別 19)或更高版本的設(shè)備上運行,從外部存儲空間訪問不需要任何權(quán)限 其他應(yīng)用可以訪問 app卸載后文件不會被移除
app使用分區(qū)存儲模式,將應(yīng)用專有的文件缎患、媒體文件以及其他類型的文件保存到其專屬的位置慕的,并通過這些位置訪問這些文件。
Android 10的應(yīng)用仍可請求 requestLegacyExternalStorage 屬性挤渔。應(yīng)用更新為以 Android 11 為目標(biāo)平臺后肮街,系統(tǒng)會忽略 requestLegacyExternalStorage 標(biāo)記)
自動重置權(quán)限
如果用戶幾個月未與應(yīng)用互動,系統(tǒng)會自動重置應(yīng)用的敏感權(quán)限判导。此設(shè)置不會影響大多數(shù)應(yīng)用嫉父。如果您的應(yīng)用主要在后臺運行,無需用戶與之互動眼刃,您可以考慮請求用戶停用自動重置功能
**什么是自動重置绕辖?**
≥android11的系統(tǒng)數(shù)月未使用,系統(tǒng)會通過自動重置用戶已授予應(yīng)用的運行時敏感權(quán)限來保護(hù)用戶數(shù)據(jù)鸟整。此操作與用戶在系統(tǒng)設(shè)置中查看權(quán)限并將應(yīng)用的訪問權(quán)限級別更改為拒絕的做法效果一樣引镊。可考慮篮条,每次在使用的時候申請弟头。
后臺位置信息訪問權(quán)限
≥30API(≥Android11) 針對前臺位置信息獲取權(quán)限和后臺位置信息獲取權(quán)限,應(yīng)用必須分開進(jìn)行請求涉茧。后臺位置信息權(quán)限只能在應(yīng)用設(shè)置中授予赴恨,而不是通過運行時權(quán)限對話框授予該權(quán)限。
軟件包可見性
當(dāng)應(yīng)用查詢設(shè)備上已安裝應(yīng)用和服務(wù)的列表時伴栓,系統(tǒng)會過濾返回的列表伦连。 如果您使用文字轉(zhuǎn)語音或語音識別服務(wù),則需在清單文件中為這些服務(wù)添加
<queries> 元素
也就是說钳垮,Android11中惑淳,如果你想去獲取其他應(yīng)用的信息,比如包名饺窿,名稱等等歧焦,不能直接獲取了,必須在清單文件中添加<queries>元素肚医,告知系統(tǒng)你要獲取哪些應(yīng)用信息或者哪一類應(yīng)用
隱私權(quán)
壓縮的 resource.arsc 文件不再受支持
如果以 Android 11(API 級別 30)或更高版本為目標(biāo)平臺的應(yīng)用包含壓縮的 resources.arsc 文件或者如果此文件未按 4 字節(jié)邊界對齊绢馍,應(yīng)用將無法安裝。
https://developer.android.com/about/versions/11/behavior-changes-11?hl=zh-cn#change-details_3
現(xiàn)在需要使用 APK 簽名方案 v2
Android 11(API 級別 30)必須使用 APK 簽名方案 v2 或更高版本進(jìn)行簽名肠套。用戶無法在搭載 Android 11 的設(shè)備上安裝或更新僅通過 APK 簽名方案 v1 簽名的應(yīng)用
注意:為支持運行舊版 Android 的設(shè)備舰涌,除了使用 APK 簽名方案 v2 或更高版本為您的 APK 簽名之外,您還應(yīng)繼續(xù)使用 APK
簽名方案 v1 進(jìn)行簽名你稚。
Firebase
≥Android11(API 級別 30)瓷耙,在搭載 Android 6.0(API 級別 23)或更高版本的設(shè)備上會停用 Firebase JobDispatcher 和 GcmNetworkManager API 調(diào)用朱躺。如需了解遷移,請參閱從 官方文檔哺徊,下面是地址
Firebase JobDispatcher 遷移到 WorkManager
(https://developer.android.com/topic/libraries/architecture/workmanager/migrating-fb?hl=zh-cn)
從 GCMNetworkManager 遷移到 WorkManager
(https://developer.android.com/topic/libraries/architecture/workmanager/migrating-gcm?hl=zh-cn)
設(shè)備到設(shè)備文件傳輸
如果您的應(yīng)用≥Android11(API 級別 30)室琢,您將無法使用 allowBackup 屬性停用應(yīng)用文件的設(shè)備到設(shè)備遷移。系統(tǒng)會自動啟用此功能落追。
不過盈滴,即使您的應(yīng)用≥Android11(API 級別 30),您也可以通過將 allowBackup 屬性設(shè)為 false 來停用應(yīng)用文件的云端備份和恢復(fù)
OnSharedPreferenceChangeListener 的回調(diào)變更
如果您的應(yīng)用≥Android11(API 級別 30)轿钠,現(xiàn)在每次調(diào)用 Editor.clear 時巢钓,都會使用 null 鍵回調(diào) OnSharedPreferenceChangeListener.onSharedPreferenceChanged。
限制非 SDK 接口疗垛。
對于以 API 級別 30 為目標(biāo)平臺的應(yīng)用症汹,建議不要使用非 SDK 接口,因為其中一些接口現(xiàn)已被屏蔽贷腕。如需查看已屏蔽的非 SDK 接口的完整列表背镇,請參閱目前在 Android 11 中被屏蔽的非 SDK 接口。
非 SDK 接口限制
Android 11 包含更新后的受限制非 SDK 接口列表(基于與 Android 開發(fā)者之間的協(xié)作以及最新的內(nèi)部測試)泽裳。在限制使用非 SDK 接口之前瞒斩,我們會盡可能確保有可用的公開替代方案。
如果您不確定自己的應(yīng)用是否使用了非 SDK 接口涮总,則可以測試該應(yīng)用胸囱,進(jìn)行確認(rèn)。如果您的應(yīng)用依賴于非 SDK 接口瀑梗,您應(yīng)該開始計劃遷移到 SDK 替代方案烹笔。然而,我們知道某些應(yīng)用具有使用非 SDK 接口的有效用例抛丽。如果您無法為應(yīng)用中的功能找到無需使用非 SDK 接口的替代方案谤职,則應(yīng)請求添加新的公共 API。
如需詳細(xì)了解此 Android 版本中的變更亿鲜,請參閱 Android 11 中有關(guān)限制非 SDK 接口的更新搀暑。如需全面了解有關(guān)非 SDK 接口的詳細(xì)信息电湘,請參閱對非 SDK 接口的限制拗慨。
堆指針標(biāo)記
堆指針在最高有效字節(jié) (MSB) 中有一個非零標(biāo)記搀捷。錯誤地使用指針的應(yīng)用(包括修改 MSB 的應(yīng)用)現(xiàn)在會崩潰或遇到其他問題锅很。這是支持未來啟用了 ARM 內(nèi)存標(biāo)記擴展 (MTE) 的硬件所必需的變更其馏。如需了解詳情,請參閱已加標(biāo)記的指針(https://source.android.com/devices/tech/debug/tagged-pointers?hl=zh-cn)
如需停用此功能爆安,請參閱 allowNativeHeapPointerTagging (https://developer.android.com/guide/topics/manifest/application-element?hl=zh-cn#allowNativeHeapPointerTagging)清單文檔
消息框的更新
來自后臺的自定義消息框被屏蔽叛复,出于安全方面的考慮,同時也為了保持良好的用戶體驗,如果包含自定義視圖的消息框是以 Android 11 或更高版本為目標(biāo)平臺的應(yīng)用從后臺發(fā)送的褐奥,系統(tǒng)會屏蔽這些消息框咖耘。
注意:后臺無法彈出自定義Toast(注意限定條件:后臺、自定義)
如果位于后臺撬码,只能彈出原生 Toast儿倒。如果不位于后臺,可以彈出自定義Toast呜笑。Toast.getView() Toast.setView() 方法廢棄夫否,現(xiàn)在會返回空值
//下面是自定義Toast 顯示文本+圖片的Toast,已測試過
public static void showImageToas(Context context,String message){
View toastview= LayoutInflater.from(context).inflate(R.layout.toast_image_layout,null);
TextView text = (TextView) toastview.findViewById(R.id.tv_message);
text.setText(message); //要提示的文本
Toast toast=new Toast(context); //上下文
toast.setGravity(Gravity.CENTER,0,0); //位置居中
toast.setDuration(Toast.LENGTH_SHORT); //設(shè)置短暫提示
toast.setView(toastview); //把定義好的View布局設(shè)置到Toast里面
toast.show();
}
消息框回調(diào)
如果您希望在消息框(文本消息框或自定義消息框)出現(xiàn)或消失時收到通知叫胁,請使用 Android 11 中添加的 addCallback() 方法凰慈。
Toast消息框 API 變更
以 Android 11 或更高版本為目標(biāo)平臺的應(yīng)用 會發(fā)現(xiàn)Toast框受到以下負(fù)面影響:
getView() 方法返回 null。
以下方法的返回值并不反映實際值驼鹅,因此您不應(yīng)在應(yīng)用中依賴于它們:
getHorizontalMargin()
getVerticalMargin()
getGravity()
getXOffset()
getYOffset()
以下方法是空操作微谓,因此您的應(yīng)用不應(yīng)使用它們:
setMargin()
setGravity()
連接
以 Android 11 為目標(biāo)平臺的應(yīng)用現(xiàn)在必須具備 Manifest.permission.WRITE_APN_SETTINGS 特權(quán),才能讀取或訪問電話提供程序 APN 數(shù)據(jù)庫输钩。如果在不具備此權(quán)限的情況下嘗試訪問 APN 數(shù)據(jù)庫豺型,會生成安全異常。
無障礙服務(wù)
**在清單文件中聲明與 TTS 引擎的交互**
由于軟件包可見性發(fā)生了變更张足,因此以 Android 11 為目標(biāo)平臺且與文字轉(zhuǎn)語音 (TTS) 引擎交互的應(yīng)用需要將以下 <queries> 元素添加到其清單文件中:
<queries>
<intent>
<action
android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
**在元數(shù)據(jù)文件中聲明“無障礙”按鈕使用情況 **
從 Android 11 開始触创,您的無障礙服務(wù)無法在運行時聲明與系統(tǒng)的“無障礙”按鈕相關(guān)聯(lián)。如果您將 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 附加到 AccessibilityServiceInfo 對象的 flags 屬性为牍,框架就不會將“無障礙”按鈕回調(diào)事件傳遞給您的服務(wù)哼绑。
如需在無障礙服務(wù)中收到無障礙回調(diào)事件,請使用無障礙服務(wù)元數(shù)據(jù)文件聲明您的服務(wù)與“無障礙”按鈕的關(guān)聯(lián)碉咆。在 accessibilityFlags 屬性的定義中添加 flagRequestAccessibilityButton 值抖韩。無障礙服務(wù)元數(shù)據(jù)文件的常用位置為 res/raw/accessibilityservice.xml。
相機
媒體 intent 操作需要系統(tǒng)默認(rèn)相機
從 Android 11 開始疫铜,只有預(yù)裝的系統(tǒng)相機應(yīng)用可以響應(yīng)以下 intent 操作:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
如果有多個預(yù)裝的系統(tǒng)相機應(yīng)用可用茂浮,系統(tǒng)會顯示一個對話框,供用戶選擇應(yīng)用壳咕。如果您希望自己的應(yīng)用使用特定的第三方相機應(yīng)用來代表其捕獲圖片或視頻席揽,可以通過為 intent 設(shè)置軟件包名稱或組件來使這些 intent 變得明確。