xposed也要热更新-改

xposed也要热更新-改去年很早的时候,就写过一篇关于xposed热更新的demo,其实这次的东西早就想写了,但是一直没(lan)时(de)间(xie),所以拖到现在才开始写。 这次我把Xposed热更新写成了一个库,只需要简单两步,即可完成对xposed不重启更改代码的操作。 先来说说怎么使用,使用…

本文同步自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

xposed也要热更新-改

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

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

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

xposed也要热更新-改

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

xposed也要热更新-改

xposed也要热更新-改

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

xposed也要热更新-改

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

哼,你以为这就完了吗?

不!

我很长

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

xposed也要热更新-改

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

不过别忘了。

我很长

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

xposed也要热更新-改

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

xposed也要热更新-改

xposed也要热更新-改

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

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

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

今天的文章xposed也要热更新-改分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/20537.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注