从文件路径我们知道有hotfix,应该和热修复有关,深入研究一下。 然而,其hotfix目录下不仅仅是上面的代码,上面也没有讲述其是如何从服务器端拉取热修复的代码的, hotfix下代码如下: ? 代码有点多,我耐着性子看完了,截图中的这一坨代码是为了做补丁管理的,其中就包括从服务端去拉取补丁,然后保存到files下的hotfix目录。 scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect 搜索了一下热修复,原来是2015年很火的一个技术(孤陋寡闻了),现在已经有很多成熟的方案,上述的hotfix
针对生产环境发布新版本后有bug需要紧急修复的情况,协作流程思路:新建对应的hotfix补丁分支,相关开发人员基于hotfix分支进行bug修复,修复完毕验证无误后,同样通过Merge Request合并至主仓库 ,然后由hotfix分支构建重新发布至生产。 本地运行git checkout B-R-XYPJ-S-CAMS-0.11.0,切换至hotfix分支 5.
仿照XLua的官方例子,我们做一个XLua的热更新 1.按照hotfix.md的使用说明 1、添加HOTFIX_ENABLE宏打开该特性(在Unity3D的File->Build Setting-> (建议平时开发业务代码不打开HOTFIX_ENABLE,只在build手机版本或者要在编译器下开发补丁时打开HOTFIX_ENABLE) 2、执行XLua/Generate Code菜单。 3、注入,构建手机包这个步骤会在构建时自动进行,编辑器下开发补丁需要手动执行"XLua/Hotfix Inject In Editor"菜单。 注入成功会打印“hotfix inject finish!”或者“had injected!”。 3.代码实例 在C#代码中我们要将热更新的类添加特性[Hotfix] 这里我们要更改一个Update方法通过XLua的Hotfix [Hotfix] public class CSHotFix :
虽然现在 HotFix 框架已经被作者 dodola 标注了 Deprecated ,但是这并不妨碍我们解析其源码。那么下面我们就开始进入正题。 0x01 首先来看一下 HotFix 项目的结构: HotFix项目结构 可以看到项目中主要分为四个 module : app : 里面有一个 HotFix 用法的 Demo ; buildSrc : // .BugClass"); HotFix.patch(this, dexPath.getAbsolutePath(), "dodola.hotfix.BugClass"); 惊奇地发现 MainActivity 0x03 HotFix 整个逻辑就是上面这样了。但是我们还有一个问题要去解决,那就是我们怎样把 AntilazyLoad 动态引入到构造方法中。 HotFix 使用 javassist 来做到代码动态注入。
热修复框架HotFix解析 采用QQ空间的热修复方案而实现的开源热修复框架就是HotFix,说到了使用dex分包方案会遇到CLASS_ISPREVERIFIED问题,而解决方案就是在dx工具执行之前,将所有的 在HotFix中采用的javassist来达到这个目的,以下是HotFix中的PatchClass.groovy代码 public class PatchClass { /** * 植入代码 答案就在HotFix的app/build.gradle中 apply plugin: 'com.android.application' task('processWithJavassist') << hack_dex.jar hack.jar 还记得之前我们将所有的类的构造方法中都引用了AntilazyLoad.class,所以我们需要把hack_dex.jar插入到dexElements,而在hotfix 通过上面的一系列流程,那么hack_dex.jar已经插入到dexElements最前面了,补丁插入的过程也和hack_dex.jar的插入流程是一致的 到这里,dex分包方案实现热修复的HotFix的分析就已经完毕了
大年初三的时候 v1.12.13+hotfix.7 终于发布了,该版本发布后总算把 1.12.13 版本上的几个大坑填完,算是达到“能用”的稳定版本;同时 1 月 30 号官方也发布了 2020 Flutter 一、1.12.13+hotfix.7 v1.12.13+hotfix.7 版本主要在于解决了我比较关心的三个问题,包括: reportFullyDrawn 异常、华为手机上崩溃、光标和键盘输入异常 这几个问题 ,而这个提交主要是增加了了默认的 _fallbackAffinity 系列的逻辑,官方在本次 hotfix 上将该提交回滚了。 ? image ? image ?
1.新建工程,xlua文件夹与Plugins文件夹放入assets,tools放assets同级目录 2.添加宏:HOTFIX_ENABLE 3.D:\WorkSoft\unity2017.2.0\ 5.注入:执行 ‘XLua > Hotfix Inject In Editor’ 菜单。注入成功会打印 ‘hotfix inject finish!’ 或者 ‘had injected!’ 。" ; 运行HotfixTest场景, 点击Hotfix按钮,出现了热修复,update中代码被改为lua中执行
文章:http://blog.csdn.net/sbsujjbcy/article/details/50812674 Nuwa源码:https://github.com/jasonross/Nuwa HotFix 源码:https://github.com/dodola/HotFix DroidFix源码:https://github.com/bunnyblue/DroidFix 美团Robust -- Instant
所以如果要动态替换 so 的话,在已经加载过 so 的情况下,有2个方式可以再不重启的情况下就能做到 hotfix,要么换 so 的 path,要么就是改变 ClassLoader 对象,这个结论对我们后文的解决方案很有帮助
xxxDispose'"); } private void OnDestroy() { luaEnv.Dispose(); } 要修复的C#脚本类上打上 [Hotfix ] 这个类要修复的函数打上 [LuaCallCSharp] 例如 [Hotfix] public class Test1: MonoBehaviour { [LuaCallCSharp] private void OnTest() { Debug.Log("C#"); } } lua代码如下: local UnityEngine = CS.UnityEngine xlua.hotfix
hotfix分支 hotfix分支用于紧急修复线上的bug。 hotfix分支使得线上bug的紧急修复,与待发布版本的测试、以及新版本的开发活动可以并行,互不干扰。 一个工程有多个hotfix分支,一次hotfix创建一个分支。hotfix分支的生命周期不是永久的,最初起源于master分支,最终归于master和develop分支。 提出hotfix时,“配管”创建一个hotfix分支;bug修改完成、合并回master分支以及develop分支后,“配管”删除该分支。 hotfix分支的命名规则 命名规则:hotfix_yyyymmmdd: yyyymmdd为提出hotfix的日期,一般情况下hotfix的bug必须当天修复、发布。 hotfix流程: ?
release 预发布分支,从合并过feature的develop分支上拉取,测试完成后合并回develop和master hotfix 线上紧急bug修复分支,修复完成后合并develop和master 命名: master、develop、feature以feature/功能名、release以release/功能名、hotfix以hotfix/bug名 分支开发流程图(copy) ? (线上紧急bug) git checkout -b hotfix-0.1.1 master 合并hotfix #合并到master git checkout master git merge --no-ff hotfix-0.1.1 git push #合并到develop git checkout develop git merge --no-ff hotfix-0.1.1 git push # 删除 hotfix分支 git branch -d hotfix-0.1.1 git push origin --delete hotfix-0.1.1 # 打tag git tag -a v0.1.1
hotfix-*** hotfix-userQueryError 以修复功能命名 git flow 流程图参考以下 ? $ git flow hotfix start hotfix-userQueryError Switched to a new branch 'hotfix/hotfix-userQueryError' Summary of actions: - Hotfix branch 'hotfix/hotfix-userQueryError' has been merged into 'master' - The hotfix was tagged 'hotfix-userQueryError' - Hotfix tag 'hotfix-userQueryError' has been back-merged into 'develop' - Hotfix branch 'hotfix/hotfix-userQueryError' has been locally deleted - You are now
正在开发某个 feature,老板突然跳出来说让你做生产上的 hotfix 更是家常便饭,面对这种情况,使用 Git 的我们通常有两种解决方案: 草草提交未完成的 feature,然后切换分支到 hotfix /hotfix/hotfix/JIRA234-fix-naming 运行完该命令,文件目录结构是这样的 . ├── amend-crash-demo ├── feature │ └── feature2 └── hotfix └── hotfix └── JIRA234-fix-naming 6 directories 很显然这不是我们想要的,这时我们就需要 -b 参数的支持了 /hotfix/JIRA234-fix-naming 再来看一下目录结构 . ├── amend-crash-demo ├── feature │ └── feature2 └── hotfix /hotfix/JIRA234-fix-naming 82b8711 [JIRA234-fix-naming] /Users/rgyb/Documents/projects/hotfix/JIRA234
start demo-hotfix Switched to a new branch 'hotfix/demo-hotfix' Summary of actions: - A new branch 'hotfix/demo-hotfix' was created, based on 'master' - You are now on branch 'hotfix/demo-hotfix' 修复问题后 (hotfix/demo-hotfix) $ git flow hotfix finish demo-hotfix Deleted branch hotfix/demo-hotfix (was 48fbada into 'master' - The hotfix was tagged 'demo-hotfix' - Hotfix branch has been back-merged into 'develop ' - Hotfix branch 'hotfix/demo-hotfix' has been deleted 相关链接 commitizen gitflow AngularJS Git Commit
分支定义 分支 名称 作用 master 主分支 用于生产部署,最新稳定版本,一般由 release 或 hotfix 分支合并,任何情况下不允许直接在 master 分支上修改代码。 release 预上线分支 预上线分支,是develop与master之间的一个缓冲,始终保持与 master 分支一致,一般由 develop 或 hotfix 分支合并,不建议直接在 release (UAT) hotfix 紧急修复分支 紧急分支,名规则为 hotfix- 开头,从master生成,bug修正后自动合并到master和develop并且生成tag; develop 测试分支 功能验收测试环境 分支名称x.x.x git fetch git checkout -b hotfix/x.x.x origin/hotfix/x.x.x(拉回hotfix分支) git pull hfx.x(更新hotfix start x.x.x(生成一个hotfix分支) 通知相关得工程师和测试人员hotfix分支名称 git pull origin hotfix/x.x.x(最终测试完成后拉回分支最新代码) git
、Odex 优化 三、Dex 文件拷贝 四、 源码资源 一、修复包 Dex 文件准备 ---- 异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ; package kim.hsl.hotfix 类打包成 dex 文件 ; 进入到 " HotFix\app\build\intermediates\javac\debug\classes " 目录 , 这是生成 Class 字节码的目录 , HotFix 是 Android Studio 工程根目录 ; 删除 " HotFix\app\build\intermediates\javac\debug\classes\kim\hsl\hotfix " 目录中除了 Y:\001_DevelopTools\002_Android_SDK\build-tools\30.0.2\dx.bat –dex --output Y:\002_WorkSpace\001_AS\HotFix \javac\debug\classes\ 指令命令后 , 在 " Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\
prefix=platinum-1.1.1/ HEAD|bzip2 -9 > platinum-1.1.1.tar.bz2 分支设计 主要分支 master 主程序(除非重大 bug,否则使用 hotfix Features(由 develop 分出,开发新功能) Release(由 develop 分出,开发下一版 release) 重大 issue 处理流程 git checkout -b hotfix git commit -a -m "Hotfix: release 1.3.1 by platinum" git checkout master git merge --no-ff hotfix-1.3.1 git tag -a v1.3.1 -m "Hotfix v1.3.1 Tag" git checkout develop git merge --no-ff hotfix-1.3.1 git branch -d hotfix-1.3.1 git push (push develop) git push origin v1.3.1 查看分支结构 git log --graph
为什么有 hotfix 分支我们先来看看为什么有 hotfix 分支。 所以对于线上 BUG,分支管理策略里采取的是基于生产分支创建一个分支(一般取前缀 hotfix-),然后基于该分支修复 BUG 并提交,再基于这个最新的提交记录 A000004 发布系统,将 hotfix 这个时候,线上又发现了一个 BUG,我们又得修复,我们怎么创建新的 hotfix 分支? 如果这个时候我们也可以回滚 dev 分支切出 hotfix 分支也是可以的,但是从 master 切分支明显更快更方便。 为什么要合并 hotfix 分支到 dev 分支在理解了为什么要进行合并操作以后,在 hotfix 分支修复了 BUG 以后,就会将代码合并回 master 分支,准备部署发版,那为什么要将 hotfix
当从已发布版本中发现bug要修复时,就应用到hotfix分支了。 hotfix基于master分支,完成bug修复或紧急修改后,要merge回master,打上一个新的tag,并merge回develop,删除hotfix分支。 [release/] Hotfix branches? [hotfix/] Support branches? [support/] Version tag prefix? : $ git flow hotfix start v0.5.1 此时gitflow从master分支上拉出一个hotfix/v0.5.1的分支,接下来在新分支上修改bug。 最后执行命令: $ git flow hotfix finish v0.5.1 这样hotfix/v0.5.1被merge到master/develop分支,打好v0.5.1这个tag,删除这个分支,切换回