Android Q 適配指南

Android Q 適配指南

官方文檔:
developer.android.com/about/versi…css

在Android 10開始版本中,官方的改動較大,相應的開發者適配成本仍是很高的。
這裏按照2019.11.11 google android q workshop流程,大概說明一下Android Q適配須要注意的內容。雖然是大概介紹,但應該是目前最全的適配攻略了…java

  • 非SDK 接口
  • 設備ID
  • 外部存儲
  • 權限
  • 新功能——夜間模式

1、非SDK接口

官方文檔:針對非 SDK 接口的限制android

官方從 Android 9(API 級別 28)開始,對應用使用的非 SDK 接口實施了限制。
若是你的APP經過引用非 SDK 接口或嘗試使用反射或 JNI 來獲取句柄,這些限制就會起做用。官方給出的解釋是爲了提高用戶體驗、下降應用崩潰風險。web

1.一、非SDK接口檢測工具

官方給出了一個檢測工具,下載地址:veridexsql

veridex使用方法:app

appcompat.sh --dex-file=apk.apk
複製代碼
在這裏插入圖片描述
在這裏插入圖片描述

1.二、blacklist、greylist、greylist-max-o、greylist-max-p含義

以上截圖中,blacklist、greylist、greylist-max-o、greylist-max-p含義以下:less

  • blacklist 黑名單:禁止使用的非SDK接口,運行時直接Crash(所以必須解決)
  • greylist 灰名單:即當前版本仍能使用的非SDK接口,但在下一版本中可能變成被限制的非SDK接口
  • greylist-max-o: 在targetSDK<=O中能使用,可是在targetSDK>=P中被禁止使用的非SDK接口
  • greylist-max-p: 在targetSDK<=P中能使用,可是在targetSDK>=Q中被禁止使用的非SDK接口

若是以爲我沒有說清楚,能夠看如下 2019.11.11 google android q workshop PPT 截圖ide

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

1.三、Android Q 加固 與 熱修復

關於加固與熱修復,官方也提供了相應的API工具

  • 加固
    ui

    在這裏插入圖片描述
    在這裏插入圖片描述
  • 熱修復

    在這裏插入圖片描述
    在這裏插入圖片描述

注:
未適配Android Q的應用,若使用了blacklist 相關接口,在Android Q系統上打開時,會直接Crash!
未適配Android Q的應用,若使用了blacklist 相關接口,在Android Q系統上打開時,會直接Crash!
未適配Android Q的應用,若使用了blacklist 相關接口,在Android Q系統上打開時,會直接Crash!

2、設備ID

從Android 10開始已經沒法徹底標識一個設備,曾經用mac地址、IMEI等設備信息標識設備的方法,從Android 10開始通通失效。並且不管你的APP是不是配過Android 10。

2.一、IMEI等設備信息

從Android10開始普通應用再也不容許請求權限android.permission.READ_PHONE_STATE
並且,不管你的App是否適配過Android Q(既targetSdkVersion是否大於等於29),均沒法再獲取到設備IMEI等設備信息。

受影響的API以下:

Build.getSerial();
TelephonyManager.getImei();
TelephonyManager.getMeid()
TelephonyManager.getDeviceId();
TelephonyManager.getSubscriberId();
TelephonyManager.getSimSerialNumber();
複製代碼
在這裏插入圖片描述
在這裏插入圖片描述

targetSdkVersion<29 的應用,其在獲取設備ID時,會直接返回null
targetSdkVersion>=29 的應用,其在獲取設備ID時,會直接跑出異常SecurityException

在這裏插入圖片描述
在這裏插入圖片描述

若是您的App但願在Android 10如下的設備中仍然獲取設備IMEI等信息,可按如下方式進行適配:

在這裏插入圖片描述
在這裏插入圖片描述

2.二、Mac地址隨機分配

從Android10開始,默認狀況下,在搭載 Android 10 或更高版本的設備上,系統會傳輸隨機分配的 MAC 地址。(既從Android 10開始,普通應用已經沒法獲取設備的真正mac地址,標識設備已經沒法使用mac地址)

2.三、如何標識設備惟一性?

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

