Android编程获取root权限问题

转载 2012年03月31日 11:41:16

为了方便给出前一篇地址:http://blog.csdn.net/weiyirong/article/details/7380651  调了几天这个root权限获取问题终于搞定了,各种百度谷歌,各种方法全部都测试过终于有眉目了  .

我通过这几天测试总结了三个方法获取root权限问题:  

1 上一篇文章所引用的方法
  1. /** 
  2.      * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限) 
  3.      *  
  4.      * @param command 
  5.      *            命令:String apkRoot="chmod 777 "+getPackageCodePath();//<span style="color:#cc0000;"><strong>注意这里的getPackageCodePath()是继承Activity里的方法 
  6. </strong></span>     *            RootCommand(apkRoot); 
  7.      * @return 应用程序是/否获取Root权限 
  8.      */  
  9.     public static boolean RootCommand(String command) {  
  10.         Process process = null;  
  11.         DataOutputStream os = null;  
  12.         try {  
  13.             process = Runtime.getRuntime().exec("su");  
  14.             os = new DataOutputStream(process.getOutputStream());  
  15.             os.writeBytes(command + "\n");  
  16.             os.writeBytes("exit\n");  
  17.             os.flush();  
  18.             process.waitFor();  
  19.         } catch (Exception e) {  
  20.             return false;  
  21.         } finally {  
  22.             try {  
  23.                 if (os != null) {  
  24.                     os.close();  
  25.                 }  
  26.                 process.destroy();  
  27.             } catch (Exception e) {  
  28.             }  
  29.         }  
  30.         return true;  
  31.     }  
这个方法要注意的问题在那条命令
  1. chmod 777 getPackageCodePath()  
有的地方是这样写的
  1. chmod 777 /dev/block/mmcblk0  

经过几次的测试,我发现后面那一句的话虽然能够成功获取权限,但是!但是运行后的状况是:手机运行,但是程序卡死,时不时的跳出是否强制关闭,我刚开始以为是耗时工作必须放在线程里才不会卡死,就用了异步线程和Thread测试,发现程序仍然卡死,当然有的时候在模拟器上可以运行,而在真机上却卡死也有可能是耗时操作导致,需开线程处理。  但是在这里的情况线程明显不是问题,调了好久,我索性就把权限获取注释掉,发现可以用!运行正常,真机模拟器都可以,这下问题找到了吧!我尝试着把命令改成第一种测试,OK了!!!所有大伙注意这两个的区别。(注:个人认为第二种虽然获取得权限,但是获取权限的进程很快就关闭了,所以接下去的操作仍有问题,而第一种是获取为此应用程序的获取权限,因此可以正常执行,当然这只是个人见解,有不同看法大家可以指点指点我哈)。


2. RootExplorer获取root权限的方法(以下是来自RootExplorer的源码)

  1. ProcessBuilder pb = new ProcessBuilder("/system/bin/sh");   
  2. //java.lang.ProcessBuilder:  Creates operating system processes.   
  3. pb.directory(new File("/"));//设置shell的当前目录。     
  4. try {    
  5.     Process proc = pb.start();    
  6.     //获取输入流,可以通过它获取SHELL的输出。     
  7.     BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));    
  8.     BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));    
  9.     //获取输出流,可以通过它向SHELL发送命令。     
  10.     PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc    
  11.                     .getOutputStream())), true);    
  12.     out.println("pwd");    
  13.     out.println("su root");//执行这一句时会弹出对话框(以下程序要求授予最高权限...),要求用户确认。     
  14.     out.println("cd /data/data");//这个目录在系统中要求有root权限才可以访问的。     
  15.     out.println("ls -l");//这个命令如果能列出当前安装的APK的数据文件存放目录,就说明我们有了ROOT权限。     
  16.     out.println("exit");    
  17.     // proc.waitFor();     
  18.     String line;    
  19.     while ((line = in.readLine()) != null) {    
  20.         System.out.println(line);   // 打印输出结果  
  21.     }    
  22.     while ((line = err.readLine()) != null) {    
  23.         System.out.println(line);  // 打印错误输出结果  
  24.     }    
  25.     in.close();    
  26.     out.close();    
  27.     proc.destroy();    
  28. catch (Exception e) {    
  29.     System.out.println("exception:" + e);    

经过我的测试也是可行的,不过问题还是一样的,就是黑屏,还会时而跳出是否强制关闭程序。伤不起
3 来自谷歌 http://code.google.com/p/superuser/(关于Superuser超级管理器大伙自个百度之),下面是他的获取root权限源码 

 

 

  1. File superuser = new File("/system/bin/superuser");    
  2.    
  3. if (superuser.exists())  
  4. {  
  5.  // return device to original state  
  6.  Process process = Runtime.getRuntime().exec("superuser");  
  7.  DataOutputStream os = new DataOutputStream(process.getOutputStream());      
  8.  os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n");  
  9.  os.writeBytes("busybox cp /system/bin/superuser /system/bin/su\n");  
  10.  os.writeBytes("busybox chown 0:0 /system/bin/su\n");  
  11.  os.writeBytes("chmod 4755 /system/bin/su\n");  
  12.  os.writeBytes("rm /system/bin/superuser\n");  
  13.  os.writeBytes("exit\n");  
  14.  os.flush();  
  15. }  

这种方法我测试了下,没办法,估计还要改一些地方,不推荐使用,当然可以研究研究呵呵,


转自:http://blog.csdn.net/weiyirong/article/details/7400036


关于前篇Android编程获取root权限问题的最终解决与分析 .

为了方便给出前一篇地址:http://blog.csdn.net/weiyirong/article/details/7380651  调了几天这个root权限获取问题终于搞定了,各种百度谷歌,各种方...

Android编程中中root权限的获取

前几天在做一个文件管理器,在打开非sdcard下的目录文件时碰到了空指针的错误,色友说要获取root权限才能访问其他需root权限的文件夹,于是用了下面的方法获取权限, public final St...

Android程序获取root权限问题的最终解决与分析

为了方便给出上一篇上一篇地址:  http://blog.csdn.net/up1up2up3/article/details/7380651,调了几天这个root权限获取问题终于搞定了,各种百度谷歌...

Android系统手机如何获取Root权限

  • 2012年01月18日 17:23
  • 270KB
  • 下载

android获取root权限

  • 2014年03月16日 10:41
  • 46KB
  • 下载

[Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?

RunTime.exec()这个接口可以说是给我们开发者提供了一个很好的直观操作底层操作系统的机会,但是这个接口的使用还有很多需要注意的问题。由于要完整的介绍这个接口需要较大的篇幅,我在这里只针对一点...

让Android应用程序申请获取ROOT权限

有时候我们写 Android APP,需要让它获取 ROOT 权限,那么如何让 APP 去向系统申请呢?下面提供一个方法,前提是系统是已经 ROOT 权限了,能够执行能 su 命令。如果不能,可以...

Android应用程序永久获取root权限方法

原文:http://hold-on.iteye.com/blog/1901152   Android应用程序永久获取root权限方法 博客分类: Android java And...

Android 获取ROOT权限原理介绍和签名验证原理及反编译学习

二、 Root 的介绍1.       Root 的目的 可以让我们拥有掌控手机系统的权限,比如删除一些system/app下面的无用软件,更换开关机铃声和动画,拦截状态栏弹出的广告等。 ...

android apk获取root权限执行相应的操作 demo调试

在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等。下面是在apk中获取root权限的方法,前提是设备已经root过...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android编程获取root权限问题
举报原因:
原因补充:

(最多只允许输入30个字)