Android P应用适配指南

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lhy349/article/details/83056264

AndroidP兼容性变化

1 对非 SDK 接口的限制

1.1 介绍

非sdk的接口存在着稳定性问题,随着android版本的变化随时都有可能被移除,AndroidP开始,为了更好的提升app的兼容性,正对隐藏的非sdk接口进行限制,通过名单控制进行使用限制,具体规则限制如下:

在这里插入图片描述

1.2 影响范围

所有运行在AndroidP系统上的应用

1.3 如何适配

(1)对于黑名单及深灰名单中的接口,应用及时调整新的方案进行适配;

(2)黑名单及灰名单是在源码构建的时候生成的,在此提供一份,文件下载链接:【黑名单】点此下载 | 【灰名单】点此下载

(3)应用可以直接adb logcat命令中过滤”Accessing hidden”查看当前应用使用非sdk的情况

2 刘海屏适配指导(cutout)

2.1 介绍

随着各种刘海屏相继出现,但没有一致的接口,AndroidP开始提供规范化的接口,应用可以使用标准接口,获取当前是否有刘海,控制应用在刘海屏上的布局显示区域。AndroidP的设备支持模拟刘海效果,持有P的设备的可以打开“开发者选项”,找到“模拟巨有凹口的显示屏”进行模拟调试。

2.2 影响范围

所有运行在AndroidP系统上的应用,不分targetsdkversion

2.3 如何适配

■ 怎么判断是否刘海支持与否?

View.getRootWindowInsets().getDisplayCutout()

返回DisplayCutout对象,为刘海的描述信息,不支持则返回空

■ 怎么获取刘海信息?

DisplayCutout.getSafeInsets() 返回安全区域Rect

DisplayCutout.getBounds() 返回刘海的区域的Region

■ 如何控制应用的布局显示?

通过控制窗口布局的layoutInDisplayCutoutMode属性可以达到控制应用在刘海屏下布局区域,具体可以设置以下值

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT

没有设置的情况下默认此标记,只有状态栏区域可见的情况下,才意味着加了FLAG_FULLSCREEN or SYSTEM_UI_FLAG_FULLSCREEN标记的应用窗口都会被切边放在刘海以下

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES

此flag下不进行应用窗口的限制,窗口可以显示到刘海区域

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

此flag下应用窗口一直被限制在刘海区域以下

应用也可以通过theme来达到同样的效果

<item name="android:windowLayoutInDisplayCutoutMode">default</item>

对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT

<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES

<item name="android:windowLayoutInDisplayCutoutMode">never</item>

对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

应用遇到窗口显示被限制在刘海以下区域的可以调整

layoutInDisplayCutoutMode 设置为

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,再通过获取

DisplayCutout 关于刘海区域信息,调整UI达到更好的满屏体验。

3 应用待机分组策略

3.1 介绍

应用待机分组为AndroidP上新的电源管理功能,它将应用归为五类,没有采用不同的限制策略,来控制应用的访问资源的能力。
具体分以下五类:
在这里插入图片描述

3.2 影响范围

所有运行在AndroidP系统上的应用,不分targetsdkversion,受此影响为主要为应用的后台行为受限制,特别如闹钟,地图导航,后台下载,健康类应用。

3.3 如何适配

■ 应用根据Android的限制策略,点检应用的后台行为是否被限制。

■ 如何确认是否因为应用待机分组导致的后台行为限制?

(1)先确认应用的待机分组

        adb shell am get-standby-bucket [packagename]  //查下当前应用的分组情况;

(2)如果不在活跃组(active)

        adb shell am set-standby-bucket packagename active  //强制切换应用到活跃分组;

确认在此情况下用户的行为是否依然受限制,如果是的话,才确认为待机分组策略导致的后台行为限制。

■ 应用可以通过

        adb shell am set-standby-bucket packagename active|working_set|frequent|rare 
        在不同分组见强制进行切换,调试自身应用。

■ 对于由于后台分组策略导致的后台限制,应用需要进行相关策略上的调整详细见:https://developer.android.com/about/versions/pie/power

