Android Q的适配

1、Google 2019年 Andnroid Q版本发布计划

 

    根据谷歌的计划,Android Q版本最终会在下半年9月发布。8月现在已经发布了beta5版本,基本上API不会有太大的改动。

    具体明细请查看官方链接:https://developer.android.google.cn/preview/overview.html

2、需要适配的明细  

2.1 标识符获取(必须适配)    

      a、Q版本上,应用必须具有 系统级应用 的特许权限(READ_PRIVILEGED_PHONE_STATE),才能访问设备的不可重置标识符(包含 IMEI 和序列号),

           影响在 Q 上运行的所有应用,即使这些应用以 Android 9(API 为 28)或更低版本为 targetSdkVersion。

           对应用依赖设备ID的功能产生影响:调用TelephonyManager.getDeviceId,会报 SecurityException

           适配建议:

           官方建议使用 AndroidId 或者 UUID

           风险:AndroidId 有没有可能出现重复,重复的几率多大? 

 

      b、Q版本默认 MAC地址随机,影响在 Q 上运行的所有应用。

           适配建议:

           (1) 获取实际的mac地址,可以使用 设备管理器DevicePolicyManager,需要申请设备管理权限。

           (2) level 24(7.0)以上,可以 遍历循环所有的网络接口(NetworkInterface.getNetworkInterfaces()),找到接口是wlan0的,经pixel xl (Q版本)测试,可行 :

 

     需要适配代码:

           (2) IMEI获取:

                      TelephonyManager tm = (TelephonyManager)context.getSystemService("phone");
                      tm.getDeviceId();

             替换为:

                       QAdaptManager..getImei(context)   

 

             (2)MAC地址获取:

                      WifiManager wifi = (WifiManager)context.getSystemService("wifi");
                      WifiInfo info = wifi.getConnectionInfo();
                     String mac = info.getMacAddress();

             替换为:

                       QAdaptManager.getMac(context) 

             

             (3)还有  ContextUtil.invokeTelephonyManagerMethod 这个反射调用方法,基本上都会报错。

                    而且会抛出异常,可以修改为 不抛出异常,有异常是直接返回null

2.2 非SDK接口限制(必须适配)    

      Android 平台开始限制您的应用在 Android 9(28)中使用非 SDK 接口,灰名单和黑名单的非 SDK 接口已有更新。

      适配建议: 

      依赖非SDK接口的应用应尽快迁移到 SDK 替代方案,如部分非SDK接口无替代方案,则请求新的公共API。

      谷歌提供了检查工具: veridex,有mac,linux版本,检查后的结果中,会有4类限制接口:

         (1)blacklist:黑名单,调用就会报错。也是我们项目中必须解决的非SDK接口

         (2)greylist:灰名单,即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口

         (3)greylist-max-o:在targetSDK<=O中能使用,但是在targetSDK>=P中被限制的非SDK接口

         (4)greylist-max-p:在targetSDK<=P中能使用,但是在targetSDK>=Q中被限制的非SDK接口,例如 在Q版本中调用就会报错

           报错举例:Accessing hidden field Landroid/widget/ImageView;->mMaxHeight:I (greylist-max-p, reflection, denied)  

           veridex 工具mac版本下载: veridex-mac.zip

 

      黑名单,greylist-max-o,greylist-max-p的非SDK接口,必须要替换或去掉。灰名单的接口可以后续替换或去掉。

      veridex工具的缺陷:只能检测到通过反射实现的调用,无法检测到通过 JNI 实现的调用。

 

      注意:黑名单和灰名单在具有相同Android版本的不同OEM设备上是否相同?

               OEM可以将自己的接口添加到黑名单,但是它们无法从AOSP黑色或灰名单中删除接口。

2.3 外部存储沙箱限制(必须适配)

     以 Android Q (29)为targetSdkVersion的应用,Q 更改了应用对设备外部存储设备中的文件(存储在sdcard 下的文件)的访问方式,只有满足相关条件,应用才能访问其他应用创建的文件。

     适配建议: 

     a、如果App以 29 为 targetSdkVersion,则在访问外部存储设备中的文件时会有沙箱限制,应用对其专有目录下的文件始终拥有读/写权限。

         只有在满足以下两个条件时,您的应用才能访问其他应用创建的文件:

       (1)您的应用已获得 READ_EXTERNAL_STORAGE 权限。

       (2)这些文件位于以下其中一个明确定义的媒体集合中:

               照片:存储在 MediaStore.Images 中。

               视频:存储在 MediaStore.Video 中。

               音频:存储在 MediaStore.Audio 中,对应目录 Picture。

          如何访问:

