从文件路径我们知道有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
[release/] Hotfix branches? [hotfix/] Support branches? [support/] Version tag prefix? hotfix Manage your hotfix branches. support Manage your support branches. 5. hotfix 分支 用于修复线上代码的 bug 。从 master 分支上拉。完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分支。 我们可以使用 git flow hotfix : git flow hotfix start jartto 看一下执行了什么: Switched to a new branch 'hotfix/jartto 2.这个 hotfix 程序将被标记起来以便于参考。 3.这个 hotfix 分支将被删除,然后切换到 develop 分支上去。
Release Release分支 当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支 Hotfix 分支 当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release Git 维护分支 Hotfix 分支名 hotfix/* hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag ? 开始Hotfix ? g. 完成Hotfix ? Git flow工具 实际上,当你理解了上面的流程后,你完全不用使用工具,但是实际上我们大部分人很多命令就是记不住呀,流程就是记不住呀,肿么办呢? : git flow hotfix start VERSION [BASENAME] 发布一个Hotfix: git flow hotfix finish VERSION ?