java获取root权限_apk如何获取root权限
展开全部
在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者e68a843231313335323631343130323136353331333337396234在apk中需要直接访问某些设备等。下面是在apk中获取root权限的方法,前提是设备已经root过了。
关键点在于下面这句,通过执行su产生一个具有root权限的进程:
Process p = Runtime.getRuntime().exec("su");
然后,在向这个进程的写入要执行的命令,即可达到以root权限执行命令:
dos = new DataOutputStream(p.getOutputStream());
dos.writeBytes(cmd + "\n");
dos.flush();
或者用下面的方式:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c", cmd});
经过测试,以root权限执行命令,只在真机上测试成功,在模拟器上没有成功过。
第一次运行时,会出现请求root权限的界面,选中记住,并允许:
测试程序界面,如果已经root,界面中可以显示出/system分区对应的设备节点:
主要文件:RootCmd.java
[java]
package org.ckl.root;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import android.util.Log;
public final class RootCmd {
private static final String TAG = "RootCmd";
private static boolean mHaveRoot = false;
// 判断机器Android是否已经root,即是否获取root权限
public static boolean haveRoot() {
if (!mHaveRoot) {
int ret = execRootCmdSilent("echo test"); // 通过执行测试命令来检测
if (ret != -1) {
Log.i(TAG, "have root!");
mHaveRoot = true;
} else {
Log.i(TAG, "not root!");
}
} else {
Log.i(TAG, "mHaveRoot = true, have root!");
}
return mHaveRoot;
}
// 执行命令并且输出结果
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());
Log.i(TAG, cmd);
dos.writeBytes(cmd + "\n");
dos.flush();
dos.writeBytes("exit\n");
dos.flush();
String line = null;
while ((line = dis.readLine()) != null) {
Log.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());
Log.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;
}
}
相关文件:SystemPartition.java,获取/system分区设备节点,并支持重新mount /system为可读写:
[java]
package org.ckl.root;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import android.util.Log;
public class SystemPartition {
private static final String TAG = "SystemMount";
private static String TMP_PATH = "/sdcard/mount.txt";
private static String mMountPiont = null;
private static boolean mWriteable = false;
private SystemPartition() {
Log.i(TAG, "new SystemMount()");
}
private static class SystemPartitionHolder {
private static SystemPartition instance = new SystemPartition();
}
public SystemPartition getInstance() {
return SystemPartitionHolder.instance;
}
public static String getSystemMountPiont() {
DataInputStream dis = null;
if (mMountPiont == null) {
try {
RootCmd.execRootCmd("mount > " + TMP_PATH);
// Runtime.getRuntime().exec("mount > " + TMP_PATH);
dis = new DataInputStream(new FileInputStream(TMP_PATH));
String line = null;
int index = -1;
while ( (line = dis.readLine()) != null ) {
index = line.indexOf(" /system ");
if (index > 0) {
mMountPiont = line.substring(0, index);
if (line.indexOf(" rw") > 0) {
mWriteable = true;
Log.i(TAG, "/system is writeable !");
} else {
mWriteable = false;
Log.i(TAG, "/system is readonly !");
}
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dis != null) {
try {
dis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
dis = null;
}
File f = new File(TMP_PATH);
if (f.exists()) {
f.delete();
}
}
}
if (mMountPiont != null) {
Log.i(TAG, "/system mount piont: " + mMountPiont);
} else {
Log.i(TAG, "get /system mount piont failed !!!");
}
return mMountPiont;
}
public static boolean isWriteable() {
mMountPiont = null;
getSystemMountPiont();
return mWriteable;
}
public static void remountSystem(boolean writeable) {
String cmd = null;
getSystemMountPiont();
if (mMountPiont != null && RootCmd.haveRoot()) {
if (writeable) {
cmd = "mount -o remount,rw " + mMountPiont + " /system";
} else {
cmd = "mount -o remount,ro " + mMountPiont + " /system";
}
RootCmd.execRootCmdSilent(cmd);
isWriteable();
}
}
}
java获取root权限_apk如何获取root权限相关推荐
- java root权限_Android应用获取Root权限
在项目的过程中,有可能会要实现类似360优化大师.安卓优化大师的软件搬家.静默安装等需要root权限的功能,或者类似SET_PREFERRED_APPLICATIONS.MOVE_PACKAGE 等需 ...
- 教你如何获取索爱X10 Android2.1 Root权限
既然上篇文章已经教会大家如何升级为Android2.1系统[回顾:教你如何升级索爱X10至Android 2.1(适用于任何版本) ],那么升级完的第一件事自然是获取ROOT权限,获取最大的" ...
- 华为android7.0 root,华为Nova 7.0 root教程 华为Nova获取7.0系统的root权限
刷机之家小编要说说咱们的华为Nova手机7.0系统的root教程了,这个root教程也是利用第三方的recovery来给手机刷入一个zip格式的root包就可以了, 这个root教程应用的也是比较普遍 ...
- android root权限获取失败,安卓手机为什么获取Root权限失败?Root失败是什么原因...
安卓手机为什么获取Root权限失败?新手机.旧手机里面安装的最多的是什么APP?当然是预装!是的,相信很多用户都深有体会,当这种情况无法再忍受的时候,我们只能通过Root或者刷机解决问题,但只要用的人 ...
- 4x root 红米_红米Note 4X root教程 红米Note4X获取root权限的方法
2017-09-13 11:53:45 红米Note 4X root教程 红米Note4X获取root权限的方法 来源:刷机之家 标签:红米Note 4X,root教程,获取root 刷机之家小编来说 ...
- root 红米note5_红米Note5 root教程_红米Note5卡刷root包来获取root权限
下面也来把这个红米Note5手机的root教程整理一下了,因为这个root也是相当实用的,可以解决很多的问题,不过有的机友却不知道如何进行具体的root,所以下面特意整理了一个详细的获取root权限的 ...
- linux用root权限执行命令,Linux root权限获取之sudo命令详解
1. 了解sudo的作用 日常操作中为了避免一些误操作,更加安全的管理系统,我们一般使用普通用户登录系统,而非root.当需要执行一些管理员命令操作时,再切换成root用户身份去执行. 普通用户切换到 ...
- 三星 android 5.0 root,三星N9150 Android 5.0 (GALAXY Note Edge 双4G)ROOT教程,一键获取ROOT权限...
三星N9150 Android 5.0 (GALAXY Note Edge 双4G)怎么ROOT?三星N9150 Android 5.0 (GALAXY Note Edge 双4G) ROOT工具选用 ...
- nubia android root权限,中兴NX402 (Nubia Z5 Mini Android 4.2)ROOT教程,一键获取ROOT权限
中兴NX402 (Nubia Z5 Mini Android 4.2)怎么ROOT?中兴NX402 (Nubia Z5 Mini Android 4.2) ROOT工具选用哪些?如何避免中兴NX402 ...
最新文章
- PL/SQL Developer远程访问Oracle数据库
- arcgis server for flex中文乱码问题(转)
- Qt窗口、控件、文本等的一些常用操作
- easyexcel导入简单封装
- websocket握手失败_WebSocket握手期间出错:意外的响应代码:500
- 计算机视觉领域最好用的开源图像标注工具
- java 位运算 hashcode_hashcode面试题
- 利用监听器实现在线人数统计
- 方法、hadoop源码之JobQueueTaskScheduler-by小雨
- sap不用oracle数据库库,SAP系统安装之Oracle 10g数据库(Win3264)
- feign.exception Connection reset executing
- 织梦登陆总是提示验证码错误
- pthread _cond_wait()函数
- Warshall算法C语言实现
- 计算机房摆放布局,【机房】强弱电机房位置大小及布置(附案例)
- 谈谈个人10几年来的一些经历感悟
- 内蒙古农业大学职业技术学院——数据结构—第一课
- 狼人杀超详入门攻略2之狼人战术
- 小故事:如果你真的能保持一份真爱
- 计组学习笔记2(RISC v版)