Android技术知识Android开发经验谈程序员

Android 9 pie更新内容

2018-09-23  本文已影响14人  焱轶

Android 9 pie更新内容

1.非sdk接口限制

白名单:adroid sdk

黑名单:只能被Android系统和系统应用调用,无论targetsdkversion都禁止使用,对开发者来说相当于没有这些接口

深灰名单:没有发现应用在使用,但我们觉得有潜在的可能性,当targetsdkversion<p时可以使用,否则禁止使用

浅灰名单:已有应用在使用的非sdk接口,仍然可以继续使用,将来可能会提供相应的sdk接口当>=p时系统会提示警告

如果你想测试自己应用是否使用了非sdk接口

1.logcat中查看

2.静态扫描工具Veridex

2.凹口屏幕

1.不要给状态栏指定的高度,用windowinsetscompat获取状态栏高度

2.注意屏幕大小和显示区域差异,用view.getLcationInWindow,不要用view.getLocationOnScreen,处理montionevent时,用getx/gety,而不是getrawx/getrawy

3.凹口可以在中间或者靠边,只会在屏幕短边出现,两条短边都有缺口

3.屏幕旋转锁定

在Android9上屏幕旋转的界面可以设置为纵向和横向,这个设置取决于用户给activity设置的screenOrientation,不要假设设备旋转锁定时必定纵向

4.应用空闲时无法访问麦克风,摄像头和传感器

Android p限制所有处于空闲的应用对麦克风,摄像头和所有sensorManager传感器的访问。当应用的uid空闲,麦克风将报告系统“无音频信号”,传感器会停止报告事件,使用的摄像头也会断开连接

5.后台服务限制

targetsdk>26的应用没有在前台显示,那么后台服务就会受到系统限制。如果需要长期运行的服务应该迁移到前台服务,或者用workmanager和jobscheduler

6.前台服务限制

targetsdk时p版本后,使用前台服务必须申请FOREGROUND_SERVICE权限,这个时一般性权限,放在manifest中声明后系统会自动授权。如果没有这个,系统会抛出securityException

7.inline函数检查

在android  p中,如果调用某个inline方法的类和inline方法所在的类由不同的classloader加载,就会主动发起abort(inline不允许跨dex文件),导致应用crash。应该尽量避免用不同的classloader加载相关类,因为被调用类的方法可能已经被inline了

应用不兼容的常见原因

1.使用了系统的classloader加载org.apache.http.*的库

2.没有兼容Android p的加固服务

3.直接调用dex2oat

4.使用了非sdk接口

5.使用了不兼容的第三方库

8.后台位置限制

后台应用每小时只能接收几次位置更新,前台应用不受影响。

解决方式

1.用地理围栏geofence

2.用位置批处理locationService.setMaxWaitTime()

3.被动获取位置信息locationService.setFastersInterval()

9.隐式广播限制

无法继续在清单中为隐式广播注册广播接收器,清单中显示注册仍然有效,使用context.registerReceiver()注册隐式广播接收器仍然有效

解决方式

1.使用高优先级FCM消息

2.使用workmanager来安排一个作业

10.多显示器支持

指定activity在哪个显示器启动,activityOptions.setLaunchDisplayId

activity在显示器之间切换时自动更新属性

不要假设暂停的activity一定不可见

11.包名重构

之前的v4和v7之类的包现在都放在androidx.*中Android 9 pie更新内容

上一篇下一篇

猜你喜欢

热点阅读