要让Android应用使用Root权限,首先Android设备必须已经获得Root权限。之后可以通过下面的代码取得process对象。

  Process process = Runtime.getRuntime().exec("su");

Process对象包含可以取得输入输出流及错误流对象,使用OutputStream对象,可以向Linux写入命令,其中getInputStream将取得命令返回的数据,如果出错getErrorStream将返回错误信息。

public abstract OutputStream getOutputStream();
public abstract InputStream getInputStream();
public abstract InputStream getErrorStream();

需要注意的是,使用 cat 查看某些系统文件时,getInputStream 或 getErrorStream 读取数据时不返回,因此代码中最后使用 getOutputStream 在最后再加入一个 exit 命令后,再读取数据。

源码如下

package com.john.wifipwd;import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;public class RootCommand {public interface OnCommandCallback {void onCommandResult(List<String> cmds, String result);void onCommandErrorResult(List<String> cmds, String errorMsg);}public static final int MESSAGE_COMMAND = 1001;private HandlerThread mHandlerThread;private WorkerHandler mWorkerHandler;private Handler mUIHandler;private OnCommandCallback mOnCommandCallback;public RootCommand() {this(null, null);}public RootCommand(OnCommandCallback callback) {this(null, callback);}public RootCommand(Handler handler, OnCommandCallback callback) {mUIHandler = handler;mOnCommandCallback = callback;mHandlerThread = new HandlerThread("su-Thread");mHandlerThread.start();mWorkerHandler = new WorkerHandler(mHandlerThread.getLooper());}public void addCommand(String cmd) {if (cmd != null) {ArrayList<String> obj = new ArrayList<>();obj.add(cmd);Message msg = Message.obtain();msg.what = MESSAGE_COMMAND;msg.obj = obj;mWorkerHandler.sendMessage(msg);}}public void addCommands(List<String> cmds) {if (cmds != null) {ArrayList<String> obj = new ArrayList<>();obj.addAll(cmds);Message msg = Message.obtain();msg.what = MESSAGE_COMMAND;msg.obj = obj;mWorkerHandler.sendMessage(msg);}}public void quit() {mWorkerHandler.removeMessages(MESSAGE_COMMAND);mWorkerHandler.quit();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {mHandlerThread.quitSafely();} else {mHandlerThread.quit();}}private class WorkerHandler extends Handler {private boolean mIsQuit;public WorkerHandler(Looper looper) {super(looper);}public void quit() {mIsQuit = true;}@Override@SuppressWarnings("unchecked")public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case MESSAGE_COMMAND: {List<String> cmds = (List<String>) msg.obj;String line;StringBuilder result = new StringBuilder();boolean isError = false;Process process = null;BufferedReader error = null;BufferedReader reader = null;BufferedWriter writer = null;try {process = Runtime.getRuntime().exec("su root");writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));error = new BufferedReader(new InputStreamReader(process.getErrorStream()));reader = new BufferedReader(new InputStreamReader(process.getInputStream()));Dlog.d("--> call write");for (String command : cmds) {Dlog.d("handle message:" + command);writer.write(command + " \n");}writer.write("exit \n");writer.flush();process.waitFor();Dlog.d("--> error read");while (!mIsQuit && (line = error.readLine()) != null) {result.append(line).append("\n");isError = true;}Dlog.d("--> isError = " + isError);if (!isError) {Dlog.d("--> Reader read");while (!mIsQuit && (line = reader.readLine()) != null) {result.append(line).append("\n");}}if (!mIsQuit) {if (!isError) {if (mUIHandler != null) {mUIHandler.post(new ResultRunnable(cmds, result.toString()));} else if (mOnCommandCallback != null) {mOnCommandCallback.onCommandResult(cmds, result.toString());}} else {if (mUIHandler != null) {mUIHandler.post(new ErrorResultRunnable(cmds, result.toString()));} else if (mOnCommandCallback != null) {mOnCommandCallback.onCommandErrorResult(cmds, result.toString());}}}Dlog.d("handle message end!");} catch (Exception e) {Dlog.e("", e);} finally {close(writer);close(error);close(reader);if (process != null) {process.destroy();}}break;}default:break;}}private void close(Closeable stream) {try {if (stream != null) {stream.close();}} catch (IOException e) {Dlog.e("", e);}}}private class ResultRunnable implements Runnable {private String mResult;private List<String> mCmds;public ResultRunnable(List<String> cmds, String result) {mCmds = cmds;mResult = result;}@Overridepublic void run() {if (mOnCommandCallback != null) {mOnCommandCallback.onCommandResult(mCmds, mResult);}}}private class ErrorResultRunnable implements Runnable {private String mResult;private List<String> mCmds;public ErrorResultRunnable(List<String> cmds, String result) {mCmds = cmds;mResult = result;}@Overridepublic void run() {if (mOnCommandCallback != null) {mOnCommandCallback.onCommandErrorResult(mCmds, mResult);}}}
}

