热更新原理总结

Kubernetes - Configmap热更新原理 GitHub地址: https://github.com/QingyaFan/container-cloud/issues/2 Kubernetes中提供configmap,用来管理应用的配置,configmap具备热更新的能力,但只有通过目录挂载的configmap才具备热更新能力,其余通过环境变量,通过subPath挂载的文件都不能动态更新。这篇文章里我们来看看configmap热更新的原理,... 阅读详情

Instant Run概述

Instant Run 是 Android Studio2.0 之后新增的一个运行机制,能够减少开发人员第二次及以后的构建时间。

在没有Instant run之前,编译部署应用程序的流程如下图:

在这里插入图片描述
传统的编译部署,需要重新安装APP和重启 APP。这样会很耗时。

使用Instant Run会避免这一情况。

Instant Run基于更改的部分进行构建和部署。

在这里插入图片描述
Instant Run部署有三种方式,Instant Run会根据代码的情况来决定采用哪种部署方式。

  • hot swap——修改一个现有方法中的代码时会采用hot swap,他不需要重启当前Activity即可实现使更改的代码运行
  • warm swap——修改现有资源文件时采用warm swap,他需要重启Activity。
  • cold swap——当增删改一个字段、方法或类时会采用cold swap。他需要重启APP。

Gradle Transform

Gradle Transform是Android官方提供给开发者在项目构建阶段即由class到dex转换期间修改class文件的一套api。

Instant Run修复原理

  • 当第一次构建APP时,Instant Run利用Transform API在每一个类中注入一个叫change的字段
  • change实现了incrementalChange接口。
  • 在每一个方法中添加一个逻辑判断,如果change不为空就执行change的accessdispatch方法,否则执行原方法的逻辑。
  • 当我们修改完对应的代码点击run后,Instant Run会生成对应的patch文件。
  • patch文件中补丁类的名字是修改类的名字+$override,这个类实现了IncrementalChange接口
  • 同时生成一个AppPatchsLoaderImpl类,这个类维护着一个所有修改过的类的列表
  • 通过AppPatchsLoaderImpl将修改过的类中的change字段赋值为生成的xxx$override。

这样就实现了对代码的修改。

ClassLoader 修复代码

类加载方案基于Dex分包方案。

65535限制

Android系统有一个65536限制,意思是应用中引用的方法数不能超过65536个。

产生一个限制的原因是Dalvik Bytecode的限制,Dalvik指令集的方法调用指令invoke-kind索引为16bite,最多应用65536个方法。

LinearAlloc限制

Dalvik中的LinearAlloc是一个固定的缓冲区,当方法数超出了缓存区的大小时会报错。

针对这两个限制,产生了Dex分包方案。Dex分包方案主要做的是在打包时将应用代码分成多个Dex。

将应用启动时必须用到的类和这些类的引用类放到主Dex,其他代码放到次Dex,当应用启动时先加载主Dex,等到启动后再动态加载次Dex。

我们都知道,Android的类加载主要有两个:PathClassLoader和DexClassLoader,他们都是BaseDexClassLoader 的子类。

其中PathClassLoader在应用启动时创建,用于加载apk的dex文件。

DexClassLoader可以加载SD卡上包含dex的.jar和.apk文件。

BaseDexClassLoader 有个字段private final DexPathList pathList,BaseDexClassLoader 的findClass()、findResource()均是基于pathList实现的。

DexPathList 里面有一个Element数组,Element内部封装了DexFile ,DexFile用于加载dex文件,所以每个dex文件对应一个Element。

当通过BaseDexClassLoader 查找一个类时,会通过以下路线进行查找:

  • 调用 BaseDexClassLader 的 findClass(String name)方法
  • 接着交给 DexPathList 的findClass()方法
  • 然后遍历Element数组,调用Element的findClass()方法
  • Element的findClass()方法内部调用DexFile的loadClassBinaryName方法查找类。

