非sdk的接口存在着稳定性问题,随着android版本的变化随时都有可能被移除,AndroidP开始,为了更好的提升app的兼容性,正对隐藏的非sdk接口进行限制,通过名单控制进行使用限制,具体规则限制如下:
所有运行在AndroidP系统上的应用
(1)对于黑名单及深灰名单中的接口,应用及时调整新的方案进行适配;
(2)黑名单及灰名单是在源码构建的时候生成的,在此提供一份,文件下载链接:【黑名单】点此下载 | 【灰名单】点此下载;
(3)应用可以直接adb logcat命令中过滤”Accessing hidden”查看当前应用使用非sdk的情况
随着各种刘海屏相继出现,但没有一致的接口,AndroidP开始提供规范化的接口,应用可以使用标准接口,获取当前是否有刘海,控制应用在刘海屏上的布局显示区域。AndroidP的设备支持模拟刘海效果,持有P的设备的可以打开“开发者选项”,找到“模拟巨有凹口的显示屏”进行模拟调试。
所有运行在AndroidP系统上的应用,不分targetsdkversion
■ 怎么判断是否刘海支持与否?
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来达到同样的效果
- default
对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
- shortEdges
对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- never
对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
应用遇到窗口显示被限制在刘海以下区域的可以调整
layoutInDisplayCutoutMode 设置为
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,再通过获取
DisplayCutout 关于刘海区域信息,调整UI达到更好的满屏体验。
应用待机分组为AndroidP上新的电源管理功能,它将应用归为五类,没有采用不同的限制策略,来控制应用的访问资源的能力。
具体分以下五类:
所有运行在AndroidP系统上的应用,不分targetsdkversion,受此影响为主要为应用的后台行为受限制,特别如闹钟,地图导航,后台下载,健康类应用。
■ 应用根据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
Crypto JCA 提供程序已被移除。调用 SecureRandom.getInstance(“SHA1PRNG”,“Crypto”) 将会引发 NoSuchProviderException,调用Bouncy Castle 提供程序的 getInstance(),会生成 NoSuchAlgorithmException 错误。
(1)Crypto JCA 提供程序已被移除,此影响所有运行AndriodP系统的所有应用;
(2)Bouncy Castle 提供程序异常的问题,影响所有targetsdkversion>=28的应用;
模块应该在getInstance()的时候不指派提供程序,采用默认实现即可
AndroidP上,从非 Activity 环境中启动 Activity,除非传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,此限制对所有运行AndroidP的应用生效。
Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:
(1)应用不能访问麦克风或摄像头。
(2)使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
(3)使用变化或一次性报告模式的传感器不会接收事件。
targetsdkversion>=28的应用在使用前台服务的都需要进行必须请求 FOREGROUND_SERVICE 权限。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
AndroidP上,对应targetsdkversion>=28的应用需要为特定域名启用明文,必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true,默认情况下明文传输会直接抛出“java.io.IOException: Cleartext HTTP traffic to xxx.com not permitted”异常。
AndroidP开始org.apache.http.legacy.jar这个包不在打包进bootclasspath,对于targetsdkversion>=28的,继续引用此包的应用将直接出现NoClassDefFoundError,对于targetsdkversion低于28的,系统会将此包加载到应用的classloader中,如果应用采用系统的classloader加载应用,将同样会出现NoClassDefFoundError,建议模块使用 HttpURLConnection 类,更加高效。
Build.SERIAL字段已经被废弃,AndroidP上值一直为“UNKNOWN”, 如果您的应用需要访问设备的硬件序列号,您应请求 READ_PHONE_STATE 权限,然后调用 getSerial()。
targetsdkversion>=28的应用不允许在不同进程之间共享一个 WebView 数据目录。如果应用有多个进程使用 WebView、CookieManager 或 android.webkit 软件包中的任何其他 API,则在第二个进程调用 WebView 函数时,应用将会崩溃。
AndroidP后,不再允许应用直接读取 /proc/net/xt_qtaguid 文件夹中的文件。 这样做是为了确保与某些根本不提供这些文件的设备保持一致。应用应该采用标准 API TrafficStats 和 NetworkStatsManager 进行访问,此限制对所有运行AndroidP系统上的应用生效。
对于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