官方文檔:
developer.android.com/about/versi…css
在Android 10開始版本中,官方的改動較大,相應的開發者適配成本仍是很高的。
這裏按照2019.11.11 google android q workshop
流程,大概說明一下Android Q適配須要注意的內容。雖然是大概介紹,但應該是目前最全的適配攻略了…java
官方文檔:針對非 SDK 接口的限制android
官方從 Android 9(API 級別 28)開始,對應用使用的非 SDK 接口實施了限制。
若是你的APP經過引用非 SDK 接口
或嘗試使用反射或 JNI 來獲取句柄
,這些限制就會起做用。官方給出的解釋是爲了提高用戶體驗、下降應用崩潰
風險。web
官方給出了一個檢測工具,下載地址:veridexsql
veridex使用方法:app
appcompat.sh --dex-file=apk.apk
複製代碼
以上截圖中,blacklist、greylist、greylist-max-o、greylist-max-p含義以下:less
若是以爲我沒有說清楚,能夠看如下 2019.11.11 google android q workshop PPT 截圖
ide
關於加固與熱修復,官方也提供了相應的API工具
加固
ui
熱修復
注:
未適配Android Q的應用,若使用了blacklist 相關接口,在Android Q系統上打開時,會直接Crash!
未適配Android Q的應用,若使用了blacklist 相關接口,在Android Q系統上打開時,會直接Crash!
未適配Android Q的應用,若使用了blacklist 相關接口,在Android Q系統上打開時,會直接Crash!
從Android 10開始已經沒法徹底標識一個設備
,曾經用mac地址、IMEI
等設備信息標識設備的方法,從Android 10開始通通失效。並且不管你的APP是不是配過Android 10。
從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等信息
,可按如下方式進行適配:
從Android10開始,默認狀況下,在搭載 Android 10 或更高版本的設備上,系統會傳輸隨機分配的 MAC 地址。(既從Android 10開始,普通應用已經沒法獲取設備的真正mac地址,標識設備已經沒法使用mac地址)
Google給出的解決方案是:若是您的應用有 追蹤非登陸用戶重裝
的需求,可用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系統上,目前本人還沒有找到標識設備惟一性的辦法,若是你們有辦法但願留言告知!!!
官方文檔:
外部存儲訪問權限範圍限定爲應用文件和媒體
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()
訪問本身的特定文件目錄;
以及系統特定的文件類型目錄(例:照片、屏幕快照、視頻 等)。
對於App專屬 內部存儲路徑
與外部存儲路徑
的訪問,將再也不須要 READ_EXTERNAL_STORAGE
與 WRITE_EXTERNAL_STORAGE
權限:
/data/data/<包名>/
/storage/Android/data/<包名>/
Android Q 存儲目錄的獲取,可參考如下文檔:Android Sdcard存儲目錄
Android Q 存儲目錄的獲取,可參考如下文檔:Android Sdcard存儲目錄
Android Q 存儲目錄的獲取,可參考如下文檔:Android Sdcard存儲目錄
讀取其餘APP建立的共享文件,例:相冊、屏幕快照 等,則須要申請READ_EXTERNAL_STORAGE
權限:
MediaStore.Audio
API訪問讀取其餘APP建立的共享文件,例:相冊、屏幕快照 等,則須要申請READ_EXTERNAL_STORAGE
權限:
讀取手機的Downloads文件夾,不須要任何權限,須要使用API Storage Access Framework
主要包括:
Android 10 引入了 ACCESS_BACKGROUND_LOCATION
權限。
若應用在後臺運行時,訪問手機位置,須要動態申請該權限,用戶則能夠選擇拒絕。
官方給出的數據,大部分用戶對位置信息是比較敏感的。並且大部分用戶是不容許應用在後臺使用位置信息的。
不須要手動申請權限,但官方 API內部會向用戶彈窗申請權限
Android 9 攝像頭和麥克風 後臺權限已經移除了
關於夜間模式,感興趣的同窗,能夠查看個人另外一篇文檔: