正文 上一篇《JAVA热更新1:Agent方式热更》我们讲解了JDK提供的Agent方式来实现代码不停服更新, 受限于JDK的Agent一些限制,这种方式无法实现以下功能:只能修改方法体,不能变更方法签名 对于Instrumentation和JVM的agent,网上有不少文章,大家可以自行参考,今天我们来了解下第二种热更方式:动态加载子类热更 核心思路 热更新,顾名思义就是要替换代码实现。 我们期望的热更方式是把修改后的class上传到原路径下并覆盖,那应该如何动态生成子类呢? 关于动态生成类的开源框架有几种:asm、cglib、javaassit,各有利弊。 优缺点对比 两者:都支持对特定逻辑进行热更 热更类型 优点 缺点 Agent方式 对于JVM的类基本都可以热更 只能修改方法体,不能变更方法签名、不能增加和删除方法/类的成员属性。 某些特定情况下,有极低机率导致JVM崩溃(可能是JVM的BUG,暂无法复现) 动态编译新类 因为采用的是新生成,所以支持修改签名,新增方法甚至新增实现等 需要把热更的逻辑按照注册机制编写,否则无法热更
写在前面 本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接: SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.html 为了降低项目的理解难度,关于so的热更新,该项目暂时仅使用arm的so,关于如何在热更时根据so的类型来选择下发什么类型的so,请参考作者之前的文章 SDK热更之如何获取应用在当前设备上的so对应的指令集 SDK的生成只能用命令行,因为分包生成支持热更的SDK是通过shell脚本实现的,直接gradle生成的jar并不可用 Demo中,下载更新直接在主线程,而且没有回调,这里可以优化,因为为了介绍热更,因此对这里没有做太复杂的处理 SDK 关于代码插桩可以参考SDK热更之如何在SDK代码中自动插桩及如何生成补丁包中相关的说明。 SDK初始化及热更流程 为了保证尽可能多的SDK的代码可以通过热更新更新,因此SDK通过先初始化热更模块,然后再初始化SDK的方法,而且比较多的使用了反射来杜绝代码引用引起的无法热更。
由于这部分内容与热更原理关系不大,而且不同项目差异性比较大,因此这里只提供一些思路和想法,不会做重点说明,后续会根据情况进一步完善。 关于安全 热更内容下发通道 怎么保证热更内容下发的安全性,保证下发的热更时自己的后台而且被劫持的后台下发 加载热更新前没有验证合法性 Demo中热更前没有校验热更文件的合法性,怎么保证加载的热更 怎么回滚 SDK的热更新如果遇到异常,怎么回退来降低风险,不让热更变为制造灾难的最后一根稻草 关于运营维护 热补丁和版本的匹配怎么维护 如果热补丁用来做功能发布的话,SDK版本和热补丁之前如果匹配就会很复杂 热更相关的数据上报 热更新因为涉及到功能和bug修复,而且是关键逻辑,他发布以后就会立即生效,因此相关的crash数据、更新次数、成功率、异常问题问题统计等,怎么保证这些数据可以实时发现和查看 怎么控制热更发布 热更新因为涉及到功能和bug修复,而且是关键逻辑,他发布以后就会立即生效,因此他的发布流程就会比较重要,涉及到热更版本的测试要测试哪些内容、灰度发布的策略等。
写在前面 本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接: SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.html 为了解决SDK的热更新,也为了方便大家了解Android热更新,因此开发这个系列。这篇文章主要介绍一下SDK热更Demo相关的内容。 生成支持热更的SDK 修改MD5下local.properies中的ndk.dir和sdk.dir的环境配置 修改MD5下gradle/wrapper/gradle-wrapper.properties ├── *_hash.txt :当前版本的所有类文件的md5,用于后续生成补丁包 │ ├── bihe0832MD5.jar :支持热更的 生成热更使用的补丁包 修改MD5项目目录下FixInfo中的VERSION_NAME、VERSION_CODE、测试热更的bug函数 修改MD5项目目录下MD5文件中的getLowerMD5函数的bug
点击查看 因为我们的SDK热更项目的前提是这个项目是一个完成的SDK,而一个SDK又涉及到SDK库文件、和SDK的demo工程。 SDK热更之Demo体验方法:点击查看 为了方便大家SDK的热更项目,先介绍Demo相关的内容,先让大家熟悉Demo的使用,然后再基于此来了解SDKHotfix的原理,这篇文章就重点介绍Demo的体验方法 ,包括项目运行、补丁生成、热更效果验证等。 SDK热更之Demo工程介绍:点击查看 为了方便大家SDK的热更项目,先介绍Demo相关的内容,先让大家熟悉Demo的使用,然后再基于此来了解SDKHotfix的原理。 SDK热更之gradle插件(如何在SDK代码中自动插桩及如何生成补丁包):点击查看 主要介绍SDK热更中用到的gradle插件,包括怎么插桩、怎么生成补丁的原理;文章主要是介绍原理,没有对具体实现的代码做详细解读
项目代码整洁规范,结构清晰,使用Android最新的开发思想和技术,同时集成React-Native跨平台,主要是为了实验热更功能,涉及到的技术有如下一些: 使用kotlin语言开发,项目使用模块化开发 retrofit2 + okhttp3方式,进行了高度的封装; leakcanary 内存泄漏检测 基于MVI架构airbnb的Mavericks 本地mock alibaba ARouter 集成RN热更功能
别让“热搜”骗了你:大数据如何让新闻更真实?咱们平心而论,现在的媒体报道,有时候看着比电视剧还精彩。动不动就是“震惊体”“爆炸性新闻”,结果点进去发现——嗯,这瓜不新鲜,甚至有的还没熟。为什么会这样? model.predict_proba(news_vector)[0][1]print(f"真实性概率:{prob:.2f}")这只是一个“玩具模型”,但它反映了现实中的核心逻辑:数据不是用来取代记者的,而是帮记者更快、更准地核实事实 四、我的一点感悟:数据可以冰冷,但新闻要有温度我一直觉得,大数据能让新闻更真,但不能让它失去人味。比如算法能告诉我们哪个事件是真的,但为什么这个事件会被误传?它反映了公众怎样的情绪? 这不仅能减少虚假报道,还能让新闻编辑更专注于价值判断——哪些内容该被放大?哪些该被冷处理?哪些是真实的关注?哪些是情绪的共鸣?这些,都将成为新闻真实性的“数据护盾”。
当下,超级IP热正在网络文学、电影电视等领域蔓延,甚至连新华字典也被买断意欲拍成电影。 而在图书出版领域,今年最热的经济类关键词就是“互联网+”,大量书籍大有搭顺风车的意图。
图片来源:芝加哥大学计算机科学系人机集成实验室 薄荷醇创造了皮肤被冷却的感觉,可能模拟了下雪天在外面散步,而辣椒素,这种辛辣食物中代表「辣」的成分,可以创造一种温暖的感觉,模拟的是暴露在热的东西下。
更致命的是,传统 App 不仅内容滞后,连直播字幕错误、互动功能缺失都无法实时修复,彻底沦为 “静态信息看板”。破局的关键藏在 FinClip 热更新技术 中。 这种 “边播边更” 的核心,是用轻量化技术打破 App 的 “版本枷锁”,让融媒体从 “追新闻” 变为 “定义时效”。一、融媒体的 “时效死结”:传统 App 为何追不上新闻速度? 更尴尬的是 直播事故:字幕打错地名、数据标错小数点,只能等下一次版本更新才能修正,导致错误信息持续传播,损害媒体公信力。3. FinClip 则通过 沙箱隔离热修复 解决问题:直播卡顿:技术人员在 FinClip 后台优化视频编码,正在观看直播的用户 自动切换更流畅的码流,无需中断播放;界面错位:发现新闻详情页标题遮挡图片,热更新布局修复包 当融媒体能真正做到 “边播边更”,用户留在 App 里的不再是 “过时新闻”,而是 “正在发生的真相”。
什么是热更新? 不停机更新,实时更新。HotUpdateHotFix Unity中需要APP重启 真正热更新不重启就做更新 为什么做热更新? 改善用户体验(节省流量、时间、操作程度),补丁形式,不用玩家重复下载游戏,就可以对游戏做热修复。 如何做热更新?unity3d热更新的方法? 不同点: IOS不允许某些反射的高级功能,因此不能用DLL的方式做热更新(mono打包时,会自动将反射部分功能禁止) 相同点: 移动端做热更新都是使用Unity3D+lua插件或框架 热更新需要注意的点 代码写的 SLua 没有知名项目,代码质量较好,可以阅读源码 使用静态方法 缺点同ToLua C#Light 使用较少 XLua Tencent开发开源热更新插件 最大优点 平时开发使用C#,遇到有错误的或者有问题需要热修复热更新的时候 ,才对需要热更的脚本方法进行处理。
文章目录 概述: 一、底层方法替换 原理: 二、类加载 原理: 1、java类加载机制 2、Android类加载机制 3、热修复实现原理 二、主流热更新框架介绍 1、Tinker 3、AndFix 4、 Nuwa 参考1 概述: 热修复有两种方式:一方面是阿里系为代表的底层方法替换,另一方面是以腾讯系为代表的类加载方案。 之前分析过微信的热修复框架 Tinker 即属于后者, 《Tinker 接入及源码分析》。 本篇文章主要分析以 AndFix 为代表的底层方法替换方案,并且实现了《深入探索 Android 热修复技术原理》中提到的方法替换新方案。 一、底层方法替换 原理: 参考 方法替换是 AndFix 的热修复方案的关键,虚拟机在加载一个类的时候会将类中方法解析成 ArtMethod 结构体,结构体中保存着一些运行时的必要信息以及需要执行的指令指针地址
应用创建流程更智能 “以应用为中心”的设计理念需求定义存储、端口、依赖、环境变量等一系列应用属性信息。 应用性能分析更敏捷 传统的应用监控方式聚焦于内存、CPU等物理指标,无法针对不同应用程序实现,直接体现应用当前实际的负载压力情况。 Gif - Rainbond动态拓扑图 应用市场更开放 应用市场是Rainbond的重要组件,被作为SaaS化应用的载体、最佳实践和解决方案的共享枢纽,同时也是SaaS的关键组成部分。
应用创建流程更智能 “以应用为中心”的设计理念需求定义存储、端口、依赖、环境变量等一系列应用属性信息。 应用性能分析更敏捷 传统的应用监控方式聚焦于内存、CPU等物理指标,无法针对不同应用程序实现,直接体现应用当前实际的负载压力情况。 Gif - Rainbond动态拓扑图 应用市场更开放 应用市场是Rainbond的重要组件,被作为SaaS化应用的载体、最佳实践和解决方案的共享枢纽,同时也是SaaS的关键组成部分。
(2)高级设置中勾选自动 make,老版 IDEA 需要ctrl + shift + alt + /,选择注册表,勾上 Compiler autoMake allow when app running,但新版中移到高级设置中。
热图是数据分析的基本图形之一,可以方便的表示大量数据的关联关系。 在这里我们使用seaborn绘制热图 我这里直接上代码了 因为是用jupyter notebook做的 #! flights = flights_long.pivot("month", "year", "passengers") # In[8]: flights # In[9]: #那么很明显了,seaborn热图绘制需要的数据格式即为上图
配置自动编译: File | Settings | Build, Execution, Deployment | Compiler: 勾选Build project automatically: 配置热部署 compile.document.save.trigger.delay :100 compile.automake.trigger.delay :100 关闭浏览器缓存 打开浏览器控制台,勾选禁用缓存 或者下载浏览器热部署插件 配置自动编译: File | Settings | Build, Execution, Deployment | Compiler: 勾选Build project automatically: 配置热部署 On“frame” deactivation 表示失去焦点时执行; Update按钮如下图:(快捷键是Ctrl+F10) 关闭浏览器缓存 打开浏览器控制台,勾选禁用缓存 或者下载浏览器热部署插件
背景 最近参与开发一个java项目,每次修改调试时就需要重启进程,由于工程较大,进程初始化任务较多,重启较慢,严重影响了开发效率,因此花了点时间研究java热更新机制,在项目中引入热更新后, 本文会先简单介绍热更新需要使用到的技术:代理、动态字节码修改,然后分别讨论开源热更新工具SpringLoaded和商用热更新工具Jrebel的使用,最后总结下自己破解最新版Jrebel的方式。 2. Java热更新 目前Java热更新主要有三种方式: 定义不同的ClassLoader,当监听到文件变化后,通过新的ClassLoader加载新文件,已有对象的状态需要更新,如果有类的相关依赖还需要手动设置 Jrebel Jrebel是一款商用的热更新工具,收费标准是每年550刀,通过监听指定目录中class文件的变化进行热更新,能够实时增删改方法、属性。 agentpath:指定官网下载的jrebel压缩包中的liejrebel64.so路径,热更时需要用到压缩包中的其他文件,如jrebel.jar,需要保持该压缩包的完整性。
flutter热更新 要热更新flutter页面,我们首先要搞明白我们到底需要动态替换一些什么? 当然是进行热修复了,那么热修复,我们要提供那些文件出来呢,都需要提供吗? 答案是,并不需要都提供,如果是逻辑问题,而且这是我们大概率会遇到的问题,切发生的最多的线上问题,并不涉及到资源的话,我们只需要替换libapp.so即可实现热更新。 我了解到tinker,貌似是可以修复so的,而且王者人生Android端目前原生就是使用tinker来做热修复的,那么,我们是否可以对tinker这个进行利用呢,我们在前面就知道,tinker虽然具备修复 Flutter加载 libapp.so,换句话说,就是想办法让flutter加载tinker为我们准备好的热修复后的so。
1.热部署: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> /artifactId> <optional>true</optional> </dependency> 启动项目是,日志上出现restartedMain就表示热部署成功