Google給出的解決方案是:若是您的應用有 追蹤非登陸用戶重裝 的需求,可用ANDROID_ID來標識設備。

  • ANDROID_ID的生成規則爲:簽名+設備信息+設備用戶
  • ANDROID_ID重置規則:設備恢復出廠設置時,ANDROID_ID將被重置
String androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
複製代碼

也就是從Android 10開始已經沒法徹底標識一個設備,曾經用mac地址、IMEI等設備信息標識設備的方法,從Android 10開始通通失效。並且不管你的APP是不是配過Android 10。

求高手留言解答:
在Android 10系統上,目前本人還沒有找到標識設備惟一性的辦法,若是你們有辦法但願留言告知!!!

3、外部存儲

官方文檔:

外部存儲訪問權限範圍限定爲應用文件和媒體
Manage scoped external storage access

在這裏插入圖片描述
在這裏插入圖片描述

爲解決截圖中的問題,從Android Q開始,官方對外部存儲進行了必定的限制。

To give users more control over their files and to limit file clutter, apps targeting Android 10 (API level 29) and higher are given scoped access into an external storage device, or scoped storage, by default. Such apps can see only their app-specific directory—accessed using Context.getExternalFilesDir()—and specific types of media. It's a best practice to use scoped storage unless your app needs access to a file that doesn't reside in either the app-specific directory or the MediaStore.

爲了使用戶更改的管理Sdcard中的文件,解決文件混亂的問題。從Android 10開始(API level 29),Android將對外部存儲進行必定的限制。
默認狀況下,對於外部存儲,App只能經過Context.getExternalFilesDir()訪問本身的特定文件目錄;
以及系統特定的文件類型目錄(例:照片、屏幕快照、視頻 等)。

在這裏插入圖片描述
在這裏插入圖片描述

3.一、APP專屬路徑

對於App專屬 內部存儲路徑外部存儲路徑的訪問,將再也不須要 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 權限:

  • 內部存儲路徑 /data/data/<包名>/
  • 外部存儲路徑 /storage/Android/data/<包名>/

Android Q 存儲目錄的獲取,可參考如下文檔:Android Sdcard存儲目錄
Android Q 存儲目錄的獲取,可參考如下文檔:Android Sdcard存儲目錄
Android Q 存儲目錄的獲取,可參考如下文檔:Android Sdcard存儲目錄

3.二、手機共享路徑

讀取其餘APP建立的共享文件,例:相冊、屏幕快照 等,則須要申請READ_EXTERNAL_STORAGE權限:

3.二、手機共享路徑

讀取其餘APP建立的共享文件,例:相冊、屏幕快照 等,則須要申請READ_EXTERNAL_STORAGE權限:

3.三、Downloads文件夾

讀取手機的Downloads文件夾,不須要任何權限,須要使用API Storage Access Framework

4、權限相關

主要包括:

  • 在後臺運行時訪問設備位置信息
  • 從後臺啓動 Activity 的限制
  • 屏幕錄製
  • 攝像頭和麥克風

4.一、在後臺運行時訪問設備位置信息

Android 10 引入了 ACCESS_BACKGROUND_LOCATION 權限。
若應用在後臺運行時,訪問手機位置,須要動態申請該權限,用戶則能夠選擇拒絕。

官方給出的數據,大部分用戶對位置信息是比較敏感的。並且大部分用戶是不容許應用在後臺使用位置信息的。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4.二、從後臺啓動 Activity 的限制

具體內容請查看官方文檔

4.三、屏幕錄製

不須要手動申請權限,但官方 API內部會向用戶彈窗申請權限

在這裏插入圖片描述
在這裏插入圖片描述

4.四、攝像頭和麥克風

Android 9 攝像頭和麥克風 後臺權限已經移除了

4.五、活動探知——新增權限

在這裏插入圖片描述
在這裏插入圖片描述

5、新功能——夜間模式

關於夜間模式,感興趣的同窗,能夠查看個人另外一篇文檔:

Android Q 深色主題

6、參考文章

Android 10 Scoped Storage

相關文章
相關標籤/搜索