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

吐槽&起因

相信熟悉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. SqlAlchemy基本

    安装SQLAlchemy: $ easy_install sqlalchemy 数据库表是一个二维表,包含多行多列 [ ('1', 'Michael'), ('2', 'Bob'), ('3', 'A ...

  2. Delphi 正则表达式语法(4): 常用转义字符与 .

    Delphi 正则表达式语法(4): 常用转义字符与 . // \d 匹配所有数字, 相当于 [0-9] var   reg: TPerlRegEx; begin   reg := TPerlRegE ...

  3. 微信小程序组件button

    表单组件button:官方文档 Demo Code: var types=['default', 'primary', 'warn']; var pageObject = { data: { defa ...

  4. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) E. Tree Folding

    地址:http://codeforces.com/contest/765/problem/E 题目: E. Tree Folding time limit per test 2 seconds mem ...

  5. Unity 自定义编辑窗体之ScriptableWizard

    当我们在编辑界面要批量设置游戏资源的时候,就需要从UnityEditor里面继承,实现自己的窗口类. 所幸UNITY提供了最简单的一个自定义窗体类,我们直接往上扔public类型的属性就好,提供了确认 ...

  6. ubuntu下关于profile和bashrc中环境变量的理解

    (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(running interactively): 简单地来说,交互式运行就是在 ...

  7. 利用同步网盘搭建个人或团队SVN服务器

    这篇文章是以前写的,现在强烈推荐两个站.1.http://git.oschina.com 2.http://www.coding.net. 推荐理由:1.可创建私有项目.2.免费稳定.3.VS2013 ...

  8. ddt运行报错AttributeError: type object 'TestLogin' has no attribute 'test_login'

    源代码: #!usr/bin/python3 # -*- coding:utf-8 -*- # @Time: 2018/12/17 下午2:07 # @File: do_excel.py # @Sof ...

  9. jQuery图片列表拖拽排序布局

    在线演示 本地下载

  10. centos 6+安装山逗斯骚尅特

    系统支持:CentOS 6+,Debian 7+,Ubuntu 12+ 内存要求:≥128M 关于本脚本 一键安装 Shadowsocks-Python, ShadowsocksR, Shadowso ...