博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xposed也要热更新
阅读量:5161 次
发布时间:2019-06-13

本文共 1249 字,大约阅读时间需要 4 分钟。

好久没写博客了。这次玩一点不一样的。

吐槽&起因

相信熟悉Xposed的小伙伴们都知道,每次写完Xposed都要重新启动啊。有木有!反射错了,写错了名字。改一个log,都要重新启动啊有木有!重新启动浪费时间啊有木有!一个字母导致一次重新启动!

要命啊有木有!

所以就花时间想了想有木有不重新启动就马上生效的办法呢。

Xposed每次都须要重新启动才干生效,这里我并不知道详细原因,可是大题能够推測为烧入系统的代码,所以假设代码有变动,必须经过重新启动。那么有没有仅仅烧一次。就能够动态变动的方法呢?

原理

參考android里classloader实现,发现findClass()最后都是调用了DexFile来loadClass,那我们也能够偷懒,不包裹classloader。直接拿DexFile来动态载入我们的代码呀。

栗子

首先,准备hook一下我的zoomheader,在主界面onCreate()的时候,让他弹出一个Toast. (事实上做什么都能够

,这里仅仅是方便演示)

此时,打开我的app,就能够弹出“哈哈”这个Toast

可是,这时候我发现“哈哈”事实上写错了,我想写成”呵呵”,这时候我不得不改动“哈哈”为“呵呵”。然后重新启动。为了这一个字等上个三五六分钟。

代码热载入。热更新

所以,这个时候,我们把须要写的逻辑代码单独放到一个dex里,然后使用DexFile载入,这时候尽管仅仅烧了一次代码,可是这个烧了以后的代码能够依据动态的dex的代码来进行逻辑变化。

原理非常easy。代码也非常easy,仅仅须要几句话。

这里为了展示原理,写了最简单的。这里去读取/sdcard/classes.dex文件。直接导入Hotfix类。调用他的invoke方法。因为弹出toast须要用到activity參数,所以把这个Activity传入就可以。

HotFix代码如图:把Toast逻辑写在了里面。

这个时候,仅仅要把hotfix的apk打包,然后提取dex。通过adb push到sdcard, 就能够实现热更新了!

自己主动化热更新

只是这样未免还是有些麻烦。所以当然要用gradle帮我们了。

这里要感谢下

观察application插件,有个叫做transformClassesWithDex的任务,他就是把class文件转化为dex的任务,这个时候。我们去hook这个任务。在他运行完成以后,自己主动把dex push到/sdcard/中。

写一个任务,叫做pushDex ,而且依赖于transformClassesWithDex。

此时。仅仅要改动完HotFix.java的代码,然后运行Task pushDex。代码就自己主动热更新完成!

推断adb路径代码 使用了的代码,感谢原作者

项目演示样例代码已经上传至

认为实用,能节省时间的话,欢迎star哈。

转载于:https://www.cnblogs.com/llguanli/p/8275445.html

你可能感兴趣的文章
植物大战僵尸中文年度版
查看>>
26、linux 几个C函数,nanosleep,lstat,unlink
查看>>
投标项目的脚本练习2
查看>>
201521123107 《Java程序设计》第9周学习总结
查看>>
Caroline--chochukmo
查看>>
iOS之文本属性Attributes的使用
查看>>
从.Net版本演变看String和StringBuilder性能之争
查看>>
Excel操作 Microsoft.Office.Interop.Excel.dll的使用
查看>>
解决Ubuntu下博通网卡驱动问题
查看>>
【bzoj2788】Festival
查看>>
执行gem install dryrun错误
查看>>
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
C语言初学 俩数相除问题
查看>>