android获取root命令,应用内输入命令

11 篇文章 1 订阅
package net.lastcoder.jumphelp;

import android.text.TextUtils;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * Auth: Administrator
 * Date: 2018/1/7 0007
 */
public class CmdHelper extends Thread {
    private static final String TAG = "CmdHelper";

    private StreamShow errorShow = null;
    private StreamShow normalShow = null;
    private OutputStreamWriter outputStreamWriter = null;
    private Process process;
    private String cmd;
    private CmdHelper(String cmd) {
        this.cmd = cmd;
    }


    @Override
    public void run() {
        // 先su root出一个终端
        // 终端有输入,输出,和错误,因此有3个数据流
        try {
            process = Runtime.getRuntime().exec("su root");

            BufferedReader errorStreamReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            // 注意,如果输入流关闭,那么终端也会关闭,process的waitFor就会有等待结束
            outputStreamWriter = new OutputStreamWriter(process.getOutputStream());

            // 两种输出打印
            errorShow = new StreamShow(errorStreamReader, true);
            errorShow.start();
            normalShow = new StreamShow(inputStreamReader, true);
            normalShow.start();

        } catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
        }


        try {
            // 这里线程等待
            outputStreamWriter.write(cmd);
            outputStreamWriter.close();

            int result = process.waitFor();
            Log.w(TAG, "------------------------ cmd result = " + result);
            errorShow.done();
            normalShow.done();
        } catch (InterruptedException e) {
            Log.e(TAG, e.getMessage(), e);
        } catch (IOException e) {
            e.printStackTrace();
            Log.e(TAG, e.getMessage(), e);
        }
    }

    private static class StreamShow extends Thread {
        BufferedReader reader;
        private boolean error = false;
        private boolean done = false;
        StreamShow(BufferedReader reader, boolean error) {
            this.reader = reader;
            this.error = error;
        }

        private void done() {
            done = true;
            this.interrupt();
        }

        @Override
        public void run() {
            while (!done) {
                try {
                    String line = reader.readLine();
                    if (TextUtils.isEmpty(line)) {
                        continue;
                    }
                    if (error) {
                        Log.e(TAG, line);
                    }
                    else {
                        Log.d(TAG, line);
                    }
                } catch (Exception e) {
                    Log.e(TAG, e.getMessage(), e);
                }
            }
        }

        @Override
        public synchronized void start() {
            done = false;
            super.start();
        }
    }

    /**
     * 异步,第一次打开可能有授权界面
     *
     * @param cmd  命令,如dumpsys等
     */
    public synchronized static void cmd(String cmd) {
        CmdHelper rootThread = new CmdHelper(cmd);
        rootThread.setName("root_process");
        rootThread.start();
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值