package
com.linin.utils;
import
java.io.DataInputStream;
import
java.io.DataOutputStream;
import
java.io.IOException;
/**
* root权限工具类
*
* @author linin
*
*/
public
class
RootUtil {
private
static
final
String TAG =
"linin.root"
;
private
static
boolean
mHaveRoot =
false
;
/**
* 判断机器Android是否已经root,即是否获取root权限
*/
public
static
boolean
haveRoot() {
if
(!mHaveRoot) {
int
ret = execRootCmdSilent(
"echo test"
);
// 通过执行测试命令来检测
if
(ret != -
1
) {
L.i(TAG,
"have root!"
);
mHaveRoot =
true
;
}
else
{
L.i(TAG,
"not root!"
);
}
}
else
{
L.i(TAG,
"mHaveRoot = true, have root!"
);
}
return
mHaveRoot;
}
/** 获取root权限 */
public
static
boolean
root() {
try
{
Runtime.getRuntime().exec(
new
String[] {
"/system/bin/su"
,
"-c"
,
"chmod 777 /dev/graphics/fb0"
});
}
catch
(IOException e) {
e.printStackTrace();
L.i(TAG,
"root fail!"
);
return
false
;
}
L.i(TAG,
"root success!"
);
return
true
;
}
/**
* 执行命令并且输出结果
*/
public
static
String execRootCmd(String cmd) {
String result =
""
;
DataOutputStream dos =
null
;
DataInputStream dis =
null
;
try
{
Process p = Runtime.getRuntime().exec(
"su"
);
// 经过Root处理的android系统即有su命令
dos =
new
DataOutputStream(p.getOutputStream());
dis =
new
DataInputStream(p.getInputStream());
L.i(TAG, cmd);
dos.writeBytes(cmd +
"\n"
);
dos.flush();
dos.writeBytes(
"exit\n"
);
dos.flush();
String line =
null
;
while
((line = dis.readLine()) !=
null
) {
L.d(
"result"
, line);
result += line;
}
p.waitFor();
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(dos !=
null
) {
try
{
dos.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
if
(dis !=
null
) {
try
{
dis.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
return
result;
}
/**
* 执行命令但不关注结果输出
*/
public
static
int
execRootCmdSilent(String cmd) {
int
result = -
1
;
DataOutputStream dos =
null
;
try
{
Process p = Runtime.getRuntime().exec(
"su"
);
dos =
new
DataOutputStream(p.getOutputStream());
L.i(TAG, cmd);
dos.writeBytes(cmd +
"\n"
);
dos.flush();
dos.writeBytes(
"exit\n"
);
dos.flush();
p.waitFor();
result = p.exitValue();
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(dos !=
null
) {
try
{
dos.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
return
result;
}
}