执行具有root权限的java代码(一)

转载 2013年12月05日 16:24:23

本文转自~http://blog.csdn.net/baodinglaolang/article/details/8146272


我们知道,当手机被root后,就可以通过su来执行具有root权限的代码了,但这基本只局限在了shell里面的命令。

比如我们可以执行 am、pm以及android支持的一些linux命令。

一但我们有些个性化需求,这些命令就显的不是那么人性化了。比如杀死100个程序,难道要循环一百次去执行am force-stop吗?显然不是。

本文主要想法是自己制作一个类似am、pm的工具来满足丰富的需求。



先来简要说一下am、pm等shell里面的命令到底是什么

am、pm其实是一个脚本,位置位于frameworks/base/cmds/am,frameworks/base/cmds/pm

以am举例,打开其脚本可以看到

[java] view plaincopy
  1. # Script to start "am" on the device, which has a very rudimentary  
  2. # shell.  
  3. #  
  4. base=/system //根地址  
  5. export CLASSPATH=$base/framework/am.jar  //添加am.jar的java路径  
  6. exec app_process $base/bin com.android.commands.am.Am "$@"   //通过app_process 执行java代码  
稍后讲其工作流程,我们接着看am.jar的源码,位置位于frameworks/base/cmds/am/src

[java] view plaincopy
  1. package com.android.commands.am;  
  2.   
  3. //import ....;  
  4.   
  5. public class Am {  
  6.   
  7. //.....  
  8.   
  9.     /** 
  10.      * Command-line entry point. 
  11.      * 
  12.      * @param args The command-line arguments 
  13.      */  
  14.       public static void main(String[] args) {//程序的主入口,执行后即调用  
  15.         try {  
  16.             (new Am()).run(args);//进行参数解析并执行  
  17.         } catch (IllegalArgumentException e) {  
  18.             showUsage();  
  19.             System.err.println("Error: " + e.getMessage());  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace(System.err);  
  22.             System.exit(1);  
  23.         }  
  24.     }  
  25.   
  26.     private void run(String[] args) throws Exception {  
  27.         if (args.length < 1) {  
  28.             showUsage();  
  29.             return;  
  30.         }  
  31.   
  32.         mAm = ActivityManagerNative.getDefault();  
  33.         if (mAm == null) {  
  34.             System.err.println(NO_SYSTEM_ERROR_CODE);  
  35.             throw new AndroidException("Can't connect to activity manager; is the system running?");  
  36.         }  
  37.   
  38.         mArgs = args;  
  39.         String op = args[0];  
  40.         mNextArg = 1;  
  41.         //通过匹配参数进行不同操作  
  42.         if (op.equals("start")) {  
  43.             runStart();  
  44.         } else if (op.equals("startservice")) {  
  45.             runStartService();  
  46.         } else if (op.equals("force-stop")) {  
  47.             runForceStop();  
  48.         } else if (op.equals("kill")) {  
  49.             runKill();  
  50.         } else if (op.equals("kill-all")) {  
  51.             runKillAll();  
  52.         }  
  53.      //.........      
  54.         else {  
  55.             throw new IllegalArgumentException("Unknown command: " + op);  
  56.         }  
  57.     }  
  58.   
  59.      //.........  
  60.   
  61.   
  62.     private void runForceStop() throws Exception {  
  63.         mAm.forceStopPackage(nextArgRequired());  
  64.     }  
  65.      //.........  
  66.   
  67.     }  
  68. }  


假设我们在shell的环境下执行  am force-stop com.xxx.xxx

实际上是走了如下几步:

1.触发am脚本   就像上面为大家展示的am脚本中的3行代码首先被执行,他起到的作用为首先将am.jar添加到系统的CLASSPATH中,使其jar文件可以被调用。

接下来app_process充当了调用角色,以com.android.commands.am.Am为入口类进行了调用,并传入"$@"参数。这个入口类即上面为大家贴上的Am.java

2.执行am.jar内Am类的对应代码    显然,app_process调用Am类后触发了main函数,并且传入了String[] args参数。am.java中我为大家截取了能说明执行顺序的几个方法

main-->run-->通过匹配参数执行各命令。


这样一来顺序就非常清晰了,原来am通过脚本执行了一个外部的jar文件。由于app_process进程属root组,所以其发起的进程也具有root权限,这也就是为什么类似forcestop之类的特权方法可以被调用。


这样一来,我们的思路也清晰了

1.仿照am.jar制作外部供调用的jar包,这样里面的代码我们就可以完全自定义,想到就心血澎湃啊!

2.通过su执行仿写的am脚本来触发jar包代码

相关文章推荐

android中执行shell脚本或者需要root权限代码的方法

/***************************************************************** *version:android4.2 *author...

java代码执行流程

本文描述了java代码在cpu中运行的整体流程.
  • pulma
  • pulma
  • 2015-12-07 10:11
  • 199

jvm之Java代码的编译和执行

Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:   Java代码编译和执行的整个过程包含了以下三个重要的机...

批处理执行java代码

如何执行Java代码审查

  • 2014-07-29 20:36
  • 80KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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