Android-12适配-行为变更:以-Android-12-为目标平台的应用
时间:2022-08-27 13:00:00
自定义通知
造成影响
简单来说,如果以前的话App中的通知(Notification)自定义内容视图用于填充整个通知区域。App以Android 12作为目标平台后,视图将不再填充整个区域,而是缩小到固定范围:
此外,如果您在设置自定义内容视图时使用所有通知,所有通知现在都可以扩展。 setCustomContentView方法,你现在需要再次使用setBigCustomContentView方法设置展开状态的样式,确保收起状态和展开状态的样式统一。
适配方案
确认显示范围缩小后的自定义内容视图样式是否可接受,如果不可接受,则可根据实际需要进行调整。
移动传感器采样限制
造成影响
当使用SensorManager如果监控频率过快,比如sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);,而且没有改变定义permission HIGH_SAMPLING_RATE_SENSORS如果有权限,就会有这种崩溃。
java.lang.SecurityException: To use the sampling rate of 0 microseconds, app needs to declare the normal permission HIGH_SAMPLING_RATE_SENSORS. at android.hardware.SystemSensorManager$BaseEventQueue.enableSensor(SystemSensorManager.java:884) at android.hardware.SystemSensorManager$BaseEventQueue.addSensor(SystemSensorManager.java:802) at android.hardware.SystemSensorManager.registerListenerImpl(SystemSensorManager.java:272) at android.hardware.SensorManager.registerListener(SensorManager.java:835) at android.hardware.SensorManager.registerListener(SensorManager.java:742)
适配方案
在大多数情况下,我们不需要太快的监控频率,可以设置为SensorManager.SENSOR_DELAY_UI。如果确实需要快速频率监控,需要添加HIGH_SAMPLING_RATE_SENSORS权限。
导出更安全的组件
造成影响
简单来说,就是以Android 12是目标平台App,如果使用了它包含的四个组件Intent过滤器(intent-filter),必须明确声明 android:exported 属性,否则App将无法在Android 安装在12和更高系统版本的设备上:
适配方案
这里要区分两种情况:
-
如果使用自己的项目,可以按要求进行显式声明;
-
如果是依赖的第三方库使用到了,对于这一类aar或者依赖库存component有两种解决方案:
- 试着升级相应的依赖库版本,看看是否已经进行了target android12适配;
- 在主工程中xml拷贝相关component声明,并覆盖exported例如:
android:exported="true" tools:replace="android:exported"
应用休眠
造成影响
简单来说,就是以Android 12是目标平台App,如果用户已经好几个月没打开你了App,因此,您之前申请的所有操作权限都将被重置为未经授权的状态,即使再次打开也无法恢复,需要重新申请。
适配方案
基本上,只要你的App之前已经做好了运行时权限的判断和申请,对你有好处App几乎没有影响。如果还想安全测试,可以用Terminal终端执行adb手动触发休眠的命令:
https://developer.android.com/topic/performance/app-hibernation#manually-invoke
待处理 intent 可变性
造成影响
简单来说,就是以Android 12是目标平台App,在构建PendingIntent需要指定时间Flag为FLAG_IMMUTABLE(建议)或FLAG_MUTABLE否则,两者之一App崩溃并发出以下警告。
适配方案
但第三方库的代码也可能没有正确指定Flag除了等待第三方库更新,似乎没有更好的措施。
前台服务启动限制
造成影响
简单来说,就是以Android 12是目标平台App,如果在后台运行时尝试启动前台服务(startForegroundService),则会引发ForegroundServiceStartNotAllowedException异常(某些场景除外):
适配方案
分两步走:
- 检查App前台服务是否在后台启动?
可在Terminal以下是终端执行adb命令,该命令会监控你的App前台服务是否在后台启动?一旦发生此行为,将在通知栏中推送提醒,并将其定位到触发此行为的代码:
adb shell device_config put activity_manager \ default_fgs_starts_restriction_notification_enabled true
- 考虑改用WorkManager执行后台任务的紧急工作
准确的闹钟权限
造成影响
简单来说,就是以Android 12是目标平台App,若使用AlarmManager设置定时任务,设置准确的闹钟(使用setAlarmClock()、setExact()、setExactAndAllowWhileIdle()这些方法),则需要确保SCHEDULE_EXACT_ALARM权限声明且打开,否则App崩溃并发出以下警告:
适配方案
分三步走:
- 在AndroidManifest.xml声明在清单文件中 SCHEDULE_EXACT_ALARM 权限
- 判断是否有权设置精确的闹钟
- 打开闹钟和提醒授权页面进行授权
通知 trampoline 限制
造成影响
简单来说,我们之前的配置通知(Notification)点按行为时,可以通过PendingIntent来启动一个Service或BrocastReceiver。而以Android 12是目标平台App,如果尝试在Service或BrocastReceiver中内调用 startActivity(),系统会阻止该Activity启动,并在 Logcat 显示以下消息:
适配方案
分两步走:
- 排查哪个Service或BrocastReceiver有此行为
可在Terminal终端执行以下adb在您点击通知后,命令将确定哪个Service或BrocastReceiver调用了startActivity()并将相关信息输出到Logcat,可通过关键词可通过关键词NotifInteractionLog过滤:
adb shell dumpsys activity service \ com.android.systemui/.dump.SystemUIAuxiliaryDumpService
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-BTSFXONX-1656855678448)(/upload-images.jianshu.io/upload_images/5530180-07905f7731fe23a9.png?imageMogr2/auto-orient/strip|imageView2/2/w/1140/format/webp)]
- 考虑在配置通知(Notification)的点按行为时选择直接启动Activity
结语
还有许多的行为变更,以上我只选了几条重要的,其他变更及更详细的文档可以参见:
Android 12行为变更:以 Android 12 为目标平台的应用
以上只是针对以 Android 12 或更高版本为目标平台的应用应为变更,此外,请务必查看:
Android 12适配-行为变更:所有应用
参考
Android 12行为变更:以 Android 12 为目标平台的应用