大家好,关于Android模块化改造:Xposed框架安装与实战指南很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
有一个进程称为“Zygote”。从它的名字(中文意思是——个受精卵)来看,这就是Android运行时的核心。每个应用程序都作为其副本(“分支”)启动。 /init.rc 脚本在手机启动时启动此过程。该过程首先完成/system/bin/app_process,加载所需的类并调用初始化方法。
这就是Xpose 发挥作用的地方。安装框架后,扩展的app_process 可执行文件将复制到/system/bin。这个扩展的app_process会将XposedBridge.jar加载到运行时环境中,这样我们就可以在虚拟机启动之前,甚至在Zygote的main方法执行之前做一些我们喜欢的事情(捂脸,其实就是加载插件)。这时候我们的插件就被执行了,是Zygote进程的一部分,所以我们可以直接获取应用程序的上下文,然后做很多超乎想象的事情。 —— 对于任何应用程序,我们都可以挂钩或替换其中的类或方法。目的。而且它已经扎根了。我们可以做任何我们想做的事。
该jar 位于/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar ,其源代码可以在此处找到。查看XposedBridge 类,您可以看到main 方法。这就是我上面写的,一开始就调用的过程。在那里完成了一些初始化,并且还加载了模块(稍后我将回到模块加载)。
方法挂钩/更换
真正创造出Xposed 威力的是“挂钩”方法调用的可能性。通过反编译APK进行修改时,可以在任何地方直接插入/更改命令。但是,之后需要重新编译/签名APK,并且只能分发整个包。使用可以放置Xpose 的钩子,您无法修改方法内部的代码(无法清楚地定义要在哪里进行哪些更改)。相反,您在方法之前和之后注入自己的代码,这是Java中可以明确解决的最小单元。
XposeBridge有一个私有的本地方法hookMethodNative。该方法也在扩展app_process中实现。它将方法类型更改为“本机”,并将方法实现链接到其自己的本机泛型方法。这意味着每次调用挂钩方法时,都会在调用者不知情的情况下调用泛型方法。在这个方法中,handleHookedMethod调用XposedBridge中的方法,向方法调用传递参数,this引用等。然后这个方法负责调用为此方法调用注册的回调。这些可以更改调用的参数、更改实例/静态变量、调用其他方法、对结果执行某些操作.或跳过任何操作。它非常灵活。
安装:
一、安装XposedInstalle(Xposed安装程序)
XposedInstalle.apk下载链接(Android 5.0及以下版本不需要,自行查找):
下载地址,论坛下面有下载地址
下载image.png后,在:中打开软件
Xpose
如果点击后仍然等待较长时间,可以通过其他方式安装。
二、卡刷:
1、下载
SDK 版本Android 版本SDK21Android 5.0 (Lollipop) SDK22Android 5.1 (还有Lollipop) SDK23Android 6.0 (Marshmallow) SDK24Android 7.0SDK25Android 7.1SDK26Android 8.0SDK27Android 8.1 您看到上图中的平台了吗?我是arm64,记住它,下载时选择使用
框架下载链接
点击下载
我还没找到签名的用途。我只下载了框架。以后如果发现有用的话我会写的。
**更新一下,中间出了点问题。当时代码也有问题。我干脆重新安装了,安装了签名,所以能带的话最好带签名。 **
二、安装
将下载的压缩包放在手机根目录下(前提是安装adb或者使用其他方式发送到手机)
adb push xposed-v90.1-sdk27-arm64-beta3-.zip /sdcard 打开并按住电源键和音量+键进入recovery(小米的进入方法,其他手机自行查看),
recovery点击安装,选择压缩包滑进去
安装后重启,手机卡在启动界面。等了半天没反应,我就强行启动了。当我打开软件时,显示框架已安装。
开发模块
一、创建Xposed模块
首先,您需要知道Xposed模块是以APK格式提供的。它本身需要安装在手机上,并且可以像普通应用程序一样启动。只是因为APK中包含一些语句,被Xposed框架检测到。到了,那么同时,你还可以以Xposed模块的形式进行hook操作。那么这些主张是什么?
在AndroidManifest.xml中添加以下声明,
元数据中的内容用于声明是否是插件、插件的描述以及最低兼容的Xpose版本。只需添加3 个元数据。
二、添加依赖
应用plugin:"com.android.application"
安卓{
编译SDK版本28
默认配置{
applicationId "com.example.sxkj_mg.xposeddome"
minSdkVersion 23
目标SDK版本28
版本代码1
版本名称“1.0”
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
构建类型{
发布{
minifyEnabled false
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
}
依赖项{
//主要是下面两行,下面的是自动生成的
仅编译“de.robv.android.xposed:api:82”
//如果需要导入文档方便查看
仅编译“de.robv.android.xposed:api:82:sources”
实现fileTree(dir: "libs", include: ["*.jar"])
实现“com.android.support:appcompat-v7:28.0.0”
实现"com.android.support.constraint:constraint-layout:1.1.3"
测试实现"junit:junit:4.12"
androidTestImplementation "com.android.support.test:runner:1.0.2"
androidTestImplementation "com.android.support.test.espresso:espresso-core:3.0.2"
}
三、创建xposed_init
xposed_init 创建位置在镜像位置创建xposed_init,代码编写为:
# 这是我的。您可以根据自己的路径进行更改。最后一项是文件名。该文件将在稍后创建。
com.example.sxkj_mg.xposeddome.HookModule
修改MainActivity.java
修改idpackage com.example.sxkj_mg.xposeddome;
导入android.support.v7.app.AppCompatActivity;
导入android.os.Bundle;
导入android.widget.TextView;
公共类MainActivity 扩展AppCompatActivity {
私人TextView 电视;
@覆盖
protected void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
电视=findViewById(R.id.tv);
tv.setText("我是渣渣辉");
}
编写HookModule
包com.example.sxkj_mg.xposeddome;
导入android.os.Binder;
导入android.os.Build;
导入android.os.Bundle;
导入android.util.Log;
导入android.widget.TextView;
导入java.lang.reflect.Field;
导入de.robv.android.xposed.IXposedHookLoadPackage;
导入de.robv.android.xposed.XC_MethodHook;
导入de.robv.android.xposed.XposedBridge;
导入de.robv.android.xposed.XposedHelpers;
导入de.robv.android.xposed.callbacks.XC_LoadPackage;
公共类HookModule 实现IXposeHookLoadPackage {
公共静态最终字符串标记="MyHook";
@覆盖
公共无效handleLoadPackage(最终XC_LoadPackage.LoadPackageParam loadPackageParam)抛出Throwable {
Log.d(TAG, "重启手机后执行,说明这个Xpose模块已经生效");
if (loadPackageParam.packageName.equals("com.example.sxkj_mg.xposeddome")){
Log.d(TAG, "进入此应用");
XposeHelpers.findAndHookMethod("com.example.sxkj_mg.xposeddome.MainActivity",loadPackageParam.classLoader,
"onCreate", Bundle.class,new XC_MethodHook(){
@覆盖
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.d(TAG, "这是在钩子方法之前");
super.beforeHookedMethod(param);
}
@覆盖
protected void afterHookedMethod(MethodHookParam param) 抛出Throwable{
Log.d(TAG, "这是在钩子方法之后");
类c=loadPackageParam.classLoader.loadClass("com.example.sxkj_mg.xposeddome.MainActivity");
字段字段=c.getDeclaredField("tv");
字段.setAccessible(true);
Log.d(TAG, "这次我们在这里2");
TextView tv=(TextView) field.get(param.thisObject);
tv.setText("王竞泽");
}
});
}
}
}现在运行它,它将安装在您的手机上。 (前提是手机有USB连接)
当手机开机的时候,还是渣渣辉吗?然后XposedInstalle启用该模块后,手机重启,显示王竞泽。
API介绍
IXposeHookLoadPackage接口:App加载时调用,用于App应用的Hook
回调方法为:handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam)
XC_LoadPackage.LoadPackageParam:包含有关正在加载的应用程序的信息。
XposeHelpers.findAndHookMethod(Hook类、classLoader、方法名、参数、回调对象)
当hook一个方法时,回调对象值! MethodHookParam:包含调用方法相关的信息
更值得关注的是thisObject,它代表调用该方法的对象实例。如果是静态方法
如果是,则返回Null。比如这里调用onCreate()方法的是MainActivity,得到
当然是MainActivity实例。
接下来就是获取成员变量,成员变量分为私有变量和非私有变量。非私有变量直接调用下面的方法。
你可以获得课程
类c=lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
字段字段=c.getField("tv");如果是私有的,需要先设置访问权限(setAccessible)
类c=lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
字段字段=c.getDeclaredField("tv");
字段.setAccessible(true);然后调用获取对象
TextView tv=(TextView) field.get(param.thisObject);
tv.setText("很难预约");
代码外内容
IXposeHookZygoteInit:Zygote启动时调用,用作系统服务的钩子
回调方法initZygote()
IXposeHookInitPackageResources:资源布局初始化时会执行(inflate方法)
回调方法:handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam)
InitPackageResourcesParam包含两个参数,包名和XResource(资源相关)
通过这个XResource对象,你可以获得布局资源树。通过重写hookLayout 方法,
LayoutInflatedParam,里面的view就是布局资源树。你可以遍历它,获取特定的控件,然后进行一些奇特的操作。
XposeHelpers 提供了一些辅助方法
callMethod(Object obj,String methodName, Object…args):调用APP中的具体方法;参数为:调用方法的类、调用方法名称、方法参数。
findClass(String className,ClassLoader classLoader):获取class类实例
参数是类名、类加载器
findMethodExact:通过反射查找类的成员方法(可以用setAccessible(true)设置为非私有)
findConstructorExact:通过反射查找构造函数(也可以设置可访问性)
findAndHookXXX:查找并挂钩
setXxx:通过反射设置对象数据成员的值
setStaticXxx:通过反射设置静态变量的值
XposedBridge.log(“日志内容”):输入日志并写入/data/xposed/debug.log
你可以在那里看到Xposed 安装程序日志!
内部类:通过$symbol链接内部类
您只能挂钩方法和构造函数,而不能挂钩接口和抽象方法。
好了,文章到这里就结束啦,如果本次分享的Android模块化改造:Xposed框架安装与实战指南和问题对您有所帮助,还望关注下本站哦!
【Android模块化改造:Xposed框架安装与实战指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于找到教程了!我一直想试试Xposed框架,不知道怎么安装。
有6位网友表示赞同!
我手机是老版的安卓,听说可以用Xposed来解锁一些高级功能。
有18位网友表示赞同!
之前听说Xposed很强大,可以修改好多系统设置吗?
有18位网友表示赞同!
学习一下,看看能不能用Xposed提高我的手机性能...
有8位网友表示赞同!
刚入手新的安卓手机,这篇文章正好对标。
有11位网友表示赞同!
最近想尝试一些个性化主题,是不是可以用Xposed来实现?
有18位网友表示赞同!
Xposed框架需要root权限吗?
有19位网友表示赞同!
这个教程讲得详细吗?有没有什么需要注意的地方?
有17位网友表示赞同!
我手机不支持Xposed吗?怎么看兼容性?
有12位网友表示赞同!
听说Xposed的模块很多,可以干什么都有。真期待试试!
有6位网友表示赞同!
用Xposed会不会影响手机的稳定性?
有19位网友表示赞同!
我以前安装过类似的框架,用了一下就卸载了,感觉挺麻烦的。
有10位网友表示赞同!
想换个新的启动界面,Xposed能帮我实现吗?
有6位网友表示赞同!
学习一下!也许可以用Xposed来解决我的手机内存问题。
有15位网友表示赞同!
安装的时候会不会出现什么错误?需要提前做好准备吗?
有14位网友表示赞同!
我用安卓系统几年了,还是第一次听说Xposed框架。
有6位网友表示赞同!
感觉这个教程挺适合新手入门学习的...
有14位网友表示赞同!
希望能够顺利安装成功!太激动了!
有17位网友表示赞同!
以后试试Xposed玩弄我的手机...哈哈!
有18位网友表示赞同!
感谢分享这个有用的小技巧!
有6位网友表示赞同!