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...
一个简单的应用 给app授予root权限并执行shell命令 急需又没资源的可以直接联系我 我会尽快回复你 或者qq邮箱
1. 这只是一个例子 2. 在android上执行一个shell命令 3. 在android平台上运行过没有问题。
1. android上调用jni 2. 在jni里c代码中调用系统shell 3. 执行shell命令 4. 返回android应用层
ExecuteShell 是一个可以让你在你的 Android 项目上方便快速使用 shell 指令的开源库
APK程序执行Adb shell 命令 shell与高级语言间的调用
android执行adb shell命令源码,亲测可用!
这是我自己测试使用的列子,主要用于测试android通过jni调用shell命令
Android中级篇之用JAVA代码执行shell命令
android adb shell 命令大全 1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): android create avd --name 名称 --...
让Android系统或Android应用执行shell脚本,方法一是:通过修改/system/init/init.c,在里面写入执行脚本的命令。方法二是:启动一个服务,让这个服务去执行脚本。
android shell命令工具类,可以执行单个命令 多个命令
本篇文章是对Android执行shell命令进行了详细的分析介绍,需要的朋友参考下
Android中级篇之用JAVA代码执行shell命令
一个用于在Android开发中 执行adb shell命令的类,可以以最高权限(su)执行。例如mount命令等
##AdbShellCommand在Android项目中执行adb Shell命令,通过java代码调用执行,本程序采用MVP架构。###Java中执行adb shell命令本项目中,adb shell命令执行的实现方法主要参考网文()。文章中,把执行代码集成在...
给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习
使用超级终端可实现在android端实现shell命令执行