码迷,mamicode.com
首页 > 移动开发 > 详细

android 应用使用Root权限执行linux命令

时间:2016-07-31 00:19:22      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:

要让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;
        }

        @Override
        public 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;
        }

        @Override
        public 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<>();

    @Override
    protected 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");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRootCommand.quit();
    }

    @Override
    public 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();
            }
        }
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public String toString() {
        return "WpaInfo{" +
                "ssid=‘" + ssid + ‘\‘‘ +
                ", psk=‘" + psk + ‘\‘‘ +
                ", keyMgmt=‘" + keyMgmt + ‘\‘‘ +
                ", priority=‘" + priority + ‘\‘‘ +
                ‘}‘;
    }
}

 

android 应用使用Root权限执行linux命令

标签:

原文地址:http://www.cnblogs.com/diysoul/p/5722077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!