首页
社区
课程
招聘
[原创]Xposed也要热更新–改
发表于: 2018-3-31 00:18 5222

[原创]Xposed也要热更新–改

2018-3-31 00:18
5222

本文同步自wing的地方酒馆

前言

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

 

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

 

库的链接如下:e80K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Y4K9i4c8Z5N6h3u0%4K9h3&6Y4i4K6u0r3d9r3!0@1h3s2m8G2M7$3g2V1

 

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

用法:

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的魅力了!!

 

项目地址如下:0f0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Y4K9i4c8Z5N6h3u0%4K9h3&6Y4i4K6u0r3d9r3!0@1h3s2m8G2M7$3g2V1

 

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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 43
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
那就占个沙发吧
2018-3-31 00:44
0
雪    币: 13575
活跃值: (6238)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

好强的样纸哟
2018-3-31 09:51
0
雪    币: 20
活跃值: (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好样的,妹子,不过你这么长有什么用。。

你要大才可以。。
2018-3-31 11:52
0
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
无图无真相
2018-3-31 14:27
0
雪    币: 43
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好像你没有实现  handleInitPackageResources
2018-4-1 18:20
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bwn
7
1、  这个方法早就有人使用了。
2、  我还以为你找到了即时  运行开启后也能热更新的方案
3、你那个重启只是杀死,我还以为可以做到如果第一次跑起来自动杀死然后再自动重启。
既然还是杀死,那怎么搞?  我目前只想到了其他app启动,检测是否是重新编译倒是可以解决,就是如何实现自己杀死自己然后还重启,感觉只有用shell了。
2018-4-1 21:55
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我觉得这个方法还没到最完美,但是已经有实战效果了。
2018-5-29 13:19
0
雪    币: 1387
活跃值: (5614)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
9
很好,解决了,很多问题。
2018-5-30 15:50
0
游客
登录 | 注册 方可回帖
返回