android执行shell脚本

8人阅读 评论(0) 收藏 举报

在做Android应用时,经常需要执行shell脚本,以快速实现某些功能;

在Android应用程序中执行shell脚本可以省去一大堆繁琐的代码,还可以避免不必要的错误;

比如:拷贝文件夹时,可以执行shell命令中的 cp 命令达到目的;而在代码中实现拷贝文件夹时,不仅需要编写一大堆繁琐的代码,还容易陷入递归死循环的错误中;

比如:获取文件系统的读写权限,只需要执行shell脚本中一句 mount -o rw,remount / 就能轻松搞定;

比如:删除文件夹下某一个文件、或者某一类文件、或者全部文件,只需要执行shell脚本中的一句 rm -f  *(利用*通配符进行匹配) 就能轻松搞定;

再比如:静默安装时,只需要执行shell脚本中一句 pm install -r 便可达到目的;

如果这些都用代码来实现,不仅代码量增加,还容易造成很多bug,吃力不讨好!


如果能在android应用中执行shell脚本来达到目的,可以省去一大堆代码,避免很多易犯的错误,简洁高效,何乐而不为呢?!


下面给出一个在Android应用中执行shell脚本的工具类的示例,供大家参考:

[java] view plain copy
  1. package com.example.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStreamReader;  
  7.   
  8. import android.util.Log;  
  9.   
  10. /** 
  11.  * 执行shell脚本工具类 
  12.  * @author Mountain 
  13.  * 
  14.  */  
  15. public class CommandExecution {  
  16.   
  17.     public static final String TAG = "CommandExecution";  
  18.       
  19.     public final static String COMMAND_SU       = "su";  
  20.     public final static String COMMAND_SH       = "sh";  
  21.     public final static String COMMAND_EXIT     = "exit\n";  
  22.     public final static String COMMAND_LINE_END = "\n";  
  23.   
  24.     /** 
  25.      * Command执行结果 
  26.      * @author Mountain 
  27.      * 
  28.      */  
  29.     public static class CommandResult {  
  30.         public int result = -1;  
  31.         public String errorMsg;  
  32.         public String successMsg;  
  33.     }  
  34.   
  35.     /** 
  36.      * 执行命令—单条 
  37.      * @param command 
  38.      * @param isRoot 
  39.      * @return 
  40.      */  
  41.     public static CommandResult execCommand(String command, boolean isRoot) {  
  42.         String[] commands = {command};  
  43.         return execCommand(commands, isRoot);  
  44.     }  
  45.   
  46.     /** 
  47.      * 执行命令-多条 
  48.      * @param commands 
  49.      * @param isRoot 
  50.      * @return 
  51.      */  
  52.     public static CommandResult execCommand(String[] commands, boolean isRoot) {  
  53.         CommandResult commandResult = new CommandResult();  
  54.         if (commands == null || commands.length == 0return commandResult;  
  55.         Process process = null;  
  56.         DataOutputStream os = null;  
  57.         BufferedReader successResult = null;  
  58.         BufferedReader errorResult = null;  
  59.         StringBuilder successMsg = null;  
  60.         StringBuilder errorMsg = null;  
  61.         try {  
  62.             process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);  
  63.             os = new DataOutputStream(process.getOutputStream());  
  64.             for (String command : commands) {  
  65.                 if (command != null) {  
  66.                     os.write(command.getBytes());  
  67.                     os.writeBytes(COMMAND_LINE_END);  
  68.                     os.flush();  
  69.                 }  
  70.             }  
  71.             os.writeBytes(COMMAND_EXIT);  
  72.             os.flush();  
  73.             commandResult.result = process.waitFor();  
  74.             //获取错误信息  
  75.             successMsg = new StringBuilder();  
  76.             errorMsg = new StringBuilder();  
  77.             successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));  
  78.             errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));  
  79.             String s;  
  80.             while ((s = successResult.readLine()) != null) successMsg.append(s);  
  81.             while ((s = errorResult.readLine()) != null) errorMsg.append(s);  
  82.             commandResult.successMsg = successMsg.toString();  
  83.             commandResult.errorMsg = errorMsg.toString();  
  84.             Log.i(TAG, commandResult.result + " | " + commandResult.successMsg  
  85.                     + " | " + commandResult.errorMsg);  
  86.         } catch (IOException e) {  
  87.             String errmsg = e.getMessage();  
  88.             if (errmsg != null) {  
  89.                 Log.e(TAG, errmsg);  
  90.             } else {  
  91.                 e.printStackTrace();  
  92.             }  
  93.         } catch (Exception e) {  
  94.             String errmsg = e.getMessage();  
  95.             if (errmsg != null) {  
  96.                 Log.e(TAG, errmsg);  
  97.             } else {  
  98.                 e.printStackTrace();  
  99.             }  
  100.         } finally {  
  101.             try {  
  102.                 if (os != null) os.close();  
  103.                 if (successResult != null) successResult.close();  
  104.                 if (errorResult != null) errorResult.close();  
  105.             } catch (IOException e) {  
  106.                 String errmsg = e.getMessage();  
  107.                 if (errmsg != null) {  
  108.                     Log.e(TAG, errmsg);  
  109.                 } else {  
  110.                     e.printStackTrace();  
  111.                 }  
  112.             }  
  113.             if (process != null) process.destroy();  
  114.         }  
  115.         return commandResult;  
  116.     }  
  117.       
  118. }  
