xposed也要热更新-改

2,792 阅读3分钟

本文同步自wing的地方酒馆

前言

去年很早的时候,就写过一篇关于xposed热更新的demo,其实这次的东西早就想写了,但是一直没(lan)时(de)间(xie),所以拖到现在才开始写。

这次我把Xposed热更新写成了一个库,只需要简单两步,即可完成对xposed不重启更改代码的操作。

库的链接如下:github.com/githubwing/…

先来说说怎么使用,使用的方式很简单。

用法:

1.在gradle添加库的依赖,各位老司机肯定轻车熟路了。

2.实现IHookerDispatcher,里面的逻辑就是你本身想写的hook逻辑。

3.在你的入口类里面调用HotXposed.hook()方法。

4.激活模块重启手机( = = ! 第一次肯定还是要重启的,不过以后就不用重启啦)

好了~ 本篇文章到此结束!!

才怪! (作者你原来这么短!!!!),no no no,作者不但不短,而且还很长,下面的内容就来说下原理。毕竟。。 我很长。

原理

之前的文章中,介绍了一种热更新的方式,那就是直接动态加载替换dex。这里延续之前的方法。

每次安装以后,去动态调用apk安装目录的apk里面的dex,然后反射调用即可。

所以,我们需要做的第一件事情就是查找插件apk的安装目录。

这里为了封装为库,绕了点弯子,那就是在库里定义一个接口,叫做IHookerDispatcher

这里主要是为了定义反射调用时候的方法名,不然调用者就要在库外面手写库内的方法名了。

之后要做的事情,就是寻找插件apk的安装目录,那怎么寻找呢,肯定是根据包名寻找了,包名哪里来呢? 当然用户实现的IHookerDispatcher的实现类的包名啦。

哈哈,所以我们定义一个类,叫做HotXposed,用来反射调用实现者的真实逻辑。他需要传入两个参数,一个是实现的具体类,另一个是LoadPackageParam.

然后我们就根据类名得到包名,然后根据包名得到安装目录:

此时,在调用实现类的dispatch方法,即可实现动态替换代码:

这下安装完apk,只要杀死宿主app,就可以不用重启实现代码更新了。

哼,你以为这就完了吗?

不!

我很长

每次都要杀死宿主app,岂不是很蛋疼? 所以,这里建议在MainActivity 使用adb命令 来杀死宿主app,这样我们在编译安装完成后,因为会自动打开MainActivity也就自然帮我们杀死宿主了:

嗯,是不是很方便? 是不是感受到了自动化的魅力?

不过别忘了。

我很长

还有一个问题没有解决,就是每次都会弹出一个对话框提示重启,很烦。

所以我在库内,拦截了这个对话框的弹出,以达到更接近完美的效果!

这下就可以完全enjoy不用重启的xposed的魅力了!!

项目地址如下:github.com/githubwing/…

不用star, star没啥用,只要知道我很长就够了(/滑稽).