当查找到了就直接返回,没有找到就去下一个Element查找。

所以,根据上述的查找流程,我们只需将我们修复后的类打包成Dex文件,存放到Element数组的最前面,这样就会优先从修复后的dex中查找并返回

在这里插入图片描述
具体操作的步骤就是

  • 获得APP的PathClassLoader
  • 通过dex包路径和父加载器创建我们的DexClassLoader
  • 反射得到两个加载器的pathList
  • 反射得到两个pathList的dexElements
  • 创建新的dexElements,将我们的Element放入dexElements最前面
  • 反射赋值给PathClassLoader

代码

由插件化那里搬过来的,忽略插件字眼~

	DexClassLoader dexClassLoader = new DexClassLoader(Environment.getExternalStorageDirectory().getAbsolutePath() + "/classes.dex",
		getCacheDir().getAbsolutePath(), null, getClassLoader());*/

    private void fix() throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException {
        //获取PathClassLoader
        PathClassLoader pathClassLoader =
                (PathClassLoader) getApplicationContext().getClassLoader();

        //分别获取宿主和插件的PathList
        Object suzhuPathList = getPathList(pathClassLoader);
        Object chajianPathList = getPathList(dexClassLoader);

        //获得PathList的element并合并
        Object newElements = mergeElements(getElements(suzhuPathList),
                getElements(chajianPathList));
        Log.d("Lpp", "newElements: " + Array.getLength(newElements));

        //重新设置给宿主的dexElement
        Field field = suzhuPathList.getClass().getDeclaredField("dexElements");
        field.setAccessible(true);
        field.set(suzhuPathList, newElements);
    }

    // 获取DexPathList 中的dexElements
    private static Object getElements(Object suzhuPathList) throws NoSuchFieldException,
            IllegalAccessException {
        Class cl = suzhuPathList.getClass();
        Field field = cl.getDeclaredField("dexElements");
        field.setAccessible(true);
        return field.get(suzhuPathList);
    }

    private static Object mergeElements(Object elements2, Object elements1) {
        Log.d("Lpp", "suzhuPathList: " + Array.getLength(elements1));
        Log.d("Lpp", "chajianPathList: " + Array.getLength(elements2));
        int len1 = Array.getLength(elements1);
        int len2 = Array.getLength(elements2);
        Object newArr = Array.newInstance(elements1.getClass().getComponentType(), len1 + len2);
        for (int i = 0; i < len1; i++) {
            Array.set(newArr, i, Array.get(elements1, i));
        }
        for (int i = len1; i < len1 + len2; i++) {
            Array.set(newArr, i, Array.get(elements2, i - len1));
        }
        return newArr;
    }

    // 获取DexPathList
    private static Object getPathList(Object loader) throws ClassNotFoundException,
            NoSuchFieldException, IllegalAccessException {
        Class cl = Class.forName("dalvik.system.BaseDexClassLoader");
        Field field = cl.getDeclaredField("pathList");
        field.setAccessible(true);
        return field.get(loader);
    }
Reactnative实现远程热更新的原理是什么 利用 RN “JS 层与原生层解耦”的架构,通过“远程下发更新包 → 本地缓存 → 切换加载路径”的流程,实现 JS 业务代码和资源的动态更新,核心目标是绕开应用商店审核,快速迭代。其限制也明确:仅能更新 JS 层,原生层变更仍需走应用商店流程。 阅读详情

相关推荐

深入理解Android Instant Run运行机制

Instant RunInstant Run,是android studio2.0新增的一个运行机制,在你编码开发、测试或debug的时候,它都能显著减少你对当前应用的构建和部署的时间。通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果。而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修

xiangzhihong8的专栏 1万+

深入理解Instant Run——原理篇

