Xposed学习三:

在上一篇我们留下问题:handleLoadPackage如何生效即在何时被执行。本篇我们会对Xposed学习一中的操作步骤剖析背后原理。

 先看XposedBridge.class的main:

 1 private static void main(String[] args) {
 2         String startClassName = getStartClassName();
 3             ......
 4             if(initNative()) {
 5                 if(startClassName == null) {
 6                     initXbridgeZygote();
 7                 }
 8                 // 读取/data/data/de.robv.android.xposed.installer/conf/modules.list内容,存储着模块apk的地址,
 9                 // 内容:/data/app/com.jason.learnxposed-2.apk
10                 // 加载模块loadModule(APK,startClassName)
11                 loadModules(startClassName);
12             }
13             ......
14         if(startClassName == null) {
15             ZygoteInit.main(args);
16         } else {
17             RuntimeInit.main(args);
18         }
20     }

main中分两步:loadModules;2 init。loadModules简单先分析这个

 private static void loadModule(String apk, String startClassName) {
      ......
            PathClassLoader mcl = new PathClassLoader(apk, BOOTCLASSLOADER);
            InputStream is = mcl.getResourceAsStream("assets/xposed_init");
            // 读取apk的assets/xposed_init内容,Xposed学习一中的第五步
            if(is == null) {
                log("assets/xposed_init not found in the APK");
            } else {
                BufferedReader moduleClassesReader = new BufferedReader(new InputStreamReader(is));
                    ......
                    if(startClassName == null) {
                        if(moduleInstance instanceof IXposedHookZygoteInit) {
                            StartupParam param = new StartupParam();
                            param.modulePath = apk;
                            ((IXposedHookZygoteInit)moduleInstance).initZygote(param);
                        }

                        if(moduleInstance instanceof IXposedHookLoadPackage) {
                            hookLoadPackage(new Wrapper((IXposedHookLoadPackage)moduleInstance));
                        }

                        if(moduleInstance instanceof IXposedHookInitPackageResources) {
                       hookInitPackageResources(new de.robv.android.xposed.IXposedHookInitPackageResources.Wrapper((IXposedHookInitPackageResources)moduleInstance));
                        }
                    } else if(moduleInstance instanceof IXposedHookCmdInit) {
                        de.robv.android.xposed.IXposedHookCmdInit.StartupParam param1 = new de.robv.android.xposed.IXposedHookCmdInit.StartupParam();
                        param1.modulePath = apk;
                        param1.startClassName = startClassName;
                        ((IXposedHookCmdInit)moduleInstance).initCmdApp(param1);
                    }
                     ......
            }
        }
    }

  简单说下loadModule中步骤,1.读取Xposed_init文本里的内容,里面是我们的类名。我们可以在一个模块中写好几个功能的类,但请注意一定要将类全名字符串写到Xposed_init里且每个类字符串为一行。

时间: 2024-09-28 20:30:42

Xposed学习三:的相关文章

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

Jetty学习三:配置概览-需要配置什么

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理.在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括: 1)ThreadPool Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端只能有一个H

ZigBee学习三 UART通信

ZigBee学习三 UART通信 本实验只对coordinator.c文件进行改动就可以实现串口的收发. 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; unsigned char uartbuf[128];/**************************************************

Spark学习三:Spark Schedule以及idea的安装和导入源码

Spark学习三:Spark Schedule以及idea的安装和导入源码 标签(空格分隔): Spark Spark学习三Spark Schedule以及idea的安装和导入源码 一RDD操作过程中的数据位置 二Spark Schedule 三Idea导入spark源码 一,RDD操作过程中的数据位置 [hadoop001@xingyunfei001 spark-1.3.0-bin-2.5.0]$ bin/spark-shell --master local[2] val rdd = sc.t

mongodb学习(三)

菜鸟啊...先吐槽一下自己 一 准备工作: 1.安装服务端: 去官网下载 http://www.mongodb.org/downloads 其实也自带了客户端 shell 2.安装客户端: mongoVUE http://blog.mongovue.com/ 并不是完全免费 破解方法: http://yhv5.com/mongovue_480.html 将服务端下载下来后直接安装 我下载在D盘也安装在D盘的... 启动mongodb的服务端不需要各种命令....直接鼠标左键双击bin中的mong

c++ boost库学习三:实用工具

noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法. 一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码. 于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了. #include "

scala学习三---文件里读取文本行

学习了scala的基本知识后,发现了scala是集函数式和指令式结合为一体的一种语言,代码更加简洁,但是对于用习惯了java的人来说,还真的不是一件易事~~ 今天学习scala脚本读取文本文件 列子如下: import scala.io.Source if(args.length>0){ for(line <- Source.fromFile(args(0)).getLines) print(line.length+" "+line) }else{ Console.err.

Oracle学习(三):单行函数

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符函数 SQL> --字符串的转换 SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写 2 from dual; SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符 SQL> select substr('Hello World',4) from dual; SQL&

swift学习三:?和!理解

Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: 1 2 3 4 5 var stringValue : String   //error: variable 'stringValue' used before being initialized //let hashValue = stringValue.hashValue //