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

原文~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 plain copy
  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 plain copy
  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包代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值