前言 Instant-run是Android Studio 2.0开始引入的新特性,它的作用是使开发者在开发时的改动可以很快地被应用,节省开发者的时间。当改动了代码之后,不需要进行完整的构建过程生成新的apk并且重新安装,只是把涉及到改动的部分push到设备上,某些情况下甚至都不需要重启当前Activity,马上就可以看到改动。牛逼啊,简直黑科技。 hotfix(热更新)的使用场景类似instan...

code code code 1759

Android Instant Run的工作原理解析

它通过在应用程序不需要完全重新启动的情况下,仅重新编译和替换发生更改的部分代码,来加快代码更改的应用效果。在使用Instant Run的情况下,开发人员可以立即在运行的应用程序中看到更改的效果,而无需重新构建和重新安装应用程序。只需点击应用程序中的按钮,即可更改文本视图的内容。类替换:Instant Run会将新编译的字节码插入到正在运行的应用程序中,替换旧的代码。首次安装应用程序:应用程序首次安装时,Instant Run会将应用程序的所有代码和资源打包成一个APK文件,并将其安装到设备上。

2301_78484069的博客 257

初识instantRun

背景 公司安卓测试机vivo z1手机 ,apk debug安装时弹对话框“解析错误,解析软件包时出问题” 1、 解决方案 1、关闭安卓studio的 instant run(如下图 对号勾掉) 2、项目工程gradle.properties 下添加 android.injected.testOnly = false(如下图) 初识instant run 那么这个instant ru...

dev晴天的博客 1341

【Unity】YooAsset与HybridCLR:高效资源管理与代码热更的黄金组合

本文深入探讨了Unity开发中YooAsset与HybridCLR的组合应用,为需要长期运营的项目提供了完整的资源与代码热更新解决方案。YooAsset作为高效的资源管理框架,简化了AssetBundle的打包、加载与热更流程;而HybridCLR则攻克了IL2CPP模式下C#代码无法热更的难题。两者结合,实现了从资源到逻辑的平滑在线更新,极大提升了开发迭代与线上维护的效率。

weixin_29006701的博客 279

Nacos2.X 源码分析:为订阅方推送、服务健康检查、集群数据同步、grpc客户端服务端初始化

而Nacos2.X 从http请求改为了grpc请求的方式了,在健康检查这方面就是基于长连接来实现的。客户端发送心跳是在构建grpc连接时会有一个线程每隔5s发送一次,NacosClient端发送心跳的代码在。我们能大致猜测:当一个服务的实例进行了更新,那么是不是应该推送给所有订阅了该服务的客户端?当我订阅了某个服务,是不是应该将该服务信息推送给我?在服务实例检查检查流程中,如果出现了要注销的服务实例就会发布。在服务发现时,进行订阅服务的最后会发布一个。服务注册与服务订阅流程中发布的事件最终会被。

qq_44027353的博客 1593

Android Studio 2.0代码热更新

1.  进入Android Studio2.0打开项目后依次进入 File—>Setting—>Build,Execution,Deployment—>Instant Run查看即时运行的设置项目,你可能会发现勾选项目是灰色的 2. 这个是因为你的project gradle是旧的,点击下Update Project稍等片刻就好。   更新我发现Project gragl

大雄的专栏 7235

Deepseek+Word插件:一键搞定论文翻译与润色的学术写作新革命

本文介绍了Deepseek Word插件如何革新学术写作流程,实现论文翻译与润色的一键操作。该插件深度集成于Word环境,能智能完成中英互译、语法修正、术语统一及逻辑优化,显著提升写作效率与文本质量,是研究者的高效AI助手。

weixin_29252171的博客 512

Webpack 热更新原理

模块热替换(hot module replacement 或 HMR)是webpack提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新一种是页面刷新,不保留页面状态,就是简单粗暴,直接。另一种是基于WDS) 的模块热替换,只需要局部刷新页面上发生变化的模块,同时可以保留当前的页面状态,比如复选框的选中状态、输入框的输入等。可以看到相比于第一种,热更新对于我们的开发体验以及开发效率都具有重大的意义。HMR作为一个Webpack内置的功能,可以通过或--hot开启。

