展开全部

在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权限相关推荐

  1. java root权限_Android应用获取Root权限

    在项目的过程中,有可能会要实现类似360优化大师.安卓优化大师的软件搬家.静默安装等需要root权限的功能,或者类似SET_PREFERRED_APPLICATIONS.MOVE_PACKAGE 等需 ...

  2. 教你如何获取索爱X10 Android2.1 Root权限

    既然上篇文章已经教会大家如何升级为Android2.1系统[回顾:教你如何升级索爱X10至Android 2.1(适用于任何版本) ],那么升级完的第一件事自然是获取ROOT权限,获取最大的" ...

  3. 华为android7.0 root,华为Nova 7.0 root教程 华为Nova获取7.0系统的root权限

    刷机之家小编要说说咱们的华为Nova手机7.0系统的root教程了,这个root教程也是利用第三方的recovery来给手机刷入一个zip格式的root包就可以了, 这个root教程应用的也是比较普遍 ...

  4. android root权限获取失败,安卓手机为什么获取Root权限失败?Root失败是什么原因...

    安卓手机为什么获取Root权限失败?新手机.旧手机里面安装的最多的是什么APP?当然是预装!是的,相信很多用户都深有体会,当这种情况无法再忍受的时候,我们只能通过Root或者刷机解决问题,但只要用的人 ...

  5. 4x root 红米_红米Note 4X root教程 红米Note4X获取root权限的方法

    2017-09-13 11:53:45 红米Note 4X root教程 红米Note4X获取root权限的方法 来源:刷机之家 标签:红米Note 4X,root教程,获取root 刷机之家小编来说 ...

  6. root 红米note5_红米Note5 root教程_红米Note5卡刷root包来获取root权限

    下面也来把这个红米Note5手机的root教程整理一下了,因为这个root也是相当实用的,可以解决很多的问题,不过有的机友却不知道如何进行具体的root,所以下面特意整理了一个详细的获取root权限的 ...

  7. linux用root权限执行命令,Linux root权限获取之sudo命令详解

    1. 了解sudo的作用 日常操作中为了避免一些误操作,更加安全的管理系统,我们一般使用普通用户登录系统,而非root.当需要执行一些管理员命令操作时,再切换成root用户身份去执行. 普通用户切换到 ...

  8. 三星 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工具选用 ...

  9. 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 ...

最新文章

  1. PL/SQL Developer远程访问Oracle数据库
  2. arcgis server for flex中文乱码问题(转)
  3. Qt窗口、控件、文本等的一些常用操作
  4. easyexcel导入简单封装
  5. websocket握手失败_WebSocket握手期间出错:意外的响应代码:500
  6. 计算机视觉领域最好用的开源图像标注工具
  7. java 位运算 hashcode_hashcode面试题
  8. 利用监听器实现在线人数统计
  9. 方法、hadoop源码之JobQueueTaskScheduler-by小雨
  10. sap不用oracle数据库库,SAP系统安装之Oracle 10g数据库(Win3264)
  11. feign.exception Connection reset executing
  12. 织梦登陆总是提示验证码错误
  13. pthread _cond_wait()函数
  14. Warshall算法C语言实现
  15. 计算机房摆放布局,【机房】强弱电机房位置大小及布置(附案例)
  16. 谈谈个人10几年来的一些经历感悟
  17. 内蒙古农业大学职业技术学院——数据结构—第一课
  18. 狼人杀超详入门攻略2之狼人战术
  19. 小故事:如果你真的能保持一份真爱
  20. 计组学习笔记2(RISC v版)

热门文章

  1. arp嗅探(windows)
  2. 愚人节导入_您是否发现了这些愚人节愚人节的插科打??
  3. python三个数从小到大排序
  4. 关于QQ一些功能的实现(二)
  5. LambdaStream
  6. 使用OGG/Kettle实现Oracle到MySQL数据平滑迁移
  7. 生化危机绝密报告2java,生化危机 绝密任务V2.1
  8. 【CYH-02】NOIp考砸后虐题赛:数学:题解
  9. php 结合md5的加密,解密方法
  10. [ 2204听力 ] 三