You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Root设备上系统应用执行adb shell命令失败的问题排查

问题分析与解决方案

核心错误点

  1. 使用adb shell完全错误:adb是PC端的调试工具,安卓设备系统内不存在adb可执行文件,因此执行时触发的"Permission denied"实际是找不到文件的错误,系统误报为权限问题。
  2. ProcessBuilder参数格式错误:直接传入完整命令字符串(如"wm overscan -35,0,-55,0")时,系统会将整个字符串当作可执行文件路径查找,而非解析为"命令+参数"结构,自然无执行效果。

正确执行方式

方式1:直接执行wm命令(依赖系统权限)

将命令与参数拆分传入ProcessBuilder,让系统正确识别可执行文件和参数:

try {
    // 拆分命令:wm是可执行文件,overscan和-35,0,-55,0是独立参数
    Process process = new ProcessBuilder("wm", "overscan", "-35,0,-55,0").start();
    // 等待命令执行完成并获取退出码
    int exitCode = process.waitFor();
    
    if (exitCode == 0) {
        // 执行成功逻辑
    } else {
        // 读取错误信息排查问题
        BufferedReader errorReader = new BufferedReader(
            new InputStreamReader(process.getErrorStream())
        );
        StringBuilder errorMsg = new StringBuilder();
        String line;
        while ((line = errorReader.readLine()) != null) {
            errorMsg.append(line);
        }
        // 处理错误信息
    }
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}

需确保应用已获得WRITE_SECURE_SETTINGS权限,在Manifest中添加:

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

作为系统应用,该权限默认已授予,无需额外申请。

方式2:通过root权限执行(若直接执行权限不足)

如果上述方式仍提示权限问题,可借助su以root身份执行命令:

try {
    // su -c 后跟完整命令,让root身份执行wm命令
    Process process = new ProcessBuilder("su", "-c", "wm overscan -35,0,-55,0").start();
    int exitCode = process.waitFor();
    // 可读取输出/错误流判断执行结果
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}

关键说明

  • 安卓设备端执行系统命令,直接调用对应二进制文件(如/system/bin/wm)即可,无需通过adb shell中转。
  • ProcessBuilder必须将命令与参数拆分传入,否则系统无法正确解析执行逻辑。

内容的提问来源于stack exchange,提问作者Gennadii Ganenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:56:26