查看评论

在Android app中调用shell脚本

本文的Demo源代码已在新浪微盘发布:Hi,推荐文件给你 "ShellProject.zip"http://vdisk.weibo.com/s/mg606 新浪分享也已上传,http://ish...
  • qq_22266217
  • qq_22266217
  • 2016-09-09 11:42:41
  • 1142

如何让Android系统或Android应用执行shell脚本

  • 2012年12月13日 10:00
  • 216KB
  • 下载

android apk执行shell脚本

修改AndroidManifest.xml文件,在其manifest节点中添加android:sharedUserId="android.uid.system" ,表示apk和系统拥有相同的uid,可...
  • jethai
  • jethai
  • 2016-08-27 18:17:38
  • 1898

[init.rc] android开机过程执行shell脚本

1、在system/core/rootdir/etc/下添加脚本文件,命名为myshell.sh,脚本内容可如下         #! /system/bin/sh 2、修改system/core...
  • muojie
  • muojie
  • 2012-09-05 19:44:37
  • 4340

android应用程序执行shell脚本命令

急问android应用程序如何执行shell脚本命令 跪求大神指点~! 小菜在做一个android应用程序,需要执行系统调用命令,然后我考虑将命令写在.sh脚本里,直接调用脚本执行。 但是调用一...
  • yun90
  • yun90
  • 2014-06-16 15:51:24
  • 3007

Android程序中如何执行shell脚本

在做Android应用时,经常需要执行shell脚本,以快速实现某些功能; 在Android应用程序中执行shell脚本可以省去一大堆繁琐的代码,还可以避免不必要的错误; 比如:拷贝文件夹时,可以执行...
  • sowhat_Ah
  • sowhat_Ah
  • 2015-01-28 12:30:11
  • 30796

在android程序中调用shell命令与脚本

最近做android的一个功能就是调用shell命令来进行一些系统级别的操作,比如说是关机开机之类的,现在总结一下具体的用法以及遇到的坑(基于我所用到的,没用到的我就不说了) (1) Ru...
  • u012457196
  • u012457196
  • 2015-01-02 22:49:52
  • 10907

Android调用shell脚本并获得输出

前段时间做的HLS流媒体服务器可以正常工作了,但是它的启动需要在PC机命令行中进行或者在Android下载个Terminal IDE软件,在Android上使用命令行运行,这也不是很方便,于是我要做一...
  • xdwyyan
  • xdwyyan
  • 2015-03-20 16:03:49
  • 2531

android C 中调用SHELL脚本

最近在调试4.2的代码发现需要在lunx中所以需要自己想办法修改, 于是想到了 在C中调用脚本 脚本: check_voice_value.sh #!/system/bin/sh ...
  • BENKG
  • BENKG
  • 2013-12-18 10:37:14
  • 962

android开发笔记之sh脚本

sh脚本开头#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。执行sh脚本当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 ...
  • hfreeman2008
  • hfreeman2008
  • 2016-05-15 11:02:44
  • 6051
    个人资料
    等级:
    访问量: 6116
    积分: 283
    排名: 27万+
    文章分类
    最新评论