引言
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 erroros.write(command.getBytes());os.writeBytes(COMMAND_LINE_END);os.flush();}os.writeBytes(COMMAND_EXIT);os.flush();result = process.waitFor();// get command resultif (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