4 Crypto JCA 提供程序已被移除,弃用 Bouncy Castle 加密

4.1 介绍

Crypto JCA 提供程序已被移除。调用 SecureRandom.getInstance(“SHA1PRNG”,“Crypto”) 将会引发 NoSuchProviderException,调用Bouncy Castle 提供程序的 getInstance(),会生成 NoSuchAlgorithmException 错误。

4.2 影响范围

(1)Crypto JCA 提供程序已被移除,此影响所有运行AndriodP系统的所有应用;

(2)Bouncy Castle 提供程序异常的问题,影响所有targetsdkversion>=28的应用;

4.3 如何适配

模块应该在getInstance()的时候不指派提供程序,采用默认实现即可

5 FLAG_ACTIVITY_NEW_TASK被强制要求

AndroidP上,从非 Activity 环境中启动 Activity,除非传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,此限制对所有运行AndroidP的应用生效。

6 禁止空闲应用访问相机、麦克风和传感器

Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:

(1)应用不能访问麦克风或摄像头。

(2)使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。

(3)使用变化或一次性报告模式的传感器不会接收事件。

7 前台服务的应用必须请求 FOREGROUND_SERVICE 权限

targetsdkversion>=28的应用在使用前台服务的都需要进行必须请求 FOREGROUND_SERVICE 权限。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

<uses-permission ndroid:name="android.permission.FOREGROUND_SERVICE"/>

8 默认情况下启用网络传输层安全协议

AndroidP上,对应targetsdkversion>=28的应用需要为特定域名启用明文,必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true,默认情况下明文传输会直接抛出“java.io.IOException: Cleartext HTTP traffic to xxx.com not permitted”异常。

9 Apache HTTP 客户端弃用,bootclasspath 中已移除

AndroidP开始org.apache.http.legacy.jar这个包不在打包进bootclasspath,对于targetsdkversion>=28的,继续引用此包的应用将直接出现NoClassDefFoundError,对于targetsdkversion低于28的,系统会将此包加载到应用的classloader中,如果应用采用系统的classloader加载应用,将同样会出现NoClassDefFoundError,建议模块使用 HttpURLConnection 类,更加高效。

10 移除对 Build.serial 的直接访问

Build.SERIAL字段已经被废弃,AndroidP上值一直为“UNKNOWN”, 如果您的应用需要访问设备的硬件序列号,您应请求 READ_PHONE_STATE 权限,然后调用 getSerial()。

11 不允许共享 WebView 数据目录

targetsdkversion>=28的应用不允许在不同进程之间共享一个 WebView 数据目录。如果应用有多个进程使用 WebView、CookieManager 或 android.webkit 软件包中的任何其他 API,则在第二个进程调用 WebView 函数时,应用将会崩溃。

12 应用禁止访问xt_qtagui目录的文件

AndroidP后,不再允许应用直接读取 /proc/net/xt_qtaguid 文件夹中的文件。 这样做是为了确保与某些根本不提供这些文件的设备保持一致。应用应该采用标准 API TrafficStats 和 NetworkStatsManager 进行访问,此限制对所有运行AndroidP系统上的应用生效。

13 SELinux 禁止访问应用的数据目录

对于targetsdkversion>=28的应用,系统强制每个应用的 SELinux 沙盒对每个应用的私有数据目录强制执行逐个应用的 SELinux 限制。现在,不允许直接通过路径访问其他应用的数据目录。应用可以继续使用进程间通信 (IPC) 机制(包括通过传递 FD)共享数据,例如可以采用FileProvider。

参考链接

(1)vivo开发者平台:https://dev.vivo.com.cn/documentCenter/doc/145
(2)AndroidP所有应用行为变更:https://developer.android.com/about/versions/pie/android-9.0-changes-all

(3)AndroidP targetSDK 28应用行为变更:https://developer.android.com/about/versions/pie/android-9.0-changes-28

(4)AndroidP 电源管理:https://developer.android.com/about/versions/pie/power

(5)pixles系列镜像升级:https://developers.google.com/android/images

展开阅读全文

没有更多推荐了,返回首页