以查看连接过的wifi密码为例,下面的代码演示使用方法

package com.john.wifipwd;import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class WiFiAcy extends AppCompatActivity implements RootCommand.OnCommandCallback {private RootCommand mRootCommand;private ArrayList<String> mCmds = new ArrayList<>();private List<WpaInfo> mWpaInfos = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.wpa_pwd_acy);mRootCommand = new RootCommand(new Handler(), this);sendCmd("cat /data/misc/wifi/wpa_supplicant.conf");}@Overrideprotected void onDestroy() {super.onDestroy();mRootCommand.quit();}@Overridepublic void onCommandResult(List<String> cmds, String result) {Dlog.d("[onCommandResult]");if (cmds != null && cmds.equals(mCmds)) {for (String cmd : cmds) {Dlog.d("--> " + cmd);}Dlog.d("" + result);if (result != null) {mWpaInfos.clear();parseWpa(mWpaInfos, result);createNetWorkViews();}}}@Overridepublic void onCommandErrorResult(List<String> cmds, String errorMsg) {Dlog.d("[onCommandErrorResult]");if (cmds != null && cmds.equals(mCmds)) {for (String cmd : cmds) {Dlog.d("--> " + cmd);}Dlog.d("" + errorMsg);}Toast.makeText(this, errorMsg, Toast.LENGTH_LONG).show();}private void sendCmd(String cmd) {mCmds.clear();mCmds.add(cmd);mRootCommand.addCommands(mCmds);}private void createNetWorkViews() {LayoutInflater localLayoutInflater = getLayoutInflater();ViewGroup localViewGroup = (ViewGroup) findViewById(R.id.ll_wifi_pwds);if (localViewGroup == null)return;localViewGroup.removeAllViews();Iterator localIterator = mWpaInfos.iterator();TextView textView;while (true) {if (!localIterator.hasNext())return;WpaInfo localNetWorkInfo = (WpaInfo) localIterator.next();Dlog.d(localNetWorkInfo.toString());View localView = localLayoutInflater.inflate(R.layout.wpa_pwd_item, localViewGroup, false);textView = (TextView) localView.findViewById(R.id.ssid);textView.setText(getString(R.string.ssid_tag) + localNetWorkInfo.getSsid());textView = (TextView) localView.findViewById(R.id.psk);textView.setText(getString(R.string.psk_tag) + localNetWorkInfo.getPsk());textView = (TextView) localView.findViewById(R.id.keyMgmt);textView.setText(getString(R.string.keyMgmt_tag) + localNetWorkInfo.getKeyMgmt());textView = (TextView) localView.findViewById(R.id.priority);textView.setText(getString(R.string.priority_tag) + localNetWorkInfo.getPriority());localViewGroup.addView(localView);}}private void parseWpa(List<WpaInfo> outList, String content) {String[] array = content.split("\n");WpaInfo wpaInfo = null;for (String line : array) {line = line.trim();if (line.startsWith(WpaInfo.NETWORK_PREFIX)) {wpaInfo = new WpaInfo();outList.add(wpaInfo);} else if (wpaInfo != null) {if (line.startsWith(WpaInfo.SSID_PREFIX)) {line = line.substring(WpaInfo.SSID_PREFIX.length());line = line.replaceAll("\"", "");wpaInfo.setSsid(line);} else if (line.startsWith(WpaInfo.PSK_PREFIX)) {line = line.substring(WpaInfo.PSK_PREFIX.length());line = line.replaceAll("\"", "");wpaInfo.setPsk(line);} else if (line.startsWith(WpaInfo.KEY_MGMT_PREFIX)) {line = line.substring(WpaInfo.KEY_MGMT_PREFIX.length());wpaInfo.setKeyMgmt(line);} else if (line.startsWith(WpaInfo.PRIORITY_PREFIX)) {line = line.substring(WpaInfo.PRIORITY_PREFIX.length());wpaInfo.setPriority(line);Dlog.d("" + wpaInfo);}}}}
}

