Android模块化改造:Xposed框架安装与实战指南

更新:11-20 名人轶事 我要投稿 纠错 投诉

大家好,关于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框架安装与实战指南和问题对您有所帮助,还望关注下本站哦!

用户评论

眼角有泪°

终于找到教程了!我一直想试试Xposed框架,不知道怎么安装。

    有6位网友表示赞同!

红尘烟雨

我手机是老版的安卓,听说可以用Xposed来解锁一些高级功能。

    有18位网友表示赞同!

我就是这样一个人

之前听说Xposed很强大,可以修改好多系统设置吗?

    有18位网友表示赞同!

咆哮

学习一下,看看能不能用Xposed提高我的手机性能...

    有8位网友表示赞同!

不要冷战i

刚入手新的安卓手机,这篇文章正好对标。

    有11位网友表示赞同!

丢了爱情i

最近想尝试一些个性化主题,是不是可以用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位网友表示赞同!

【Android模块化改造:Xposed框架安装与实战指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:打造入门级React应用开发环境全攻略 下一篇:免费单机游戏资源网站汇总:免费玩单机游戏的网站推荐前十名