引言

Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢?
最近发现了一个很好的Android Shell工具代码,在这里分享一下。

Shell核心代码

import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.List;/** * ShellUtils * <ul> * <strong>Check root</strong> * <li>{@link ShellUtils#checkRootPermission()}</li> * </ul> * <ul> * <strong>Execte command</strong> * <li>{@link ShellUtils#execCommand(String, boolean)}</li> * <li>{@link ShellUtils#execCommand(String, boolean, boolean)}</li> * <li>{@link ShellUtils#execCommand(List, boolean)}</li> * <li>{@link ShellUtils#execCommand(List, boolean, boolean)}</li> * <li>{@link ShellUtils#execCommand(String[], boolean)}</li> * <li>{@link ShellUtils#execCommand(String[], boolean, boolean)}</li> * </ul> */public class ShellUtils {    public static final String COMMAND_SU       = "su";    public static final String COMMAND_SH       = "sh";    public static final String COMMAND_EXIT     = "exit\n";    public static final String COMMAND_LINE_END = "\n";    private ShellUtils() {        throw new AssertionError();    }    /** * check whether has root permission * * @return */    public static boolean checkRootPermission() {        return execCommand("echo root", true, false).result == 0;    }    /** * execute shell command, default return result msg * * @param command command * @param isRoot whether need to run with root * @return * @see ShellUtils#execCommand(String[], boolean, boolean) */    public static CommandResult execCommand(String command, boolean isRoot) {        return execCommand(new String[] {command}, isRoot, true);    }    /** * execute shell commands, default return result msg * * @param commands command list * @param isRoot whether need to run with root * @return * @see ShellUtils#execCommand(String[], boolean, boolean) */    public static CommandResult execCommand(List<String> commands, boolean isRoot) {        return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true);    }    /** * execute shell commands, default return result msg * * @param commands command array * @param isRoot whether need to run with root * @return * @see ShellUtils#execCommand(String[], boolean, boolean) */    public static CommandResult execCommand(String[] commands, boolean isRoot) {        return execCommand(commands, isRoot, true);    }    /** * execute shell command * * @param command command * @param isRoot whether need to run with root * @param isNeedResultMsg whether need result msg * @return * @see ShellUtils#execCommand(String[], boolean, boolean) */    public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {        return execCommand(new String[] {command}, isRoot, isNeedResultMsg);    }    /** * execute shell commands * * @param commands command list * @param isRoot whether need to run with root * @param isNeedResultMsg whether need result msg * @return * @see ShellUtils#execCommand(String[], boolean, boolean) */    public static CommandResult execCommand(List<String> commands, boolean isRoot, boolean isNeedResultMsg) {        return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, isNeedResultMsg);    }    /** * execute shell commands * * @param commands command array * @param isRoot whether need to run with root * @param isNeedResultMsg whether need result msg * @return <ul> * <li>if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and * {@link CommandResult#errorMsg} is null.</li> * <li>if {@link CommandResult#result} is -1, there maybe some excepiton.</li> * </ul> */    public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) {        int result = -1;        if (commands == null || commands.length == 0) {            return new CommandResult(result, null, null);        }        Process process = null;        BufferedReader successResult = null;        BufferedReader errorResult = null;        StringBuilder successMsg = null;        StringBuilder errorMsg = null;        DataOutputStream os = null;        try {            process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);            os = new DataOutputStream(process.getOutputStream());            for (String command : commands) {                if (command == null) {                    continue;                }                // donnot use os.writeBytes(commmand), avoid chinese charset error                os.write(command.getBytes());                os.writeBytes(COMMAND_LINE_END);                os.flush();            }            os.writeBytes(COMMAND_EXIT);            os.flush();            result = process.waitFor();            // get command result            if (isNeedResultMsg) {                successMsg = new StringBuilder();                errorMsg = new StringBuilder();                successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));                errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));                String s;                while ((s = successResult.readLine()) != null) {                    successMsg.append(s);                }                while ((s = errorResult.readLine()) != null) {                    errorMsg.append(s);                }            }        } catch (IOException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (os != null) {                    os.close();                }                if (successResult != null) {                    successResult.close();                }                if (errorResult != null) {                    errorResult.close();                }            } catch (IOException e) {                e.printStackTrace();            }            if (process != null) {                process.destroy();            }        }        return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null                : errorMsg.toString());    }    /** * result of command * <ul> * <li>{@link CommandResult#result} means result of command, 0 means normal, else means error, same to excute in * linux shell</li> * <li>{@link CommandResult#successMsg} means success message of command result</li> * <li>{@link CommandResult#errorMsg} means error message of command result</li> * </ul> */    public static class CommandResult {        /** result of command **/        public int    result;        /** success message of command result **/        public String successMsg;        /** error message of command result **/        public String errorMsg;        public CommandResult(int result) {            this.result = result;        }        public CommandResult(int result, String successMsg, String errorMsg) {            this.result = result;            this.successMsg = successMsg;            this.errorMsg = errorMsg;        }    }}

ShellUtils代码引用自:Trinea

小实例

是否root

public Boolean isRooted(){    CommandResult cmdResult = ShellUtils.execCommand("su", true);    if (cmdResult.errorMsg.equals("Permission denied") || cmdResult.result != 0) {        return false;    }else{        return true;    }}

复制文件

String[] commands = new String[] { "mount -o rw,remount /system", "cp /mnt/sdcard/xx.apk /system/app/" };public boolean copyFile(String[] cmdText){    CommandResult cmdResult = ShellUtils.execCommand(cmdText, true);    if (cmdResult.errorMsg.equals("Permission denied") || cmdResult.result != 0) {        return false;    }else{        return true;    }}

我暂时就举这两个例子,只要你会Shell,什么操作都是可以的。

博客名称:王乐平博客

博客地址:http://blog.lepingde.com

CSDN博客地址:http://blog.csdn.net/lecepin



更多相关文章

  1. android Timer的用法实例
  2. 【Android休眠】之Android对PowerKey事件的处理(1)代码流程
  3. Lottie动画
  4. android声音调整源代码分析
  5. Android(安卓)Http请求方法汇总
  6. 一个项目搞明白Android(安卓)启动模式和taskAffinity
  7. Android第一行代码(第二版)
  8. Android(安卓)用代码获取基站号(cell)和小区号(lac)
  9. 在屏幕上方是actionBar tab的ViewPager页面里面嵌套子tab并显示

随机推荐

  1. android monkey 使用测试
  2. Android实现弹出Toast提示
  3. Android跨进程通信 AIDL使用
  4. Android中ListView以及数组适配器(ArrayA
  5. android 列表框
  6. 直播软件源码android ui LinearLayout中
  7. Android ExpandableListView同时显示多种
  8. CheckBox设置颜色和自定义样式
  9. 如何在G1上安装非android market的apk
  10. Android 双进程守护