Android 9 pie更新内容
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更新内容