DO 免删账号激活设备所有者
适用版本:Android 13 及以上。 Android 12 及以下不适用本文方案。
设备所有者(Device Owner,简称 DO)是 AxManagerD 最高权限的提权通道之一。网上流传的说法是"激活 DO 必须先删掉设备上所有账号",实际上这只是其中一条调用通道的规则,并非系统对 DO 的普遍要求。
本文说明 AxManagerD 实际采用的免删账号方案:全程不读写任何账号数据,仅在几秒内调整一次开机向导状态。
前言:校验分成两条通道
系统在发放设备所有者权限前,要先过一次状态校验。这段校验根据**"是谁在调用"**分成两条分支,两条分支读取的东西完全不同:
| 通道 | 调用身份 | 校验读取的内容 |
|---|---|---|
| ADB 通道 | ADB / 电脑调试身份 | 读取这台设备上已登录的账号列表 |
| 应用通道 | 应用自身身份 | 不读账号列表,只读两项: ① 设备所有者的用户是不是系统用户 ② 这台设备有没有走完开机向导 |
也就是说,"必须删账号"只是 ADB 那条分支的规则。应用走的是另一条分支,判定依据里根本没有账号这一项。
核心:为什么不用删账号
只要调用发生在"应用自身身份"这条分支上,账号存在与否根本不参与判断,所以不需要删任何账号。
走应用通道时,需要同时满足的只有两项:
- 设备所有者的目标用户是系统用户
- 设备"看起来"已经走完开机向导
第 1 项在正常设备上天然成立;需要处理的只有第 2 项。
向导状态的两份副本
"开机向导是否完成"这同一个状态,系统里记了两份:
| 位置 | 性质 | 是否参与校验 |
|---|---|---|
| 系统设置 | 持久保存 | 不参与 |
| 系统内存 | 运行时缓存 | 参与 |
这里有两个关键特性,决定了方案的做法:
- 校验只看内存里这份,设置里那份完全不参与判断。
- 内存那份只单向变化:它只会从"未完成"变成"已完成",不会自己变回去。
由此可以推出一个反直觉的结论:
单改设置里的值,门不会开。
因为校验读的是内存副本,改设置只是改了一份没人看的记录,内存里的判定依据没有任何变化。
同步指令
系统里有一条只做同步的指令。它的特殊性在于:
- 它不参与判断,不会自己触发校验
- 它只做一件事:按设置里的值原样覆盖内存副本
执行它之后,内存副本就等于设置里的值。这正是打通两步的关键——先用设置决定"应该是什么值",再用同步指令让内存副本接受这个值。
完整链路
整个流程共 5 步,耗时以秒计:
- 写入设置:用 shell 身份把设置里的向导状态写成"未完成"
- 同步内存:应用执行同步指令,把内存副本刷成"未完成"
- 条件齐备:此时校验的两项全部满足——目标用户是系统用户,向导状态为未完成
- 发起激活:应用以自身身份调用设置设备所有者的接口,一次成功
- 恢复原状:随后把设置里的值恢复成"已完成",内存副本一并恢复
第 5 步是必须的,且执行时机很紧——成功拿到 DO 后立刻回滚,把设备状态还原成正常。
过程中的实际影响
在设置处于"未完成"的那几秒里,系统会认为设备还没完成初始化,表现是:
| 行为 | 状态 |
|---|---|
| Home 键 | 被按住(不响应) |
| 最近任务键 | 被按住(不响应) |
| 返回键 | 正常 |
| 手势导航 | 正常 |
值恢复成"已完成"后,按键行为立即恢复正常,不需要重启,不需要重新登录,也不会留下任何需要手动清理的状态。
实际操作时建议:这几秒内不要锁屏、不要切后台、不要拔电源,等提示成功后再操作设备。
账号数据的安全性
这是本方案与"删账号"方案最本质的区别:
- 不删除账号
- 不退出登录
- 不清除账户数据
- 系统里保存的账号从头到尾没有被读写过
整条链路里,没有任何一步涉及账号数据库。所谓"必须删账号"的限制,在这条调用通道上压根不存在。
前提条件
| 项目 | 要求 |
|---|---|
| Android 版本 | 13 及以上 |
| 提权通道 | 已激活 Shizuku(提供 shell 身份) |
| 设备状态 | 未激活过 DO / PO / DP |
| 账号 | 无要求,登录状态不影响 |
实测情况
该方案已实装在 AxManagerD 中。多名 Android 13 以上的测试人员均测试成功,激活过程中账号保持登录、数据完整无损。
排查思路
如果激活没有成功,按链路顺序定位:
第 1 步失败(设置写不进去) shell 身份没拿到,或 Shizuku 授权未生效。检查 Shizuku 状态、AxManagerD 是否已获得 Shizuku 权限。
第 2 步后仍报"已有账号" 说明调用实际落在了 ADB 通道上,而不是应用自身身份。检查调用方身份,确认是由应用内部发起的调用,而不是通过 adb shell 或外部终端转发。
第 4 步报 already has a device owner 设备上已有 DO 残留,需要先清除旧的绑定,再重新走链路。
第 4 步报 Unknown admin AdminReceiver 组件名不匹配,确认应用里声明的 receiver 与调用时传入的组件一致。
激活后按键仍异常 第 5 步回滚没有执行到位。重新同步一次状态,或重启设备让内存副本重新初始化。
安全提示
- DO 是设备级最高权限,激活后应用可执行恢复出厂、强制锁屏、禁用相机等操作,请确认应用来源可信。
- 本方案依赖系统内部的状态缓存行为,不同 ROM 实现可能存在差异,升级系统后需重新验证。
- 不要在设置处于"未完成"状态时中断流程,务必让回滚步骤执行完毕。