Android12,SCHEDULE
由于Android12升级,在调用精确闹钟的方法的时候,必须进行SCHEDULE_EXACT_ALARM权限的检查。具体操作请参考:适配Android 12的行为变更-----精确的闹钟权限_袁美丽..的博客-CSDN博客_android 闹钟权限
但是最近在做新机种的时候,在S平台上,虽然clock调用了精确闹钟的方法,但是没做SCHEDULE_EXACT_ALARM权限的检查,没有任何影响(正常来说,如果不处理,在调用精确闹钟的方法时肯定会crash)
经过调查发现:
framework给clock进程加了doze mode白名单
<!-- Whitelist of what components are permitted to run in the background -->
<allow-in-power-save package="com.android.deskclock" />
导致canScheduleExactAlarms的值一直返回的是true
AlarmManagerService$mService#canScheduleExactAlarms
@Override
public boolean canScheduleExactAlarms(String packageName) {......if (!isExactAlarmChangeEnabled(packageName, userId)) { // Check the feature flag is on or offreturn true;}return isExemptFromExactAlarmPermission(packageUid) // ★ Will check DozeMode white list here|| hasScheduleExactAlarmInternal(packageName, packageUid);
}AlarmManagerService#isExemptFromExactAlarmPermission
boolean isExemptFromExactAlarmPermission(int uid) {return (UserHandle.isSameApp(mSystemUiUid, uid)|| UserHandle.isCore(uid)|| mLocalDeviceIdleController == null|| mLocalDeviceIdleController.isAppOnWhitelist(UserHandle.getAppId(uid))); // ★ Check DozeMode white list
}
不仅clock会有此问题,如果其他应用也加了doze mode白名单,并且也有此逻辑,同样会出现此现象。可以参考一下。
Android12,SCHEDULE
由于Android12升级,在调用精确闹钟的方法的时候,必须进行SCHEDULE_EXACT_ALARM权限的检查。具体操作请参考:适配Android 12的行为变更-----精确的闹钟权限_袁美丽..的博客-CSDN博客_android 闹钟权限
但是最近在做新机种的时候,在S平台上,虽然clock调用了精确闹钟的方法,但是没做SCHEDULE_EXACT_ALARM权限的检查,没有任何影响(正常来说,如果不处理,在调用精确闹钟的方法时肯定会crash)
经过调查发现:
framework给clock进程加了doze mode白名单
<!-- Whitelist of what components are permitted to run in the background -->
<allow-in-power-save package="com.android.deskclock" />
导致canScheduleExactAlarms的值一直返回的是true
AlarmManagerService$mService#canScheduleExactAlarms
@Override
public boolean canScheduleExactAlarms(String packageName) {......if (!isExactAlarmChangeEnabled(packageName, userId)) { // Check the feature flag is on or offreturn true;}return isExemptFromExactAlarmPermission(packageUid) // ★ Will check DozeMode white list here|| hasScheduleExactAlarmInternal(packageName, packageUid);
}AlarmManagerService#isExemptFromExactAlarmPermission
boolean isExemptFromExactAlarmPermission(int uid) {return (UserHandle.isSameApp(mSystemUiUid, uid)|| UserHandle.isCore(uid)|| mLocalDeviceIdleController == null|| mLocalDeviceIdleController.isAppOnWhitelist(UserHandle.getAppId(uid))); // ★ Check DozeMode white list
}
不仅clock会有此问题,如果其他应用也加了doze mode白名单,并且也有此逻辑,同样会出现此现象。可以参考一下。