本文同步自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没啥用,只要知道我很长就够了(/滑稽).
今天的文章xposed也要热更新-改分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/20537.html