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

吐槽&起因

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

所以就花时间想了想有木有不重启就立即生效的办法呢。

Xposed每次都需要重启才能生效,这里我并不知道具体原因,但是大题可以猜测为烧入系统的代码,所以如果代码有变动,必须经过重启。那么有没有只烧一次,就可以动态变动的方法呢?

原理

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

栗子

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

,这里只是方便演示)

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

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

代码热加载,热更新

所以,这个时候,我们把需要写的逻辑代码单独放到一个dex里,然后使用DexFile加载,这时候虽然只烧了一次代码,但是这个烧了以后的代码可以根据动态的dex的代码来进行逻辑变化。

原理很简单,代码也很简单,只需要几句话。

这里为了展示原理,写了最简单的,这里去读取/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哈。

[置顶] Xposed也要热更新的更多相关文章

  1. Xposed也要热更新

    好久没写博客了.这次玩一点不一样的. 吐槽&起因 相信熟悉Xposed的小伙伴们都知道,每次写完Xposed都要重新启动啊.有木有!反射错了,写错了名字.改一个log,都要重新启动啊有木有!重 ...

  2. idea内置tomcat中java代码热更新

    按照上图设置后,然后修改代码后按shift+F9快捷键,即可实现代码更新,这时在debug模式下会看到代码变更后的输出

  3. 深入理解xLua热更新原理

    热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...

  4. [置顶] SQL Server 2005 双机热备的实现

    [置顶] SQL Server 2005 双机热备的实现 分类: SQLSERVER2011-08-24 21:25 901人阅读 评论(0) 收藏 举报 sql servermicrosoftsql ...

  5. 热更新解决方案--tolua学习笔记

    一.tolua使用准备工作:从GitHub上下载tolua(说明:这篇笔记使用的Unity版本是2019.4.18f1c1,使用的tolua是2021年4月9日从GitHub上Clone的tolua工 ...

  6. IOS热更新-JSPatch实现原理+Patch现场恢复

    关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...

  7. ios WaxPatch热更新原理

    以下是引用他人文章内容: 为什么需要 WaxPatch 很多情况下,已经在 AppStore 上线的应用需要紧急缺陷修复,此时便需要使用某些技术手段,使应用程序能够动态下载补丁,进行缺陷修复. 什么是 ...

  8. APP热更新方案

    为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试.向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖安装. 重 ...

  9. 解决Popup StayOpen=true时,永远置顶的问题

    Popup设置了StayOpen=true时,会置顶显示. 如弹出了Popup后,打开QQ窗口,Popup显示在QQ聊天界面之上. 怎么解决问题? 获取绑定UserControl所在的窗口,窗口层级变 ...

随机推荐

  1. python代码结构

    1. 使用#单行注释,使用'''...'''多行注释 2. 使用连接符\来把一行过长的代码分为多行 3. 用缩进来控制代码块,推荐使用PEP8缩进风格,即四个空格 4. if ...: elif... ...

  2. PAT 天梯赛 L1-008. 求整数段和 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-008 AC代码 #include <iostream> #include <cstdio&g ...

  3. 执行用例,并生成报告——discover,HTMLRunner

    HTMLRunner需要下载Python3的格式,懒人链接:http://pan.baidu.com/s/1tp3Ts 参考:http://bbs.chinaunix.net/thread-41547 ...

  4. vs2012编译cocos2dx 3.10报错解决方法

    新建的一个cocos工程没有改过任何代码直接编译居然报错了? 百度了一下原来是因为vs2012不支持c++11的部分特性 cocos2dx 3.10正好就用到了vs2012不支持的那部分特性,所以报错 ...

  5. JavaScript delete用法,属性,特性,执行上下文,激活对象 综合篇

    一.问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug.Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的 ...

  6. Authentication token is no longer valid

    Linux: Authentication token is no longer valid Problem: Authentication token is no longer valid; new ...

  7. Linux 上下左右键变成^A,^B,^C,^D解决方法

    用gedit打开 /etc/vim/vimrc.tiny,将里面的 set compatible 改成 set nocompatible 对于退格键backspace的问题,只需在刚才那句话下面加上一 ...

  8. promise两个参数的具体作用

    Promise通常配合then方法来链式的使用,then方法里面第一个回调函数表示成功状态,也就是resolve通过.then调用,第二个是失败状态-reject通过.Cath调用,如果默认写一个参数 ...

  9. React Native常用组件之ScrollView组件

    一.前言 从iOS开发的经验来看,scrollView无疑是移动开发中很重要的一个组件,比如后面会学到的ListView就是继承自它.那么,在开发中比如:焦点图.引导页等地方都有其的影子,那接下来我们 ...

  10. ES6中Json、String、Map、Object之间的转换

    /** *字符串转json * */ static stringToJson(data){ return JSON.parse(data); } /** *json转字符串 */ static jso ...