在安卓开发中,执行系统命令是一项常见需求,通常用于与设备硬件交互、获取系统信息、安装应用或调试程序等场景,安卓基于Linux内核,因此开发者可以通过Java代码或命令行工具调用Linux Shell命令,本文将详细说明在安卓开发中执行命令的方法、注意事项及实际应用场景。

执行命令的核心方法
在安卓应用中执行系统命令主要通过Runtime
类或ProcessBuilder
类实现,两者均允许Java程序调用操作系统命令,以下是具体实现方式:
使用Runtime类
Runtime
类提供了exec()
方法来执行命令,该方法支持传入字符串数组或单个字符串,执行ls
命令列出文件:
try { Process process = Runtime.getRuntime().exec("ls /sdcard"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { Log.d("Command Output", line); } process.waitFor(); // 等待命令执行完成 } catch (Exception e) { e.printStackTrace(); }
注意事项:
- 直接执行字符串命令可能存在安全风险,建议使用数组形式(如
new String[]{"ls", "/sdcard"}
)避免Shell注入。 - 需处理命令的输入流(
InputStream
)和错误流(ErrorStream
),否则可能导致进程阻塞。
使用ProcessBuilder类
ProcessBuilder
提供了更灵活的进程管理方式,支持设置工作目录、环境变量等:

try { ProcessBuilder processBuilder = new ProcessBuilder("ls", "/sdcard"); processBuilder.directory(new File("/sdcard")); // 设置工作目录 Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { Log.d("Command Output", line); } int exitCode = process.waitFor(); // 获取退出码 Log.d("Exit Code", String.valueOf(exitCode)); } catch (Exception e) { e.printStackTrace(); }
优势:
- 支持链式调用,可配置进程属性。
- 通过
redirectErrorStream(true)
合并错误流到输入流,简化异常处理。
不同场景下的命令执行实践
获取设备信息
通过dumpsys
命令获取系统服务信息,例如获取内存使用情况:
Process process = Runtime.getRuntime().exec("dumpsys meminfo");
安装/卸载应用
使用pm
命令(需android.permission.INSTALL_PACKAGES
权限):
String installCmd = "pm install /sdcard/app.apk"; String uninstallCmd = "pm uninstall com.example.app";
Root权限执行
若需执行需要Root权限的命令(如reboot
),需通过su
切换用户:

Process process = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"});
注意:Root操作需设备已Root,且应用需申请android.permission.ACCESS_SUPERUSER
权限。
后台持续执行命令
对于需要长期运行的命令(如监控日志),可通过Runtime
启动后台进程:
Process process = Runtime.getRuntime().exec("logcat -v time");
命令执行中的常见问题与解决方案
问题现象 | 可能原因 | 解决方案 |
---|---|---|
进程阻塞 | 未及时读取输入流/错误流 | 使用单独线程处理InputStream 和ErrorStream |
命令无返回 | 权限不足或命令路径错误 | 检查权限,使用which 命令验证路径 |
中文乱码 | 流编码与系统编码不一致 | 指定编码(如InputStreamReader(process.getInputStream(), "UTF-8") ) |
Root失败 | 设备未Root或su 路径错误 |
检测Root状态,尝试/system/xbin/su 或/su/bin/su |
最佳实践
- 权限管理:在
AndroidManifest.xml
中声明必要权限(如android.permission.INTERNET
、android.permission.READ_EXTERNAL_STORAGE
)。 - 异常处理:捕获
IOException
和InterruptedException
,避免应用崩溃。 - 线程安全:耗时命令应在子线程中执行,避免阻塞主线程。
- 日志清理:及时关闭
BufferedReader
和Process
,防止资源泄漏。
相关问答FAQs
问题1:为什么执行adb shell
命令时提示“权限拒绝”?
解答:这通常是因为应用未获取相应权限,访问/system
目录需要android.permission.READ_EXTERNAL_STORAGE
,而执行reboot
等系统级命令需Root权限,需检查AndroidManifest.xml
中的权限声明,并确保设备已Root(如适用)。
问题2:如何确保命令执行后正确释放资源?
解答:在try-catch-finally
块中关闭流和进程。
BufferedReader reader = null; Process process = null; try { process = Runtime.getRuntime().exec("ls"); reader = new BufferedReader(new InputStreamReader(process.getInputStream())); // 处理输出 } catch (Exception e) { e.printStackTrace(); } finally { if (reader != null) reader.close(); if (process != null) process.destroy(); }
通过主动释放资源,避免内存泄漏和进程残留。