package com.john.wifipwd;public class WpaInfo {public static final String NETWORK_PREFIX = "network={";public static final String SSID_PREFIX = "ssid=";public static final String PSK_PREFIX = "psk=";public static final String KEY_MGMT_PREFIX = "key_mgmt=";public static final String PRIORITY_PREFIX = "priority=";private String ssid;private String psk;private String keyMgmt;private String priority;public WpaInfo() {}public WpaInfo(String ssid, String psk, String keyMgmt, String priority) {this.ssid = ssid;this.psk = psk;this.keyMgmt = keyMgmt;this.priority = priority;}public String getSsid() {return ssid;}public void setSsid(String ssid) {this.ssid = ssid;}public String getPsk() {return psk;}public void setPsk(String psk) {this.psk = psk;}public String getKeyMgmt() {return keyMgmt;}public void setKeyMgmt(String keyMgmt) {this.keyMgmt = keyMgmt;}public String getPriority() {return priority;}public void setPriority(String priority) {this.priority = priority;}@Overridepublic boolean equals(Object o) {if (this == o)return true;if (o == null || getClass() != o.getClass())return false;WpaInfo wpaInfo = (WpaInfo) o;if (ssid != null ? !ssid.equals(wpaInfo.ssid) : wpaInfo.ssid != null)return false;if (psk != null ? !psk.equals(wpaInfo.psk) : wpaInfo.psk != null)return false;if (keyMgmt != null ? !keyMgmt.equals(wpaInfo.keyMgmt) : wpaInfo.keyMgmt != null)return false;return priority != null ? priority.equals(wpaInfo.priority) : wpaInfo.priority == null;}@Overridepublic int hashCode() {int result = ssid != null ? ssid.hashCode() : 0;result = 31 * result + (psk != null ? psk.hashCode() : 0);result = 31 * result + (keyMgmt != null ? keyMgmt.hashCode() : 0);result = 31 * result + (priority != null ? priority.hashCode() : 0);return result;}@Overridepublic String toString() {return "WpaInfo{" +"ssid='" + ssid + '\'' +", psk='" + psk + '\'' +", keyMgmt='" + keyMgmt + '\'' +", priority='" + priority + '\'' +'}';}
}

转载于:https://www.cnblogs.com/diysoul/p/5722077.html

