Android 代码执行Linux Shell小记
生活随笔
收集整理的這篇文章主要介紹了
Android 代码执行Linux Shell小记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引言
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
總結
以上是生活随笔為你收集整理的Android 代码执行Linux Shell小记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 加载html文件内容,js读取tx
- 下一篇: Linux 文件系统与设备文件系统 (一