Android执行shell命令
一、方法
- /**
- * 执行一个shell命令,并返回字符串值
- *
- * @param cmd
- * 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"})
- * @param workdirectory
- * 命令执行路径(例如:"system/bin/")
- * @return 执行结果组成的字符串
- * @throws IOException
- */
- public static synchronized String run(String[] cmd, String workdirectory)
- throws IOException {
- StringBuffer result = new StringBuffer();
- try {
- // 创建操作系统进程(也可以由Runtime.exec()启动)
- // Runtime runtime = Runtime.getRuntime();
- // Process proc = runtime.exec(cmd);
- // InputStream inputstream = proc.getInputStream();
- ProcessBuilder builder = new ProcessBuilder(cmd);
- InputStream in = null;
- // 设置一个路径(绝对路径了就不一定需要)
- if (workdirectory != null) {
- // 设置工作目录(同上)
- builder.directory(new File(workdirectory));
- // 合并标准错误和标准输出
- builder.redirectErrorStream(true);
- // 启动一个新进程
- Process process = builder.start();
- // 读取进程标准输出流
- in = process.getInputStream();
- byte[] re = new byte[1024];
- while (in.read(re) != -1) {
- result = result.append(new String(re));
- }
- }
- // 关闭输入流
- if (in != null) {
- in.close();
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return result.toString();
- }
二、用途
执行Linux下的top、ps等命令,这些命令你也通过adb可以执行查看效果。
1)top命令如下:
- adb shell
- $ top -h
- top -h
- Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
- -m num Maximum number of processes to display. // 最多显示多少个进程
- -n num Updates to show before exiting. // 刷新次数
- -d num Seconds to wait between updates. // 刷新间隔时间(默认5秒)
- -s col Column to sort by <cpu,vss,rss,thr> // 按哪列排序
- -t Show threads instead of processes. // 显示线程信息而不是进程
- -h Display this help screen. // 显示帮助文档
- $ top -n 1
- top -n 1
就不把执行效果放上来了,总之结果表述如下:
- User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
- User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情况
- PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
- xx xx% x xx xx xx xx xx xx
- CPU占用率:
- User 用户进程
- System 系统进程
- IOW IO等待时间
- IRQ 硬中断时间
- CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数):
- User 处于用户态的运行时间,不包含优先值为负进程
- Nice 优先值为负的进程所占用的CPU时间
- Sys 处于核心态的运行时间
- Idle 除IO等待时间以外的其它等待时间
- IOW IO等待时间
- IRQ 硬中断时间
- SIRQ 软中断时间
- 进程属性:
- PID 进程在系统中的ID
- CPU% 当前瞬时所以使用CPU占用率
- S 进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
- #THR 程序当前所用的线程数
- VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PCY OOXX,不知道什么东东
- UID 运行当前进程的用户id
- Name 程序名称android.process.media
- // ps:内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
- // PSS Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- // USS Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
在附件Android系统->android top.txt文件内,自个总结的。
2)执行代码
- // top命令
- public static final String[] TOP = { "/system/bin/top", "-n", "1" };
- // 现在执行top -n 1,我们只需要第二行(用第二行求得CPU占用率,精确数据)
- // 第一行:User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
- // 第二行:User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306
- // // CPU使用情况
- public static synchronized String run(String[] cmd) {
- String line = "";
- InputStream is = null;
- try {
- Runtime runtime = Runtime.getRuntime();
- Process proc = runtime.exec(cmd);
- is = proc.getInputStream();
- // 换成BufferedReader
- BufferedReader buf = new BufferedReader(new InputStreamReader(is));
- do {
- line = buf.readLine();
- // 前面有几个空行
- if (line.startsWith("User")) {
- // 读到第一行时,我们再读取下一行
- line = buf.readLine();
- break;
- }
- } while (true);
- if (is != null) {
- buf.close();
- is.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return line;
- }
- // 获取指定应用的top命令获取的信息
- // PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
- // 如果当前应用不在运行则返回null
- public static synchronized String run(String[] cmd, String pkgName) {
- String line = null;
- InputStream is = null;
- try {
- Runtime runtime = Runtime.getRuntime();
- Process proc = runtime.exec(cmd);
- is = proc.getInputStream();
- // 换成BufferedReader
- BufferedReader buf = new BufferedReader(new InputStreamReader(is));
- do {
- line = buf.readLine();
- // 读取到相应pkgName跳出循环(或者未找到)
- if (null == line || line.endsWith(pkgName)) {
- break;
- }
- } while (true);
- if (is != null) {
- buf.close();
- is.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return line;
- }
三、后记
这次相关的仅有的那个工程好像不能放上来了==。
好吧,把我当时整理的一点点相关资料放附件了:包含《Android系统》文件夹和《深入研究java.lang.ProcessBuilder类.doc》。
文件夹内容如下:
相关推荐
本单元实现了一个伪的Shell,可以用于在Android程序中执行Shell命令,如果需要Root权限,则在执行前,调用AskForRoot方法来获取用户的Root授权,如果不再需要在Root账号下执行命令,则调用ExitRoot方法来退出Root...
在Android平台上,有时候开发者需要超越普通应用程序的权限范围,例如执行系统级别的操作,这就涉及到给APP授权和执行Shell命令。Android系统默认是以安全为优先,不允许应用无限制地执行shell命令,但通过获取Root...
本文将详细介绍如何在Android设备上执行shell命令以及相关知识点。 首先,Android提供了多种方式来执行shell命令: 1. **ADB (Android Debug Bridge)**:这是Android开发者最常用的工具之一,它允许开发者通过USB...
本文将深入探讨如何使用JNI在Android中执行shell命令。 首先,理解JNI的工作原理是必要的。JNI接口为Java应用程序提供了一个桥梁,使其可以直接调用本地(非Java)代码,通常是C/C++编写的库。这涉及到创建一个本地...
ExecuteShell是一个专为Android开发者设计的开源库,它使得在Android应用程序中执行shell命令变得轻而易举。在Android系统中,有时我们需要执行一些低级的操作,如文件管理、系统调试或者权限控制,这时就需要借助...
ADB是Android开发者用于调试应用程序、传输文件、执行shell命令等的桥梁。通过USB连接或Wi-Fi,开发者可以在电脑上控制Android设备,执行如安装APK、查看设备状态、获取logcat日志等操作。 当需要在Android应用程序...
本文将详细介绍如何在Android应用中使用JNI来执行shell命令。 首先,我们需要理解JNI的概念。JNI是Java平台提供的一种机制,它允许Java代码和其他语言写的代码进行交互。通过JNI,我们可以在Java应用程序中调用C/...
Android Native Execution Demo项目(可能对应压缩包中的`android-native-exe-demo-master (copy)`)提供了一个C/C++库,用于在原生层执行shell命令。这个库通常会通过JNI(Java Native Interface)与Java层的应用...
本教程将深入讲解如何在Android应用中通过Java代码执行shell命令,以提升应用的功能和效率。 一、Android与Shell命令 Android系统基于Linux内核,因此支持使用Linux命令行工具,即shell命令。这些命令提供了对系统...
Android 系统或 Android 应用执行 shell 脚本的方法 Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等...
下面将详细介绍如何使用Android的Shell命令来设置静态IP。 首先,你需要获得设备的root权限,因为更改网络设置通常需要超级用户权限。如果你的设备已经root,可以继续以下步骤;如果没有,需要先获取root权限。 1....
`Runtime.getRuntime().exec()`方法可以用来执行shell命令,但需要注意的是,执行命令前必须确保应用已经获得了相应的系统权限,这可以通过在AndroidManifest.xml中声明`<uses-permission>`标签来实现。 例如,如果...
总结来说,Android执行shell命令是与系统底层交互的重要手段,它能帮助开发者获取系统状态、进行系统控制和调试,但同时也需要注意安全性和权限管理。理解如何正确、安全地使用shell命令对于Android开发来说是不可或...
android shell命令工具类,可以执行单个命令 多个命令
一个用于在Android开发中 执行adb shell命令的类,可以以最高权限(su)执行。例如mount命令等
ADB(Android Debug Bridge)是Google提供的一个强大的工具,它允许开发者通过命令行与Android设备进行通信,包括安装APK、传输文件、执行Shell命令等。在本教程中,我们将深入探讨如何在Android上执行ADB shell指令...
### Android中的Shell命令浅析 #### 一、引言 在Android开发过程中,熟练掌握shell命令对于调试和管理Android应用程序至关重要。本文将详细介绍Android中常用的shell命令及其应用场景,并针对可能出现的问题提供...