android 应用使用Root权限执行linux命令相关推荐

  1. android apk获取root权限执行相应的操作 demo调试

    在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等.下面是在apk中获取root权限的方法,前提是设备已经root过 ...

  2. linux用root权限执行命令,Linux root权限获取之sudo命令详解

    1. 了解sudo的作用 日常操作中为了避免一些误操作,更加安全的管理系统,我们一般使用普通用户登录系统,而非root.当需要执行一些管理员命令操作时,再切换成root用户身份去执行. 普通用户切换到 ...

  3. linux查看php命令目录权限,PHP执行linux命令mkdir权限问题

    在linux系统中,root帐号执行php命令: mkdir('test', 0777); 结果文件的权限依然为: drwxr-xr-x 2 root root   Jul 27 19:30test ...

  4. 权限执行[Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?

    每日一贴,今天的内容关键字为权限执行 RunTime.exec()这个接口可以说是给我们开发者供给了一个很好的直观操纵底层操纵系统的机遇,但是这个接口的使用还有很多需要注意的问题.由于要完全的分析这个 ...

  5. linux安卓root权限,Android 文件系统获取root权限

    最近在移植Android2.3到s3c6410平台,文件系统成功挂载后,在超级终端执行一些命令不成功,比如mkdir,这样的基础命令,后来查阅资料,是自己没有取得root权限,只需在启动的shell时 ...

  6. Android在Shell环境下运行Linux命令

    Android的底层其实linux,所以可以在android shell下运行linux命令,尤其是经过root处理的Android系统,基本上可以通过调用linux命令完全操作手机,下面的RootC ...

  7. Android 系统(67)---android apk 的root 权限和USB adb 权限的区别

    android apk 的root 权限和USB adb 权限的区别 USB adb 权限是指,当adb 连接手机时,手机中的守护进程adbd 的权限为root 权限,从而它的子进程也具有root 权 ...

  8. php怎么获取权限操作 shell,利用php利用root权限执行shell脚本必须进行以下几个步骤...

    这几天弄的东西涉及到php利用shell脚本与Linux的交互,我们知道利用php运行脚本来访问Linux是以Apach的身份来执行的,因此它自己能够所做的事情很少的,因为没有足够的权限,这里就涉及到 ...

  9. linux多个sh 同时执行命令,sh, 批量执行Linux命令

    step 1:创建一个sh批处理命令文件 # vim /etc/batch_ssh/install_redis.sh step 2:给当前用户,能够执行sh脚本权限 # chmod install_r ...

最新文章

  1. 超级黑科技代码!Python打造电脑人脸屏幕解锁神器附带接头暗号
  2. hpm128无法共享打印_办公室打印机如何共享给同事使用呢?常见共享打印问题及解决方法...
  3. cmw500综合测试仪使用_大屏幕真彩色互感器综合特性测试仪功能特点
  4. SQL中的sysobjects与syscolumns
  5. linux poll in,Linux poll机制详细讲解
  6. struct和class内存大小的计算
  7. [转]oracle查看数据文件, 控制文件, 及日志文件命令
  8. 关于SUID、SGID、Sticky
  9. Android中实现自定义View组件并使其能跟随鼠标移动
  10. cmd命令大全 DOS窗口命令
  11. Android实现数据存储技术
  12. 什么是软件危机?产生原因?如何解决?
  13. Openpyxl:读取/写入Excel文件的Python模块
  14. 项目管理(PMP)》项目管理十大知识领域
  15. cmos逻辑门传输延迟时间_边沿触发器 || D触发器 || JK触发器 || 逻辑功能转换 工作特性 || 重难点 || 数电...
  16. box2d弹球 cocos2d-x重力感应(cocos2d-x2.1)
  17. 发布宅男神器:视频直播app for Android ----- 万紫千红
  18. php+羊,PHP解决羊生羊的问题。
  19. windows什么录屏软件好用,windows屏幕录制软件
  20. bool 和_Bool的使用

热门文章

  1. Cocosd-x”设计模式“之五 :防御式编程”模式“
  2. 《精通Linux内核必会的75个绝技》知识杂记
  3. Google推出一款用户隐私保护工具箱
  4. 动态风云--互联网感言(三)
  5. [转载]常用正则表达式收集勘误
  6. 蓝桥杯 ALGO-113 算法训练 数的统计
  7. linux的cimserver是什么服务,openpegasus的启动方式(即cimserver的启动方式)
  8. Oracle自制数据仓库,自治数据库:Oracle 的自治数据仓库云-ADWC体验
  9. 未定义标识符 stringc/c++(20)_拓展巩固练习(2020.5.20)
  10. 【Python】SNMP的安装及Python的调用