设为首页 收藏本站
查看: 1184|回复: 0

Android执行shell命令

[复制链接]

尚未签到

发表于 2018-8-16 12:57:46 | 显示全部楼层 |阅读模式
  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  // 按哪列排序
  •   -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》。
         文件夹内容如下:
DSC0000.png


         ps:现在有个可以看的小工程了,请移至《Android VNC Server New》!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-552697-1-1.html 上篇帖子: 【shell】Linux shell 之 打印99乘法表详解 下篇帖子: Shell一些例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表