Android 开发中使用Linux Shell实例详解
2019年10月12日
作者:佚名
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(String[],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 = "exitn"; 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) */ 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) */ public static CommandResult execCommand(List<String> commands,boolean isRoot) { return execCommand(commands == null ? null : commands.toArray(new String[] {}),default return result msg * * @param commands command array * @param isRoot whether need to run with root * @return * @see ShellUtils#execCommand(String[],boolean) */ public static CommandResult execCommand(String[] commands,boolean isRoot) { return execCommand(commands,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 isRoot,boolean isNeedResultMsg) { return execCommand(new String[] {command},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 isNeedResultMsg) { return execCommand(commands == null ? null : commands.toArray(new String[] {}),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 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,什么操作都是可以的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
以上是来客网为你收集整理的Android 开发中使用Linux Shell实例详解全部内容,希望文章能够帮你解决Android 开发中使用Linux Shell实例详解所遇到的程序开发问题。
如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。