Android 10+下检测到特定事件时应用自动弹窗的实现方式及所需权限
注:本文最初发布于Android Enthusiasts Stack Exchange,因被判定为偏离该站点主题,现已迁移至此处
问题背景
家长控制应用卡巴斯基安全儿童(Kaspersky Safe Kids)具备一项功能:每当检测到儿童执行了禁止操作(打开指定应用、访问其设置相关内容、在谷歌和Youtube搜索违规内容——有趣的是,该功能对其他基于Chromium的浏览器无效)时,就会自动弹出窗口。
我一直在研究如何在自己的应用中实现同类事件检测能力,但GET_TASKS、READ_LOGS这类常用权限已被废弃,我的应用目标适配Android 10+系统,而卡巴斯基可在该系统版本正常运行。
至于弹窗实现,我原本以为它使用了SYSTEM_ALERT_WINDOW权限,但我自己在模拟器中测试时,撤销该权限后卡巴斯基依然可以正常弹窗。因此我想了解这类功能的实现原理,以及卡巴斯基这类管控类、效率类应用使用了哪些权限?
我最初猜测该功能依托设备管理员权限实现,但查看官方的设备管理员权限列表后,发现其中没有卡巴斯基使用的相关权限。
补充说明
经社区成员提示,我确认该应用使用了无障碍服务(Accessibility Services),这点完全符合逻辑,因为无障碍服务支持很多操作,包括监听用户界面事件、展示自定义UI,刚好可以满足操作检测和弹窗的需求。
另外有用户反馈该应用的进程会随机终止,大概率是因为没有加入系统白名单。我后续查看了它的权限列表,确认用到了以下特殊权限:
- 后台保活权限:
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,该权限允许应用加入省电白名单,避免省电模式杀死后台进程 - 无障碍服务核心权限:
android.permission.BIND_ACCESSIBILITY_SERVICE,注意该权限为签名级权限,需要用adb shell appops set com.kaspersky.safekids BIND_ACCESSIBILITY_SERVICE [allow|ignore|deny]命令来配置,不能用普通的adb shell pm [grant|revoke] com.kaspersky.safekids android.permission.BIND_ACCESSIBILITY_SERVICE命令配置(命令中的android可能需要替换为Manifest) - 设备管理员所需基础权限:
android.permission.BIND_DEVICE_ADMIN
内容的提问来源于stack exchange,提问作者StarDust
相关产品推荐
相关产品推荐

