`
seya
  • 浏览: 361402 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Android执行 shell command

 
阅读更多
Android执行shell命令
一、方法

   1. /**
   2. * 执行一个shell命令,并返回字符串值
   3. *
   4. * @param cmd
   5. * 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"})
   6. * @param workdirectory
   7. * 命令执行路径(例如:"system/bin/")
   8. * @return 执行结果组成的字符串
   9. * @throws IOException
  10. */
  11. public static synchronized String run(String[] cmd, String workdirectory)
  12.         throws IOException {
  13.     StringBuffer result = new StringBuffer();
  14.     try {
  15.         // 创建操作系统进程(也可以由Runtime.exec()启动)
  16.         // Runtime runtime = Runtime.getRuntime();
  17.         // Process proc = runtime.exec(cmd);
  18.         // InputStream inputstream = proc.getInputStream();
  19.         ProcessBuilder builder = new ProcessBuilder(cmd);
  20. 
  21.         InputStream in = null;
  22.         // 设置一个路径(绝对路径了就不一定需要)
  23.         if (workdirectory != null) {
  24.             // 设置工作目录(同上)
  25.             builder.directory(new File(workdirectory));
  26.             // 合并标准错误和标准输出
  27.             builder.redirectErrorStream(true);
  28.             // 启动一个新进程
  29.             Process process = builder.start();
  30. 
  31.             // 读取进程标准输出流
  32.             in = process.getInputStream();
  33.             byte[] re = new byte[1024];
  34.             while (in.read(re) != -1) {
  35.                 result = result.append(new String(re));
  36.             }
  37.         }
  38.         // 关闭输入流
  39.         if (in != null) {
  40.             in.close();
  41.         }
  42.     } catch (Exception ex) {
  43.         ex.printStackTrace();
  44.     }
  45.     return result.toString();
  46. }


二、用途
         执行Linux下的top、ps等命令,这些命令你也通过adb可以执行查看效果。
         1)top命令如下:

   1. adb shell
   2. $ top -h
   3. top -h
   4. Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
   5.   -m num  Maximum number of processes to display. // 最多显示多少个进程
   6.   -n num  Updates to show before exiting. // 刷新次数
   7.   -d num  Seconds to wait between updates. // 刷新间隔时间(默认5秒)
   8.   -s col  Column to sort by <cpu,vss,rss,thr> // 按哪列排序
   9.   -t      Show threads instead of processes. // 显示线程信息而不是进程
  10.   -h      Display this help screen. // 显示帮助文档
  11. $ top -n 1
  12. top -n 1


         就不把执行效果放上来了,总之结果表述如下:

   1. User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
   2. User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情况
   3. 
   4. PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
   5. xx  xx% x   xx  xx  xx  xx  xx   xx
   6. 
   7. CPU占用率:
   8. User    用户进程
   9. System  系统进程
  10. IOW IO等待时间
  11. IRQ 硬中断时间
  12. 
  13. CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数):
  14. User    处于用户态的运行时间,不包含优先值为负进程
  15. Nice    优先值为负的进程所占用的CPU时间
  16. Sys 处于核心态的运行时间
  17. Idle    除IO等待时间以外的其它等待时间
  18. IOW IO等待时间
  19. IRQ 硬中断时间
  20. SIRQ    软中断时间
  21. 
  22. 进程属性:
  23. PID 进程在系统中的ID
  24. CPU%    当前瞬时所以使用CPU占用率
  25. S   进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
  26. #THR    程序当前所用的线程数
  27. VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  28. RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  29. PCY OOXX,不知道什么东东
  30. UID 运行当前进程的用户id
  31. Name    程序名称android.process.media
  32. 
  33. // ps:内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
  34. // PSS  Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  35. // USS  Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

         在附件Android系统->android top.txt文件内,自个总结的。
         2)执行代码

   1. // top命令
   2. public static final String[] TOP = { "/system/bin/top", "-n", "1" };
   3. 
   4. // 现在执行top -n 1,我们只需要第二行(用第二行求得CPU占用率,精确数据)
   5. // 第一行:User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
   6. // 第二行:User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306
   7. // // CPU使用情况
   8. public static synchronized String run(String[] cmd) {
   9.     String line = "";
  10.     InputStream is = null;
  11.     try {
  12.         Runtime runtime = Runtime.getRuntime();
  13.         Process proc = runtime.exec(cmd);
  14.         is = proc.getInputStream();
  15. 
  16.         // 换成BufferedReader
  17.         BufferedReader buf = new BufferedReader(new InputStreamReader(is));
  18.         do {
  19.             line = buf.readLine();
  20.             // 前面有几个空行
  21.             if (line.startsWith("User")) {
  22.                 // 读到第一行时,我们再读取下一行
  23.                 line = buf.readLine();
  24.                 break;
  25.             }
  26.         } while (true);
  27. 
  28.         if (is != null) {
  29.             buf.close();
  30.             is.close();
  31.         }
  32.     } catch (IOException e) {
  33.         e.printStackTrace();
  34.     }
  35.     return line;
  36. }
  37. 
  38. // 获取指定应用的top命令获取的信息
  39. // PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
  40. // 如果当前应用不在运行则返回null
  41. public static synchronized String run(String[] cmd, String pkgName) {
  42.     String line = null;
  43.     InputStream is = null;
  44.     try {
  45.         Runtime runtime = Runtime.getRuntime();
  46.         Process proc = runtime.exec(cmd);
  47.         is = proc.getInputStream();
  48. 
  49.         // 换成BufferedReader
  50.         BufferedReader buf = new BufferedReader(new InputStreamReader(is));
  51.         do {
  52.             line = buf.readLine();
  53.             // 读取到相应pkgName跳出循环(或者未找到)
  54.             if (null == line || line.endsWith(pkgName)) {
  55.                 break;
  56.             }
  57.         } while (true);
  58. 
  59.         if (is != null) {
  60.             buf.close();
  61.             is.close();
  62.         }
  63.     } catch (IOException e) {
  64.         e.printStackTrace();
  65.     }
  66.     return line;
  67. }

--------------------------------------------
PID:进程在系统中的ID

CPU% - 当前瞬时所以使用CPU占用率

#THR - 程序当前所用的线程数

UID - 运行当前进程的用户id

Name - 程序名称org.xmpp.app

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
分享到:
评论

相关推荐

    Android-ExecuteShell是一个可以方便的执行shell命令的Android开源库

    ExecuteShell是一个专为Android开发者设计的开源库,它使得在Android应用程序中执行shell命令变得轻而易举。在Android系统中,有时我们需要执行一些低级的操作,如文件管理、系统调试或者权限控制,这时就需要借助...

    Android执行shell命令(转)

    总之,Android执行shell命令是开发、调试和维护Android设备的重要手段。熟练掌握这些技巧,能够提高开发效率,解决一些常规方法无法处理的问题。然而,由于Android的安全机制,某些操作可能需要root权限,使用时请...

    android 给app授权 执行shell命令

    在Android平台上,有时候开发者需要超越普通应用程序的权限范围,例如执行系统级别的操作,这就涉及到给APP授权和执行Shell命令。Android系统默认是以安全为优先,不允许应用无限制地执行shell命令,但通过获取Root...

    android通过jni执行shell命令

    本文将深入探讨如何使用JNI在Android中执行shell命令。 首先,理解JNI的工作原理是必要的。JNI接口为Java应用程序提供了一个桥梁,使其可以直接调用本地(非Java)代码,通常是C/C++编写的库。这涉及到创建一个本地...

    android执行adb shell命令源码

    Android Native Execution Demo项目(可能对应压缩包中的`android-native-exe-demo-master (copy)`)提供了一个C/C++库,用于在原生层执行shell命令。这个库通常会通过JNI(Java Native Interface)与Java层的应用...

    andorid使用jni执行shell命令例子

    本文将详细介绍如何在Android应用中使用JNI来执行shell命令。 首先,我们需要理解JNI的概念。JNI是Java平台提供的一种机制,它允许Java代码和其他语言写的代码进行交互。通过JNI,我们可以在Java应用程序中调用C/...

    Android程序中(APK程序)执行Adb shell 命令

    ADB是Android开发者用于调试应用程序、传输文件、执行shell命令等的桥梁。通过USB连接或Wi-Fi,开发者可以在电脑上控制Android设备,执行如安装APK、查看设备状态、获取logcat日志等操作。 当需要在Android应用程序...

    android执行shell指令

    在Android系统中,执行Shell指令是一项非常常见的任务,特别是在开发、调试和优化应用程序时。ADB(Android Debug Bridge)是Google提供的一个强大的工具,它允许开发者通过命令行与Android设备进行通信,包括安装...

    ShellUtils.java,Android adb shell执行类

    一个用于在Android开发中 执行adb shell命令的类,可以以最高权限(su)执行。例如mount命令等

    AdbShellCommand:在Android项目中执行adb Shell命令,通过java代码调用执行,采用MVP架构演示样例

    ##AdbShellCommand在Android项目中执行adb Shell命令,通过java代码调用执行,本程序采用MVP架构。###Java中执行adb shell命令本项目中,adb shell命令执行的实现方法主要参考网文()。文章中,把执行代码集成在...

    Android 如何执行shell脚本.doc

    Android 如何执行 shell 脚本 Android 操作系统中执行 shell 脚本是一项基本的技术,今天我们将一步步指导您如何在 Android 中执行 shell 脚本。 新建 shell 文件 首先,我们需要新建一个 shell 文件,例如 `x.sh...

    android emulator using command line

    ### 使用命令行操作Android模拟器:安装与卸载APK 在进行Android应用开发时,开发者经常需要在模拟器上测试应用。为了提高效率并减少手动操作,掌握如何通过命令行来安装或卸载APK是非常有用的技能。下面将详细介绍...

    android 执行系统命令

    `Runtime.getRuntime().exec()`方法可以用来执行shell命令,但需要注意的是,执行命令前必须确保应用已经获得了相应的系统权限,这可以通过在AndroidManifest.xml中声明`&lt;uses-permission&gt;`标签来实现。 例如,如果...

    android shell下调试wifi/bluetooth的工具iwlist/hciconfig

    在Android系统中,调试Wi-Fi和蓝牙功能时,开发者或技术人员经常会使用一系列命令行工具,这些工具可以在Android的shell环境中运行。本篇文章将详细介绍其中的四个关键工具:`iwlist`、`iwconfig`、`iwpriv`以及`...

    Android下用Exec执行linux命令的源代码

    Android下用Exec执行linux命令的源代码,还可以在应用中执行init.rc中服务,具体怎么执行服务的方法请见我博客的另一篇文章,上面有如何让Android应用启用init.rc中定义的服务的方法。

    Logcat及adb shell命令的bat脚本实现例子

    至于`进入shell后继续执行命令的方法.txt`,在`adb shell`中执行多条命令时,一般有两种方法:一是将所有命令写在同一行,用分号或逻辑运算符连接,如`command1; command2; command3`;二是编写一个shell脚本(如`...

    利用app_process实现免root调用shell_Java_下载.zip

    在Android系统中,由于安全性的考虑,普通应用通常无法直接执行shell命令,这给了一些开发者在特定场景下进行系统级操作的限制。然而,通过巧妙地利用`app_process`,可以实现在不获取root权限的情况下调用shell命令...

    android adb command

    7. **设备控制**:`adb shell`命令可以让你在设备上执行任意shell命令,比如重启设备`adb reboot`或进入恢复模式`adb reboot recovery`。 8. **屏幕截图和录屏**:`adb exec-out screencap -p &gt; screenshot.png`将...

    Android-Shell:在Android上执行Linux命令

    在android上执行Linux命令是一种高级方法,可用于访问手机中受限制的功能,例如,您无法直接从编程中获得这些功能; 录制屏幕,删除损坏的文件,获取系统信息,进程,硬件信息。 除非您拥有根设备,否则有些命令将不...

Global site tag (gtag.js) - Google Analytics