/* * Tencent is pleased to support the open source community by making * Tencent GT (Version 2.4 and subsequent versions) available. * * Notwithstanding anything to the contrary herein, any previous version * of Tencent GT shall not be subject to the license hereunder. * All right, title, and interest, including all intellectual property rights, * in and to the previous version of Tencent GT (including any and all copies thereof) * shall be owned and retained by Tencent and subject to the license under the * Tencent GT End User License Agreement (http://gt.qq.com/wp-content/EULA_EN.html). * * Copyright (C) 2015 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the MIT License (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://opensource.org/licenses/MIT * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ package com.tencent.wstt.gt.utils; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RootUtil { private static final Pattern PID_PATTERN = Pattern.compile("\\d+"); private static final Pattern SPACES_PATTERN = Pattern.compile("\\s+"); public static boolean rootJustNow = false; public static boolean isRooted() { BufferedReader reader; boolean flag = false; try { reader = terminal("ls /data/"); if (reader.readLine() != null) { flag = true; } } catch (Exception e) { e.printStackTrace(); } rootJustNow = flag; return flag; } private static BufferedReader terminal(String command) throws Exception { Process process = Runtime.getRuntime().exec("su"); // 执行到这,Superuser会跳出来,选择是否允许获取最高权限 OutputStream outstream = process.getOutputStream(); DataOutputStream DOPS = new DataOutputStream(outstream); InputStream instream = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader( new DataInputStream(instream))); String temp = command + "\n"; // 加回车 DOPS.writeBytes(temp); // 执行 DOPS.flush(); // 刷新,确保都发送到outputstream DOPS.writeBytes("exit\n"); // 退出 DOPS.flush(); process.waitFor(); return br; } public static void destroy(Process process) { // stupid method for getting the pid, but it actually works Matcher matcher = PID_PATTERN.matcher(process.toString()); matcher.find(); int pid = Integer.parseInt(matcher.group()); List<Integer> allRelatedPids = getAllRelatedPids(pid); for (Integer relatedPid : allRelatedPids) { destroyPid(relatedPid); } } private static void destroyPid(int pid) { Process suProcess = null; PrintStream outputStream = null; try { suProcess = Runtime.getRuntime().exec("su"); outputStream = new PrintStream(new BufferedOutputStream( suProcess.getOutputStream(), 8192)); outputStream.println("kill " + pid); outputStream.println("exit"); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (outputStream != null) { outputStream.close(); } if (suProcess != null) { try { suProcess.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } } } } private static List<Integer> getAllRelatedPids(final int pid) { List<Integer> result = new ArrayList<Integer>(Arrays.asList(pid)); // use 'ps' to get this pid and all pids that are related to it (e.g. // spawned by it) try { final Process suProcess = Runtime.getRuntime().exec("su"); new Thread(new Runnable() { @Override public void run() { PrintStream outputStream = null; try { outputStream = new PrintStream( new BufferedOutputStream( suProcess.getOutputStream(), 8192)); outputStream.println("ps"); outputStream.println("exit"); outputStream.flush(); } finally { if (outputStream != null) { outputStream.close(); } } } }).run(); if (suProcess != null) { try { suProcess.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } } BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new InputStreamReader( suProcess.getInputStream()), 8192); while (bufferedReader.ready()) { String[] line = SPACES_PATTERN.split(bufferedReader .readLine()); if (line.length >= 3) { try { if (pid == Integer.parseInt(line[2])) { result.add(Integer.parseInt(line[1])); } } catch (NumberFormatException ignore) { } } } } finally { if (bufferedReader != null) { bufferedReader.close(); } } } catch (IOException e1) { e1.printStackTrace(); } return result; } }