楠姐的博客 1125

使用 Claude Skills 构建专业级 AI Agent:技术实践指南

Claude Skills(也称)是一组基于文件系统的可重用资源包,为 Claude 提供特定领域的专业知识、标准化工作流程和最佳实践。与传统一次性 Prompt 不同,Skills 是持久化、自动触发、支持代码执行的智能模块。让 AI 真正理解并执行你的工作方式。Claude Skills 正在重新定义 AI 助手的边界——从“回答问题”升级为“执行专业工作的能力”。其可组合、可移植、高效、强大的特性,使其成为自动化重复任务、标准化工作流、提升团队效率的理想工具。未来已来。

weixin_44058951的博客 2226

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

轻松理解webpack热更新原理

一、前言 - webpack热更新 Hot Module Replacement,简称HMR,无需完全刷新整个页面的同时,更新模块。HMR的好处,在日常开发工作中体会颇深:节省宝贵的开发时间、提升开发体验。 刷新我们一般分为两种: 一种是页面刷新,不保留页面状态,就是简单粗暴,直接window.location.reload()。 另一种是基于WDS (Webpack-dev-server)的模块热替换,只需要局部刷新页面上发生变化的模块,同时可以保留当前的页面状态,比如复选框的选中状态、输入框

chern1992的博客 1万+

C++ Qt6 qml CMakeLists.txt如何添加qrc文件

本文介绍了在Qt6项目中如何通过CMake管理QML图片资源。相比Qt5的qmake,CMake需要手动创建qrc文件并配置CMakeLists.txt。关键步骤包括:1)创建resources.qrc文件并添加图片资源;2)在CMakeLists.txt中设置CMAKE_AUTORCC为ON开启自动资源处理;3)使用qt_add_resources将qrc文件绑定到项目。配置完成后,可通过"qrc:alias"方式引用资源图片,解决了相对路径管理复杂的问题。

琅嬛福地 1453

热更新及其原理

热更新:是app常用的更新方式,只需下载安装更新部分的代码 工作原理:动态下开发代码,使开发者在不发布新版本的情况下修复bug和发布功能,绕开苹果审核机制,避免长时间的审核以及多次被拒绝造成的成本。 优点:(1)速度快,可以绕过苹果方面的审核,更新数度快; (2)更新资源包小,一般在1M左右,用户不连接wifi也可以随意下载 安全隐患:由于软件热更新绕过了苹果审核,黑客可以在提交正常版本之后,通过热更新的方式导致安全隐患。 热更新原理:(1)如何加载更新文件(补丁包) (2)...

m0_65912225的博客 5668

HyperLynx中层叠设计实例

这两种方式有点区别,前一种方式只是增加层,需要自行修改层的类型,后一种方式可以选定为某一种类型,如果是增加信号层,软件会默认同时增加一层介质层。层叠已经有8层,按照示例的层叠有4个信号层、3个地平面层和1个电源平面层,对照进行层名称(LayerName)、介质类型(Type)及用途(Usage)设置。在这列中,有的是白色,有的是淡蓝色。白色的说明可以修改,如第一行是介质,通常在最外层的介质有两个用途,阻焊层和介质,单击该行会出现一个下拉菜单,选择SolderMask,即为阻焊层。...

小幽余生不加糖 5877

【代码审计】专栏文章汇总

代码审计基础 代码审计基础 源代码审计思路(上) 源代码审计思路(下) 常见漏洞审计 认证会话管理(上) 认证会话管理(下) 输入输出验证 授权管理审计 业务安全审计 第三方组件审计

武天旭的博客 4845

Lua热更新原理与流程

利用第三方Lua热更新库,在Unity中嵌入lua解释器,利用解释器执行lua脚本。需要热更新的时候,从服务器上下载需要更新的代码文件

qq_54476817的博客 5861

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android热更新实现原理

