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

吐槽&起因

相信熟悉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. 快速搭建vue脚手架

    https://segmentfault.com/a/1190000011275993

  2. SQLAlchemy_定义(一对一/一对多/多对多)关系

    目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...

  3. cf100989b

    http://codeforces.com/gym/100989/my B. LCS (B) time limit per test 0.25 seconds memory limit per tes ...

  4. hadoop15---activemq

    java JMS技术 JMS是规范,activeMQ是实现. 用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. 它类似于JDBC,JDBC 是可以用来访问许多不同关系数据库的 API. ...

  5. windows 安装python3.5启动报错:api-ms-win-crt-runtime-l1-1-0.dll丢失

    下载: api-ms-win-crt-runtime就是MFC的运行时环境的库,python在windows上编译也是用微软的visual studio C++编译的,底层也会用到微软提供的C++库和 ...

  6. Hbase:简单介绍一下Hbase表的结构

    HBase 是一个NoSQL数据库,用于处理海量数据,可以支持10亿行百万列的大表,下面我就和大家分享一下数据是如何存放在HBase表中的 为了更好的理解HBase表的思路,先回顾一下关系数据库中表的 ...

  7. react-native navigation的学习与使用

    在很久之前,RN中文网说推荐用react-navigation替代navigator作为新的导航库,从RN 0.43版本开始,官方就已经停止维护Navigator了,所以强烈建议大家迁移到新的reac ...

  8. Linux Shell脚本简介

    Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...

  9. What's the difference between UTF-8 and UTF-8 without BOM?

    https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom ...

  10. BI项目中的ETL设计详解(数据抽取、清洗与转换 )(转载)

    原文:http://www.cnblogs.com/reportmis/p/5939732.html ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直 ...