Android 17 米币支付“由 shell 所管理”状态的双向控制:挂起与恢复
摘要
本文记录一次 Android 17 设备上米币支付报错“米币支付目前无法使用。该应用是由 shell 所管理”的完整排查与解决过程,并进一步给出反向操作:如何再次将米币支付及相关组件恢复为“由 shell 所管理”的挂起状态。文章涵盖 Android 挂起(suspend)机制、pm suspend 与 pm unsuspend 的用法、pm disable-user 与挂起的区别,以及 installer=null 的实际含义,供遇到同类问题的开发者与高级用户参考。
环境
系统:Android 17
设备:Xiaomi 系列
终端:系统内置 Linux 终端(
com.android.virtualization.terminal)可能涉及工具:Shizuku、Scene、小黑屋等应用管理/冻结工具
相关包:
com.xiaomi.paymentcom.mipay.walletcom.xiaomi.miscom.xiaomi.minigame
问题现象
打开米币支付或在小游戏等场景调用米币支付时,提示:
米币支付目前无法使用。该应用是由 shell 所管理。
支付流程中断,无法完成。
排查过程
1. 排除应用被禁用
首先检查是否有支付相关包被 disable-user 禁用:
pm list packages -d
输出仅包含系统组件:
package:com.qualcomm.qti.services.systemhelper package:com.android.virtualization.terminal package:com.android.devicelockcontroller
没有小米支付/钱包相关包。说明问题不是“禁用”,而是其他管控状态。
2. 检查安装器来源
执行:
pm list packages -i | grep -i -E "mipay|payment|wallet|xiaomi.mi"
输出中相关包均为:
package:com.xiaomi.payment installer=null package:com.mipay.wallet installer=null package:com.xiaomi.mis installer=null package:com.xiaomi.minigame installer=null
installer=null 表示这些包并非通过常规应用商店安装,常见于系统预装或 ADB 侧载。它本身并不等同于“由 shell 管理”,因此排除安装器是直接原因。
3. 定位挂起状态
Android 中除了“禁用”外,还有“挂起”(suspend)。挂起不会出现在 pm list packages -d 中。对相关包逐个执行解除挂起命令:
pm unsuspend --user 0 com.xiaomi.minigame pm unsuspend --user 0 com.xiaomi.mis pm unsuspend --user 0 com.mipay.wallet pm unsuspend --user 0 com.xiaomi.payment
输出均为:
Package com.xiaomi.minigame new suspended state: false Package com.xiaomi.mis new suspended state: false Package com.mipay.wallet new suspended state: false Package com.xiaomi.payment new suspended state: false
new suspended state: false 说明这些包此前确实处于挂起状态,现已成功解除。
4. 重启验证
解除挂起后重启设备,再次打开米币支付,报错消失,支付功能恢复正常。
根因分析
问题本质是 Android 的应用挂起机制与支付安全检测共同作用的结果。
Shizuku、Scene、小黑屋等工具通常以 shell 身份运行,通过 pm suspend 将应用置于挂起状态。挂起后,系统会记录挂起者信息,通常为 com.android.shell。米币支付在启动或支付时检测到自身或依赖组件(如 com.mipay.wallet、com.xiaomi.mis)被 shell 挂起,判定运行环境不可信,从而拒绝提供服务,并提示“由 shell 所管理”。
关键点:
pm suspend是挂起,不是禁用;pm list packages -d只能看到禁用包,看不到挂起包;挂起状态会留下
suspendingPackage=com.android.shell标记;支付类应用对此类标记非常敏感。
解决方案:解除挂起,恢复米币支付
标准恢复步骤
在具备 shell 权限的终端中执行:
pm unsuspend --user 0 <包名>
对多个相关包可批量执行:
for pkg in com.xiaomi.payment com.mipay.wallet com.xiaomi.mis com.xiaomi.minigame; do pm unsuspend --user 0 $pkg done
如果同时存在禁用状态,可补充:
pm enable --user 0 <包名>
必要时重置 AppOps:
cmd appops reset <包名>
最后重启设备。
权限说明
在电脑端使用:
adb shell pm unsuspend --user 0 <包名>使用 Shizuku 时:先进入
rish,再执行pm unsuspend ...在手机本地终端直接执行时,终端必须已获得 shell 权限;否则会提示
Permission Denial注意:手机本地 shell 中不存在
adb命令,adb shell只能在电脑端使用
验证命令
pm list packages -i | grep -E "mipay|payment|wallet" dumpsys package com.xiaomi.payment | grep -i suspend
若 dumpsys 中不再出现 suspended=true 或 suspendingPackage=com.android.shell,说明已恢复。
反向操作:重新将米币支付置为“由 shell 所管理”
如果希望再次让米币支付显示“由 shell 所管理”,核心是让它再次被系统挂起(suspend)。这与你之前解除挂起的操作正好相反,现在需要执行 pm suspend 命令。
核心命令
在你之前使用的手机终端(hongkong:/ $)或电脑 ADB 中,执行以下命令即可将米币支付及其相关组件重新置于“由 shell 管理”的挂起状态:
pm suspend --user 0 com.xiaomi.payment pm suspend --user 0 com.mipay.wallet pm suspend --user 0 com.xiaomi.mis pm suspend --user 0 com.xiaomi.minigame
pm suspend 是 Android 系统提供的标准命令,用于通过 shell 身份挂起应用。命令执行后,应用会保留在桌面和设置中,但无法正常启动或交互,系统会记录其挂起状态,并标记为 suspendingPackage=com.android.shell,这正是“由 shell 所管理”提示的来源。
如果使用 Shizuku,也可以在其终端(rish)中执行相同命令。
批量挂起
for pkg in com.xiaomi.payment com.mipay.wallet com.xiaomi.mis com.xiaomi.minigame; do pm suspend --user 0 $pkg done
验证挂起状态
执行完成后,可以通过以下命令确认是否已成功挂起:
dumpsys package com.xiaomi.payment | grep -i suspend
如果输出中包含 suspended=true 或 suspendingPackage=com.android.shell,就说明已成功恢复为“由 shell 所管理”的状态。
再次恢复支付
挂起后,米币支付会再次报错“由 shell 所管理”。如果之后想恢复正常,只需执行之前用过的解除命令即可:
pm unsuspend --user 0 com.xiaomi.payment
以此类推,对其他几个包执行相同操作,然后重启设备。
注意事项
挂起会影响应用功能:被挂起的应用将无法启动或响应,因此执行
pm suspend后,米币支付将无法使用,直到你再次执行pm unsuspend解除。建议重启验证:和解除挂起一样,挂起操作后也建议重启设备,以确保状态完全生效。
操作权限:在手机本地终端执行需要 shell 权限;如果提示
Permission Denial,请改用电脑 ADB 或 Shizuku 的rish环境执行。避免误操作:支付类应用被挂起后可能影响其他依赖组件,建议仅在测试或明确需要时执行。
状态切换命令速查
解除挂起(恢复正常支付):
pm unsuspend --user 0 <包名>
重新挂起(显示“由 shell 所管理”):
pm suspend --user 0 <包名>
查看挂起状态:
dumpsys package <包名> | grep -i suspend
查看禁用状态:
pm list packages -d
经验总结
区分禁用与挂起:
pm list packages -d查禁用,pm unsuspend解挂起。两者机制不同,排查时不能只查禁用。installer=null不等于 shell 管理:侧载或预装包常见installer=null,不应作为直接判断依据。支付类应用避免冻结/挂起:米币支付、小米钱包等对运行环境敏感,使用 Shizuku/Scene/小黑屋时不要将它们加入冻结或挂起列表。
检查 Shizuku 托管列表:若 Shizuku 在 Android 17 上出现托管列表异常,可尝试重启 Shizuku 或更换兼容版本。
恢复后重启:挂起状态可能有残留,重启后验证最可靠。
安装来源尽量走官方商店:若问题反复,可卸载后从小米应用商店重装,使
installer变为com.xiaomi.market,同时重置管控状态。挂起与解除可双向切换:
pm suspend与pm unsuspend是一对反向命令,可在需要时灵活控制应用状态。
结论
“米币支付目前无法使用。该应用是由 shell 所管理”并非 Android 17 系统缺陷,而是应用被以 shell 身份挂起后触发的安全拦截。通过 pm unsuspend --user 0 <包名> 解除挂起并重启设备即可恢复支付;反之,通过 pm suspend --user 0 <包名> 可再次将应用置为“由 shell 所管理”的挂起状态。理解 Android 的 suspend 机制与 shell 管理标记,有助于快速定位并灵活控制同类支付、银行、安全类应用的行为。
转载请注明出处。