无谷歌provisioning环境下平台签名应用设置Android设备所有者实现kiosk的方案
平台签名应用获取设备所有者的落地方法
你持有平台密钥签名的应用,完全可以跳过谷歌官方的所有provisioning流程,直接拿到完整的设备所有者权限,支撑所有kiosk模式的需求,不需要依赖NFC、QR码那套配置逻辑,具体落地路径如下:
1. 未激活设备的无交互授权方案
当目标设备处于刚恢复出厂、没有配置任何用户账号、没有其他设备/配置文件所有者的状态时,平台签名应用可以零交互完成设备所有者设置:
- 依托本身的系统级权限,你不需要接外部调试设备,直接在应用初始化阶段调用系统服务内部接口,即可绕过谷歌设计的所有用户引导校验,直接将自身设置为设备所有者
- 也可以通过系统内置shell执行
dpm set-device-owner 你的应用包名/你的DeviceAdminReceiver全组件路径完成设置,平台签名的应用走这个命令的时候系统会直接放行,全程没有用户弹窗
这里有个硬性前置要求:设备必须处于未初始配置状态,只要设备上已经登录了账号、设过其他设备管理员,这个接口就会返回失败,不管你的应用签名是什么
2. 已激活设备的兜底实现
如果目标设备已经完成了初始激活,存在已登录的用户账号,没法满足上面的前置条件,依托平台签名的系统权限,你可以直接操作系统存储设备所有者信息的配置文件/data/system/device_owner.xml,把你应用的组件信息直接写入配置项,触发系统服务重载后,系统就会把你的应用识别为合法的设备所有者,全程不需要用户操作,也不需要依赖任何谷歌的provisioning组件。
3. 对应kiosk能力的实现
拿到设备所有者权限后,你要的四个kiosk功能都可以直接通过DevicePolicyManager的接口实现:
- 配置用户限制:调用
addUserRestriction(),可以直接设置禁止修改默认启动器、锁定全局VPN、禁止调整系统关键设置等限制,不需要用户授权确认 - 拦截非授权应用:通过
setApplicationHidden()把不在白名单里的第三方应用、指定要拦截的系统应用设为隐藏状态,配合lock task的白名单规则,直接断掉用户的访问入口 - 零交互设置默认Home:调用
setHomeActivity()传入你的自定义Activity组件,系统会直接把它设为默认启动入口,不会弹“选择默认应用”的交互框 - 启动lock task模式:先调用
setLockTaskFeatures()配置锁定状态下允许开放的功能,再执行startLockTask(),就能把应用固定在前台,挡住用户返回、切应用、调出导航栏的操作
必须注意的坑
- 你的应用签名必须和系统平台签名完全匹配,否则就算你有权限修改系统文件,SELinux策略、签名校验逻辑也会直接拦掉所有设备所有者接口的调用,权限是不完整的
- 应用必须在Manifest里声明
BIND_DEVICE_ADMIN权限,配置合法的DeviceAdminReceiver组件,不然系统识别不到你的设备管理身份 - 别想着靠root权限绕过签名校验,这种方式不仅权限不全,系统重启之后还大概率会丢权限,稳定性完全没保障
内容的提问来源于stack exchange,提问作者Pavel Fedor
相关产品推荐
相关产品推荐

