官方文档:
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 摄像头和麦克风 后台权限已经移除了
关于夜间模式,感兴趣的同窗,能够查看个人另外一篇文档: