闲来无事翻译了一下Xposed框架的官方文档,希望对你们有帮助
好的。你想要学习如何创造一个新的Xposed模块?那你就阅读一下这篇教程(或者我们可以称其为广泛的文章)同时学会如何解决它。这里不仅包含“创建文件和插入模块”的技术,还思考了其背后更深层次例如一些有意义的步骤,还有一些你真的需要理解你做的事和你为什么做这件事的含义。如果你感觉像“TL;DR”,你可以仅仅只看在本文末尾的源码,然后阅读“Making the project an Xposed module”这个章节,但是通过阅读整片的教程,你将会有跟深入的理解。你将节约以后阅读这篇文章的时间,因为你不需要自己把所有事情都弄清楚。
The modification subject
你可以复现一个"red clock"项目的样例,该样例也可以在github上被找到
,该项目包括改变状态栏的时钟的颜色为红色,并添加一个笑脸符号。,我选择这个项目的原因是因为它很小,但很容易造成明显的改变,而且,它也使用了一些Xposed框架提供的基础的方法 。
How Xposed words
在开始你的修改之前,你应该粗略的了解一下Xposed框架是如何工作的(你可能会略过这个部分,如果你觉得无聊的话)(“我都无聊到来翻译文章了”)下面就是他的工作原理:
这里有一个进程叫做“Zygote”,它是安卓运行环境的心脏。每一个应用都以它的一个副本(“fork”)而成。这个进程在手机开启的时候运行一个/init.rc脚本。这个进程启动是通过/system/bin/app_process启动的,/system/bin/app_process负责加载必要的类和调用初始化方法 。
这就是Xposed框架发挥作用的地方,当你安装这个框架以后,一个继承了 app_process的可执行文件 就会被拷贝到/system/bin。这个继承了app_process启动过程添加了一个额外的jar包到路径中,而且调用了一些方法在某些地方。例如,仅仅在VM虚拟机被创建之后,Zygote进程就被调用了,甚至比main方法还要早。而且在这个方法内部,我们的Xposed是Zygote进程的一部分,而且可以在其环境中运行,这个jar包被安放在/data/data/de.robv.android.xposed.installer/bin/XposedBridge路径下,而且他的源码能在那里被找到,看看这个类(XposedBridge)(https://github.com/rovo89/XposedBridge/blob/master/src/de/robv/android/xposed/XposedBridge.java),你能看到main方法,这就是我上面所写的,他在进程中非常早的被调用,一些初始化在这里被执行而且一些模块也被加载(我稍后将会介绍模块加载)
Method hooking/replacing
能够“劫持”方法的调用可能给了Xposed框架动力真正的动力,当你通过反编译apk进行修改的时候,你能够直接的插入/改变命令语法按照你的意愿。然而之后,你同样将需要回编译/签名APK,而且你仅仅只能操作整个apk包,通过结合XPosed框架来使用hook技术,你不需要修改方法里面的代码(这里很难给你使用Xposed在哪些具体的地方做出了改变下清楚的定义),相反的你能注入自己的代码在方法之前或之后,这是一种最简便的解决方法在java中。
XposedBridge拥有private,native的hookMethod方法,这个方法实现通过继承app_process,它会改变方法的类型为“native”然后把该连接实现到自己的native方法和一般方法,那意味着无论什么时候只要被hook的方法被调用,普通方法将会被调用取代它,而且不让调用该方法的程序知道。比如这个XposedBridge里面的handleHookMethod方法被调用了,然后再传递参数到方法中被调用,例如传递this引用等等,然后这个方法会负责调已经为这个方法调用注册的回调,通过这些能改变调用方法使用的参数,改变实例/静态的变量,调用其他的方法,在返回的结果上做一些处理,或者跳过,略过任何的东西,总之,他是非常灵活的。
好的,这些理论已经足够了。现在让我们创建一个模块。