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

原创 2012年03月27日 18:59:55

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

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

1 上一篇文章所引用的方法
/**
	 * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限)
	 * 
	 * @param command
	 *            命令:String apkRoot="chmod 777 "+getPackageCodePath();//<span style="color:#cc0000;"><strong>注意这里的getPackageCodePath()是继承Activity里的方法
</strong></span>	 *            RootCommand(apkRoot);
	 * @return 应用程序是/否获取Root权限
	 */
	public static boolean RootCommand(String command) {
		Process process = null;
		DataOutputStream os = null;
		try {
			process = Runtime.getRuntime().exec("su");
			os = new DataOutputStream(process.getOutputStream());
			os.writeBytes(command + "\n");
			os.writeBytes("exit\n");
			os.flush();
			process.waitFor();
		} catch (Exception e) {
			return false;
		} finally {
			try {
				if (os != null) {
					os.close();
				}
				process.destroy();
			} catch (Exception e) {
			}
		}
		return true;
	}
这个方法要注意的问题在那条命令
chmod 777 getPackageCodePath()
有的地方是这样写的
chmod 777 /dev/block/mmcblk0

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


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

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

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

 

 

   File superuser = new File("/system/bin/superuser");  
    
   if (superuser.exists())
   {
    // return device to original state
    Process process = Runtime.getRuntime().exec("superuser");
    DataOutputStream os = new DataOutputStream(process.getOutputStream());    
    os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n");
    os.writeBytes("busybox cp /system/bin/superuser /system/bin/su\n");
    os.writeBytes("busybox chown 0:0 /system/bin/su\n");
    os.writeBytes("chmod 4755 /system/bin/su\n");
    os.writeBytes("rm /system/bin/superuser\n");
    os.writeBytes("exit\n");
    os.flush();
   }

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

说明一下,这是上一篇的升级版,上一篇的认识还是有误的尴尬呵呵,各位多多指点。。。。

 

public class LinuxShell {
	public static boolean isRoot(Runtime r, long wait)
			throws IOException, InterruptedException {
		boolean root = false;
		Process p = null;
		BufferedReader errReader = null;
		p = Runtime.getRuntime().exec("su");
		Thread.sleep(wait);
		errReader = new BufferedReader(
				new InputStreamReader(p.getErrorStream()));
		if (!errReader.ready()) { 
			root = true;
			p.destroy();
		}
		return root;
	}
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

实时统计Android应用的CPU和内存占用

一、应用CPU实时统计1.1CPU总使用情况在proc/stat下有当前设备详细的CPU使用情况.详细格式如下: CPU 152342 1421 28562 1600830 12389 553 2...

如何获取 Android 设备的CPU核数、时钟频率以及内存大小

原帖: http://www.jianshu.com/p/f7add443cd32 Device Year Class 的主要功能是根据 CPU核数、时钟频率 以及 内存大小 对设备进行分级。 下表...

Android编程获取root权限问题

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

Android编程中中root权限的获取

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

Android中可以获取root权限的两种漏洞分析

Android获取root的漏洞有两个——udev 漏洞和adb setuid exhaustion 攻击,我将分别作出介绍。并且依据udev漏洞制作了破解手机root权限的简单软件。 adb se...

Android获取Root权限之后的静默安装实现代码示例分析

Android获取Root权限之后的静默安装实现代码示例分析 作者:  发布日期:2014-02-22 22:42:55 我来说两句(0) 0 Tag标签:Android ...

Android 获取Root权限之后的静默安装实现 代码示例分析&&源码下载

droid开发中,我们有时会遇到一些特殊功能的实现,有些功能并没有太高技术难度,但是如果之前没有接触过就需要花好多时间去研究解决。 今天,总结介绍一下 获取Root权限之后的静默安装和进门卸载功能的...

Android 获取Root权限之后的静默安装实现 代码示例分析

Adroid开发中,我们有时会遇到一些特殊功能的实现,有些功能并没有太高技术难度,但是如果之前没有接触过就需要花好多时间去研究解决。 今天,总结介绍一下 获取Root权限之后的静默安装和进门卸载...

Android入门之旅4—M9系统Root权限获取及目录结构分析

Android入门之旅4—M9系统Root权限获取及目录结构分析 http://www.ucrobotics.com/index.php/zh/forum/18-Android%E6%8A%80...

Android应用程序获取ROOT权限的方法 (基础篇)

要在android应用程序中使用root权限,那么运行程序的设备必须具有root权限   public static boolean runRootCommand(String command) {...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于前篇Android编程获取root权限问题的最终解决与分析 .
举报原因:
原因补充:

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