Android编程获取root权限问题

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

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

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

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


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

  1. ProcessBuilderpb=newProcessBuilder("/system/bin/sh");
  2. //java.lang.ProcessBuilder:Createsoperatingsystemprocesses.
  3. pb.directory(newFile("/"));//设置shell的当前目录。
  4. try{
  5. Processproc=pb.start();
  6. //获取输入流,可以通过它获取SHELL的输出。
  7. BufferedReaderin=newBufferedReader(newInputStreamReader(proc.getInputStream()));
  8. BufferedReadererr=newBufferedReader(newInputStreamReader(proc.getErrorStream()));
  9. //获取输出流,可以通过它向SHELL发送命令。
  10. PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(proc
  11. .getOutputStream())),true);
  12. out.println("pwd");
  13. out.println("suroot");//执行这一句时会弹出对话框(以下程序要求授予最高权限...),要求用户确认。
  14. out.println("cd/data/data");//这个目录在系统中要求有root权限才可以访问的。
  15. out.println("ls-l");//这个命令如果能列出当前安装的APK的数据文件存放目录,就说明我们有了ROOT权限。
  16. out.println("exit");
  17. //proc.waitFor();
  18. Stringline;
  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(Exceptione){
  29. System.out.println("exception:"+e);

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

  1. Filesuperuser=newFile("/system/bin/superuser");
  2. if(superuser.exists())
  3. {
  4. //returndevicetooriginalstate
  5. Processprocess=Runtime.getRuntime().exec("superuser");
  6. DataOutputStreamos=newDataOutputStream(process.getOutputStream());
  7. os.writeBytes("mount-oremount,rw/dev/block/mtdblock3/system\n");
  8. os.writeBytes("busyboxcp/system/bin/superuser/system/bin/su\n");
  9. os.writeBytes("busyboxchown0:0/system/bin/su\n");
  10. os.writeBytes("chmod4755/system/bin/su\n");
  11. os.writeBytes("rm/system/bin/superuser\n");
  12. os.writeBytes("exit\n");
  13. os.flush();
  14. }

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


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


;