近日,谷歌推送了最新的Android 11第二個開發者預覽版(Developer Preview 2)更新,而這距離上一個版本已過去了一個月之久。
按照谷歌提供的里程碑列表,從今年2月份起,每月將會發佈一個開發者預覽版,直至第三季度Android 11最終版本推出。谷歌官方提示廣大開發者,儘早開始應用程序兼容性的測試,留更充裕的時間用於後期的適配處理。
圖片來自網絡
本次新版本主要帶來了新的隱私保護措施,用於5G、共享、連接、媒體等方面新的API,另外也有一些用戶行爲的變更。下面,小編將結合最新的開發者預覽版,解讀Android 11在第三方移動應用工具中兼容測試及適配,需要注意的要點。
01
存儲及隱私的變化
在系統存儲上,Android 11將正式使用沙箱模式、存儲訪問框架限制、媒體文件批量處理。隱私變化的更新,主要圍繞“位置”,“相機”,“麥克風”三組權限,在用戶選擇時增加“僅這次”選項、位置權限選擇框中不再顯示“始終允許”選項、兩次“拒絕”將視爲“不再詢問”。
圖片來自安卓開發者平臺官網
02
值得關注的新功能
在第三方移動應用開發中,值得開發者關注的是Android 11引入了“數據訪問審覈”功能,通知欄增加快速回復圖片等媒體以及安全共享大型數據集,並對Android模擬器中的相機支持了擴展。
03
適配及新功能的使用
1)配置Android 11環境
- Pixel手機刷入,需前往Android開發者平臺獲取相應的image或在AS中下載Android 11模擬器;
- SDK-Manager可下載最新的Android R Preview版本、Android SDK Build-Tools 30-rc1;
- build.gradle配置compileSdkVersion’android-R’、buildToolsVersion"30-rc1"、targetSdkVersion ‘R’。
2)沙箱適配要點提示
- Android使用的文件系統,類似於其他平臺上基於磁盤的文件系統。系統可爲開發者提供一些保存應用數據的選項;
- 特定於應用程序的存儲:將僅供開發者的應用程序使用文件存儲在內部存儲卷內的專用目錄中,或外部存儲中的其他專用目錄中。使用內部存儲中的目錄,來保存其他應用程序不應訪問的敏感信息;
- 共享存儲:存儲開發者的應用打算與其他應用共享的文件,包括媒體,文檔和其他文件;
- 首選項:將私有原始數據存儲在鍵值對中;
- 數據庫:使用Room持久性庫將結構化數據存儲在專用數據庫中。
3)後臺位置權限的適配
- 如應用targetSdkVersion=‘R’:請求ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION位置權限。用戶選擇“允許”後,再次請求ACCESS_BACKGROUND_LOCATION位置權限,此時會跳轉“系統位置權限”頁面,包含“始終允許”選項。
效果如下:
圖片來自網絡
使用方式:
//targetR,必須先申請FINE OR COARSE LOCATION,然後申請BACKGROUND LOCATION,才能跳轉到系統設置頁面,
//否則直接申請BACKGROUND LOCATION將無效
//申請數組將android.permission.ACCESS_BACKGROUND_LOCATION、FINE、COARSE和任意權限放一起申請將報錯
if (checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") !=PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{"android.permission.ACCESS_FINE_LOCATION"}, 0);
}
else if (checkSelfPermission("android.permission.ACCESS_BACKGROUND_LOCATION") !=
PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{"android.permission.ACCESS_BACKGROUND_LOCATION"}, 0);
}
- 如應用targetSdkVersion<‘R’:permissions數組同時包含ACCESS_BACKGROUND_LOCATION,ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,此時權限框中會有“在設置中允許”的入口,跳轉後可選擇“始終允許”;
效果如下:
圖片來自網絡
使用方式:
//target <R,必須同時申請android.permission.ACCESS_BACKGROUND_LOCATION
requestPermissions(new String[]{"android.permission.ACCESS_BACKGROUND_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}, 0);
4)多媒體文件的批量操作
效果如下:
圖片來自網絡
使用方式:
List<Uri> list=new ArrayList<>();
list.add(Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString() + File.separator + 261));
list.add(Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString() + File.separator + 262));
PendingIntent p=MediaStore.createTrashRequest(getContentResolver(),list,true);
try {
startIntentSenderForResult(p.getIntentSender(),1,null,0,0,0);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
5)大型數據集的應用間共享
新增BlobStoreManager類,當一個應用下載完某個數據後,可以將該數據共享給指定的包名應用、或者相同簽名應用、或者無限制公開,其他應用可以直接讀取該數據。
應用A共享數據:
final BlobStoreManager blobStoreManager = ((BlobStoreManager) getSystemService(Context.BLOB_STORE_SERVICE));
MessageDigest md = MessageDigest.getInstance("sha256");
//傳輸對象
String content = "123abc123!@#";
//有效期
long expireTime = new Date(2020, 4, 1).getTime();
//名稱
String label = "label123";
//標籤
String tag = "test";
//傳輸對象sha256摘要
byte[] contentHash = new byte[0];
byte[] contentByte = new byte[0];
contentByte = content.getBytes("utf-8");
contentHash = md.digest(contentByte);
//生成blobhandle,讀取者生成的時候必須四項和這裏的相同
final BlobHandle blobHandle = BlobHandle.createWithSha256(contentHash,label,expireTime,tag);
//生成本次操作的會話
long sessionId = 0;
try {
sessionId = blobStoreManager.createSession(blobHandle);
} catch (IOException ex) {
ex.printStackTrace();
}
try (BlobStoreManager.Session session = blobStoreManager.openSession(sessionId)) {
try (ParcelFileDescriptor.AutoCloseOutputStream pfd =
new ParcelFileDescriptor.AutoCloseOutputStream(session.openWrite(0, contentByte.length))) {
//寫入的對象,他的摘要必須和上文一致,否則報SecurityException
pfd.write(contentByte);
pfd.flush();
//允許公開訪問
session.allowPublicAccess();
//或者選擇相同簽名訪問
//session.allowSameSignatureAccess();
//或者選擇指定包名訪問
//session.allowPackageAccess("com.target.pkg",certificate);
//都不選擇,默認僅自己可訪問
session.commit(getMainExecutor(), integer-> {
//0成功 1失敗
});
}
}
應用B讀取數據:
final BlobStoreManager blobStoreManager = ((BlobStoreManager) getSystemService(Context.BLOB_STORE_SERVICE));
MessageDigest md = MessageDigest.getInstance("sha256");
//傳輸對象
String content = "123abc123!@#";
//有效期
long expireTime = new Date(2020, 4, 1).getTime();
//名稱
String label = "label123";
//標籤
String tag = "test";
//傳輸對象sha256摘要
byte[] contentHash = new byte[0];
byte[] contentByte = new byte[0];
contentByte = content.getBytes("utf-8");
contentHash = md.digest(contentByte);
BlobHandle blobHandle = BlobHandle.createWithSha256(contentHash,label,expireTime,tag);
try (ParcelFileDescriptor.AutoCloseInputStream pfd =
new ParcelFileDescriptor.AutoCloseInputStream(blobStoreManager.openBlob(blobHandle))) {
//讀取數據
byte[] buffer = new byte[64];
pfd.read(buffer);
}
6)數據訪問審覈的使用
爲了讓開發者更便利的的感知到,所開發應用中敏感操作的調用,AppOpsManager中新增類AppOpsCollector,可以在整個應用範圍內,包括自己、jar、第三方sdk,註冊該監聽,當調用需要危險權限的方法時,會觸發回調,應用內只能註冊一個,後註冊覆蓋前一個。
使用方式:
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
appOpsManager.setNotedAppOpsCollector(new AppOpsManager.AppOpsCollector() {
@Override
public void onNoted(@NonNull SyncNotedAppOp syncNotedAppOp) {
}
@Override
public void onSelfNoted(@NonNull SyncNotedAppOp syncNotedAppOp) {
}
@Override
public void onAsyncNoted(@NonNull AsyncNotedAppOp asyncNotedAppOp){
}
});
註冊後,如調用WifiManager的startscan方法將會觸發onNoted回調,日誌顯示fine_location權限被調用。
Android11預覽版發佈具體執行時間點
目前,Android 11仍然處於預覽版本階段,關於之後版本的更新迭代,MobTech將實時關注谷歌對Android 11發佈里程碑,在名爲“平臺穩定性”的里程碑後,確定適配細節。
關於Android 11公佈的新特性及變化,MobTech將持續進行關注,並進行對應的適配,從而保證旗下開發者服務相關SDK產品的用戶體驗。主要聚焦以下三方面內容:
- 沙箱的適配:從谷歌推出沙箱模式開始,MobTech開發者服務就已着手對存儲進行兼容,隨着Android 11的到來,平臺將從兼容逐步到適配沙箱模式;(已完成適配)
- 功能兼容適配測試:將逐步對各個產品,包括ShareSDK、MobPush、MobLink、SecVerify、SMSSDK、MobAdSDK等常用SDK,進行兼容適配測試;(5月執行)
- 黑灰名單的適配:非SDK接口的黑白灰名單系統繼續更新,需要實時關注產品中是否使用到名單中的接口,檢測方式可參考官方渠道自查。(6月執行)
“平臺穩定性”里程碑,意味着Android 11已確定最終的內部和外部API、面向應用的最終行爲,以及最終的非SDK 灰名單,可幫助開發者規劃的最終測試和發佈。
據谷歌官方消息, Android 11預計將在年 6月發佈的Beta版2到達“平臺穩定性”里程碑。自此以後,不會再有任何會影響應用的變更。因此,谷歌建議所有應用、遊戲、SDK、庫和遊戲引擎開者,將“平臺穩定性”里程碑作爲規劃最終兼容性測試和公開發布的目標。
以上就是小編關於Android 11預覽版的適配解讀,如諮詢相關適配問題,或針對SDK適配問題,有更好解讀的朋友,歡迎在底部留言區撩小編~
-END-