Android Xposed模块开发详细讲解

Xposed框架是一款进行Android逆向编程时非常有及时效应的一个框架。只需做好依赖,实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口,就可以进行定制,实现各种awesome的功能。

具体了解可前往:

Xposed官网

Xposed Github项目

 

 

 

原理

在不修改apk的情况下Xposed替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),并执行一些初始化操作(执行XposedBridge的main方法)。

开发准备

1.手机获取Root权限

2.安装XposedInstaller

开发流程

1.导入依赖

eclipse环境下,下载XposedBridgeApi-54.jar并导入程序的libs目录
as环境下,添加依赖


provided 'de.robv.android.xposed:api:82'
  //如果需要引入文档,方便查看的话
  provided 'de.robv.android.xposed:api:82:sources'

2.修改配置

在AndroidManifest.xml文件中添加如下三个<meta-data>标签
第一个标签标识是否为Xposed模块
第二个标签为所要开发的Xposed模块的描述信息,可以引用资源第三个标签声明锁开发的Xposed模块所支持的最低Xposed框架版本

<meta-data
    android:name="xposedmodule"
    android:value="true"/>
<!-- 模块描述 -->
<meta-data
    android:name="xposeddescription"
    android:value="description"/>
<!-- 最低版本号 -->
<meta-data
    android:name="xposedminversion"
    android:value="30"/>

3.编写模块

创建一个类或几个类实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口。

 
public class ProductProgram implements IXposedHookLoadPackage {
 
@Override public void handleLoadPackage(final LoadPackageParam packageParam) throws Throwable {   }
}

现在就可以进行hook开发了。
Xposed的XposedHelper类给我们提供了很多已经写好的hook函数,学会灵活使用这些函数是我们使用Xposed必不可少的一部分。
例如hook函数:

findAndHookMethod(createQRUI, "onCreate", Bundle.class, new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        super.beforeHookedMethod(param);
        launcher = (Activity) param.thisObject;
    }

    @Override
    protected void afterHookedMethod(MethodHookParam methodHookParam) throws Throwable {
        super.afterHookedMethod(methodHookParam);
        callCreateAliQrCodeMethod(loadPackageParam);
    }
});

更多hook知识可以查看:

Helper

Android.Hook框架xposed篇

4.声明模块

在项目的assets文件夹下新建xposed_init文本,xposed_init文本中写xposed类的确定路径。xposed_init文本区分大小写
例如:

com.product.module.xpose.ProductProgram

 

 

安装与使用

将程序安装到已支持xposed的手机上,打开xposed installer切换到模块界面,勾选/取消您想/不想起作用的模块,重启手机,ok。

遇坑填坑

1.xposed模块安装后不起作用,可去xposed installer的日志中查看具体原因,如果没有

load class 你在xposed_init中声明的模块路径 则加载模块不成功,需重新加载。

2.xposed模块突然不起作用,查看xposed installers的日志,自行确定问题。

几个小坑

1、xposed加载模块失败,在xposed installer的log中看到提示如下

     java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

     原因:因为没有修改build.gradle文件,默认libs目录下的内容会被包仅apk中,导致和手机上原有的发生了冲突,在build.gradle中把compile修改成provided即可。

2、xposed_init中区分大小写,例如com.zcgames.xposedtest.XModule修改成com.zcgames.XposedTest.XModule,也会导致模块加载失败

3、模块安装后再次使用adb install安装时,提供程序已经安装,需要到设置->应用中找到安装的模块进行卸载(没有activity,无法在桌面卸载)

最后愿大家在填坑的道路上越走越远!

猜你喜欢

转载自blog.csdn.net/shenglong0210/article/details/79033140