Root设备上系统应用执行adb shell命令失败的问题排查
问题分析与解决方案
核心错误点
- 使用
adb shell完全错误:adb是PC端的调试工具,安卓设备系统内不存在adb可执行文件,因此执行时触发的"Permission denied"实际是找不到文件的错误,系统误报为权限问题。 - 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
相关产品推荐
相关产品推荐

