Xposed也要热更新

很久没写博客了。此次玩一点不同的。css

吐槽&原由

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

要命啊有木有!android

因此就花时间想了想有木有不从新启动就立刻生效的办法呢。git

Xposed每次都需要从新启动才干生效,这里我并不知道详细缘由,但是大题可以推測为烧入系统的代码,因此假设代码有变更,必须通过从新启动。那么有没有仅仅烧一次。就可以动态变更的方法呢?github

原理

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

栗子

首先,准备hook一下个人zoomheader,在主界面onCreate()的时候,让他弹出一个Toast. (事实上作什么都可以
,这里仅仅是方便演示)app

此时,打开个人app,就可以弹出“哈哈”这个Toast
post

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

插件

代码热载入。热更新

因此,这个时候,咱们把需要写的逻辑代码单独放到一个dex里,而后使用DexFile载入,这时候尽管仅仅烧了一次代码,但是这个烧了之后的代码可以依据动态的dex的代码来进行逻辑变化。

原理很是easy。代码也很是easy,仅仅需要几句话。

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

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

这个时候,仅仅要把hotfix的apk打包,而后提取dex。经过adb push到sdcard, 就可以实现热更新了!

本身主动化热更新

只是这样未免仍是有些麻烦。因此固然要用gradle帮咱们了。

这里要感谢下 @小小张 @神来一巴掌 @pighead

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

写一个任务,叫作pushDex ,并且依赖于transformClassesWithDex。

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

推断adb路径代码 使用了AppMethodOrder的代码,感谢原做者 @三斤-虹猫

项目演示样例代码已经上传至https://github.com/githubwing/HotXposed

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

相关文章
相关标签/搜索