最近Android社区的氛围很不错嘛,连续放出一系列的Android动态加载插件和热更新库,这篇文章就来介绍一下Android中实现热更新的原理。ClassLoader我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器, PathClassLoade

大头鬼Bruce 6万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

webpack热更新原理

webpack热更新原理 文章目录webpack热更新原理一、什么是热更新?二、webpack热更新基本原理1.修改webpack.config.js的entry配置2.启动本地服务3.监听文件发生变化4.监听webpack编译完成5.浏览器收到检查更新通知6.HotModuleReplacementPlugin进行更新 一、什么是热更新? 热更新(Hot Module Replacement,简称HMR)是指在无需刷新整个页面,只更新页面的局部完成更新。HMR是webpack的内置功能,可以通过HotMo

wdhxs的博客 1169

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

理解webpack热更新原理

本文参考链接:https://mp.weixin.qq.com/s/2L9Y0pdwTTmd8U2kXHFlPA 一、开启:HotModuleReplacementPlugin/--hot 二、webpack编译构建后,控制台出现: 1、新的hash值 // 作为下次热更新的标识 2、新的json文件 // h代表新hash,c代表要热更新的模块 3、新的js文件 // 本次修改后的代码 三、热更新实现原理: 1、启动webpack生成...

麦子 2447

Webpack 热更新原理详解

Webpack热更新(HMR)是一种提升开发效率的重要功能,无需重新加载页面即可动态更新代码模块。其原理分为服务端和客户端两部分:服务端通过文件监听检测变化,增量构建生成更新文件;客户端通过WebSocket接收更新,利用module.hot API实现模块动态替换。核心机制包括HotModuleReplacementPlugin注入必要代码、HotModuleReplacementRuntime处理更新逻辑。虽然HMR能保留页面状态,但也存在模块兼容性限制,需注意正确使用相关API。合理运用HMR可显著提

你若盛开,清风自来 2039

Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来先从热更新的基本概念原理及主流热更新方案介绍 开始学习吧!

努力前行,总会成为自己心中的那道光 2万+

Lua热更新原理

将需要频繁更改的逻辑部分独立出来做成DLL(动态链接库(Dynamic Link Library),可以包含类,函数等资源,让其他程序动态加载使用),通过反射机制加载这些DLL,主模块代码不作修改,热更新时用新的dll替换旧的dll,主模块加载dll就起到了更新的效果。通过反射,可以在运行时通过程序集中的元数据来实例化对象、调用方法、获取和设置属性等,而不需要在编译时明确知道这些类型和成员的具体信息,主要用到Type,Assembly,Activator三个类,这里不过多赘述,详细内容可以自行学习。

ccccco1的博客 553

erlang热更新的实现与原理

前面的文章有讲过erlang热更新,只是大概介绍,现在再深入一点讲erlang的模块热更新的实现和原理。erlang的热更新是模块级别的,就是一个模块一个模块更新的。热更新就是在不停止系统的情况下对运行的代码进行替换。文章主要讲erlang如何热更新,热更新的原理,以及热更新会遇到的问题及解决思路。

没有开花的树 5895

热更新原理及实践注意

首先要说明几个概念,不要混用,热部署,热加载; 热部署:就是已经运行了项目,更改之后,不需要重新tomcat,但是会清空内存,重新打包,重新解压war包运行,可能好处是一个tomcat多个项目,不必因为tomcat停止而停止其他的项目。直接重新加载整个应用; 热加载:是基于字节码进行更改的,不释放内存,热加载也可以叫热更新。在运行时重新加载class; 一、Arthas热更新步骤 arth...

hubin1989的专栏 4900

webpack热更新原理-连阿珍都看懂了

前端进阶的必看的模块热更新原理。了解hmr的运行机制,有助于对我们项目运行原理的理解,对项目优化有新的认知~

bigname22的博客 5473
上一篇: Android个人项目插件化总结——插件apk资源加载
下一篇: LeetCode——第162场周赛
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值