文件位置需要权限访问方法(*)卸载时是否删除
应用缓存目录没有

外部缓存:

getExternalFilesDir()  持久化数据
getExternalCacheDir()  临时数据

内部缓存:手机存储不足时,有可能被删除

getCacheDir()

多媒体(照片、视频、音频)

READ_EXTERNAL_STORAGE
访问其他应用程序的文件
MediaStore

下载(文件)

目录:Downloads

没有存储访问框架(调用系统的文件选择器)

         有权限的情况下,如果直接用 Environment.getExternalStorageDirectory() 方式访问,  会报 FileNotFoundException 的错误。

         建议:使用 缓存目录 的方式,保存和访问文件。

         警告:明年所有应用程序的主要平台版本都需要执行存储空间沙箱限制,与 targetSdkVersion 级别无关。

     

     b、暂时豁免 Q 的外部存储沙箱限制,有2种方法:

         (1) targetSdkVersion 为 Android 9(28)或更低。

         (2)targetSdkVersion 为 29,manifest 配置,application 中 android:requestLegacyExternalStorage="true" 

         这种情况下,用 Environment.getExternalStorageDirectory() 方式访问,可以正常访问。

   

     c、FileProvider方式

 

      需要适配代码:

           文件路径获取:

                      Environment.getExternalStorageDirectory() + File.separator + "文件目录"

          替换为:

                      QAdaptManager.getFilePath(context, "文件目录")

      注意:安装调试APP时,如果targetSdkVersion是由 29 以下升级至 29,(即如果APP是更新安装,旧版本targetSdkVersion是29以下,新版本为29) 则不会受这个限制。          

2.4 默认为所有TLS连接启用TLS 1.3    

       默认情况下为所有TLS连接启用 TLS 1.3。您可以SSLContext通过调用获取禁用TLS 1.3的 SSLContext.getInstance("TLSv1.2")。
           还可以通过调用setEnabledProtocols() 适当的对象在每个连接的基础上启用或禁用协议版本

       适配建议:

       影响 https 协议,需要测试 https,查看是否需要适配。

2.5 targetSdkVersion 低于23时警告

         以低于23的API级别(或更早版本)为目标的应用程序,将导致操作系统在安装是,请求敏感权限时,向用户显示警告。

         适配建议:

         targetSdkVersion 升级到23以上。

2.6 剪贴板限制    

        任何不在前台或设置为默认输入法的应用程序,都无法以任何方式读取剪贴板。

2.7 后台应用启动

        对应用可启动 Activity 的时间施加了限制,只有在满足相关条件时才能启动 Activity。此项行为变更适用于在 Android Q 上运行的所有应用。

2.8 获取位置信息

       Q 引入了新的位置权限,区分应用前台和后台获取位置信息。如果您的应用在后台时请求访问设备位置信息,则会影响您的应用。

       如果用户只授权前台获取位置信息权限, 应用在返回后台后则不能再获取位置信息。   

2.9 待定

   申请全屏 需要权限

     官方描述:需要界面全屏,必须在manifest文件中声明 USE_FULL_SCREEN_INTENT 权限,该权限是一个普通权限,系统会自动授权。

     实际测试: Q设备,没有这个权限,也能全屏。 Q 和 Q以下设备不会报错。

3、第三方的适配

3.1 加固版本兼容

     Android每个大版本升级,加固方案商都会对android大版本适配和兼容。依赖加固固件的应用需要及时更新最新的加固固件来适配Android新版本。

3.2 第三方SDK兼容

     应用会依赖第三方的SDK Jar或Native so库等第三方SDK,Android大版本升级第三方SDK会存在不兼容的问题,需要推动以及更新依赖的第三方SDK适配 Q。

4、大厂提供的适配文档

     vivo适配文档 链接:https://dev.vivo.com.cn/documentCenter/doc/235

 

5、Android Studio 开发环境 升级

    (1) Android Studio 升级到 3.4.1 以上的 稳定版本,不建议使用 不稳定的CANARY 和 RC 版本。

    (2) Android SDK level 升级到 29。

    (3) Android SDK Build-Tools 升级到 28 以上。

    (4)gradle 配置: 

                 compileSdkVersion 29

                 buildToolsVersion '28.0.3' 或 28.0.3以上

                 targetSdkVersion 29

    (5) Android Q 开发测试设备:

             Pixel 或者 国内适配了Q的机型: 华为Mate 20 Pro,一加6T,OPPO Reno,Realme 3 Pro,vivo X27,vivo NEX S,vivo NEX A,小米9,小米MIX 3 5G

 

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页