热更新方法及装置的制造方法

文档序号:9910782阅读:255来源:国知局
热更新方法及装置的制造方法
【技术领域】
[0001 ]本发明涉及计算机技术领域,尤其涉及一种热更新方法及装置。
【背景技术】
[0002] 在互联网领域,常常需要在服务端对已经发布出去的客户端中出现问题的模块进 行紧急修复更新,以保证系统的稳定性以及用户体验。
[0003] 在现有技术中,热更新通常采用reload方法来对存在问题的模块进行重新加载。 具体的,开发人员对存在问题的脚本模块进行更新,测试通过后将更新后的脚本模块推送 给客户端。客户端接收到更新好的脚本模块后,对脚本模块进行即时编译,之后使用reload 将对应的模块进行重载,重载过后程序在运行时调用新模块,并通过所述新模块生成新的 对象。
[0004] 但是,如果旧模块已经被加载过进内存,旧模块所创建旧的对象仍然指向旧模块, 使得旧的对象没有得到更新。这种情况下需要则需要遍历所有加载过旧模块的对象,将其 中错误的函数和变量逐一替换成新的函数和变量。
[0005] 例如,现在存在一个human的模块,其中定义了 一个Person类,Person类中存在一 个方法is_young用于判断某个Person是否为年轻的。
[0006]
[0007] 上线后,测试人员发现正确的做法应该是年龄(self.age)小于40的才是年轻的。 现有技术中,开发人员会修订这个错误,然后将新的human模块发送给客户端,客户端接收 代码后,客户端接收代码后,覆盖本地的human代码内容,然后执行reload (human)重新加载 human模块,此后新生成的Person对象中判断一个人是否年轻的方法被更新了。
[0008] 然而,re load只解决了加载新代码的问题,而程序中已经被创建出来的旧的 Person对象并没有因此而发生任何改变,旧的Person对象中判断一个人是否年轻的方法依 然是错误的。因此,为了将问题彻底更新,那么还需要遍历所有现有Person对象的对象来刷 新其中的方法以及变量,这是相当棘手以及耗时的。
[0009] 同时,由于需要推送所有出现了问题的Python脚本,那么当问题分布在多个模块 中或者所在模块代码量较大时,需要用户消耗较多的流量获取更新脚本。
[0010]此外,采用reload的方法进行热更新对开发人员来说有很多限制。例如,为了为了 简化reload的复杂度,通常需要约束开发人员不能使用from…import模块的写法。

【发明内容】

[0011] 本发明实施例提出一种热更新方法及装置,能简化客户端热更新的过程,减少热 更新所需的流量,并且减少对开发人员编写热更新代码时受到的限制。
[0012] 本发明一方面提供一种热更新方法,包括:
[0013] 检测当前运行中的程序是否需要进行热更新;
[0014]当确定所述程序需要进行热更新时,从服务器中获取热更新执行代码;所述热更 新执行代码包括标识信息与更新内容代码;所述标识信息用于标识所述程序的模块中需要 被更新的变量或函数;每个所述的变量或函数在内存中存储了对应的本地内容代码;所述 更新内容代码用于替换需要被更新的变量或函数在内存中的本地内容代码;
[0015] 运行所述热更新执行代码,根据所述标识信息查找需要被更新的变量或函数,并 将所述更新内容代码替换所述变量或函数在内存中的本地内容代码,以更新所述变量或函 数的内容;
[0016] 当通过所述模块创建的对象调用所述变量或函数时,以所述更新内容代码作为所 述变量或函数的内容运行。
[0017] 作为更优选地,所述当通过所述模块创建的对象调用所述变量或函数时,以所述 更新内容代码作为所述变量或函数的内容运行,具体包括:
[0018] 当通过所述模块创建的对象调用所述变量或函数时,检查所述变量或函数的内容 相对于所述对象是否有新增的变量;
[0019] 当有新增的变量时,对所述新增的变量初始化赋值,并以所述更新内容代码作为 所述变量或函数的内容运行;
[0020] 当没有新增的变量时,直接以所述更新内容代码作为所述变量或函数的内容运 行。
[0021] 作为更优选地,所述检测运行中的程序是否需要进行热更新,具体包括:
[0022] 获取所述服务器发送的关于当前运行中的程序的热更新推送消息;所述热更新推 送消息包括第一哈希信息;所述第一哈希信息为存储在所述服务器的热更新执行代码的哈 希信息;
[0023] 判断所述第一哈希信息与第二哈希信息是否一致;所述第二哈希信息为存储在本 地的热更新执行代码的哈希信息;
[0024] 若所述第一哈希信息与所述第二哈希信息一致,则确定所述程序不需要进行更 新;
[0025] 若所述第一哈希信息与所述第二哈希信息不一致,则确定所述程序需要进行更 新;
[0026] 在所述运行所述热更新执行代码,根据所述标识信息查找需要被更新的变量或函 数,并将所述更新内容代码替换所述变量或函数在内存中的本地内容代码,以更新所述变 量或函数的内容之后,还包括:
[0027] 存储所述第一哈希信息,并将所述第一哈希信息覆盖所述第二哈希信息。
[0028] 作为更优选地,所述运行所述热更新执行代码,根据所述标识信息查找需要被更 新的变量或函数,并将所述更新内容代码替换所述变量或函数在内存中的本地内容代码, 以更新所述变量或函数的内容,具体包括:
[0029] 计算获取到的热更新执行代码的哈希信息;
[0030] 判断获取到的热更新执行代码的哈希信息与所述第一哈希信息是否一致;
[0031] 若获取到的热更新执行代码的哈希信息与所述第一哈希信息一致,运行所述热更 新执行代码,根据所述标识信息查找需要被更新的变量或函数,并将所述更新内容代码替 换所述变量或函数在内存中的本地内容代码,以更新所述变量或函数的内容。
[0032] 作为更优选地,所述热更新方法还包括:
[0033] 若获取到的热更新执行代码的哈希信息与所述第一哈希信息不一致,则重新从服 务器获取用于对所述程序热更新的热更新执行代码。
[0034] 作为更优选地,所述哈希信息为对应的热更新执行代码的MD5值。
[0035] 本发明另一方面提供一种热更新装置,包括:
[0036] 热更新检测模块,用于检测当前运行中的程序是否需要进行热更新;
[0037] 执行代码获取模块,用于当确定所述程序需要进行热更新时,从服务器中获取热 更新执行代码;所述热更新执行代码包括标识信息与更新内容代码;所述标识信息用于标 识所述程序的模块中需要被更新的变量或函数;每个所述的变量或函数在内存中存储了对 应的本地内容代码;所述更新内容代码用于替换需要被更新的变量或函数在内存中的本地 内容代码;
[0038] 执行代码运行模块,用于运行所述热更新执行代码,根据所述标识信息查找需要 被更新的变量或函数,并将所述更新内容代码替换所述变量或函数在内存中的本地内容代 码,以更新所述变量或函数的内容;
[0039] 对象运行模块,用于当通过所述模块创建的对象调用所述变量或函数时,以所述 更新内容代码作为所述变量或函数的内容运行。
[0040] 作为更优选地,所述对象运行模块具体包括:
[0041] 变量检查单元,用于当通过所述模块创建的对象调用所述变量或函数时,检查所 述变量或函数的内容相对于所述对象是否有新增的变量;
[0042] 第一运行单元,用于当有新增的变量时,对所述新增的变量初始化赋值,并以所述 更新内容代码作为所述变量或函数的内容运行;
[0043] 第二运行单元,用于当没有新增的变量时,直接以所述更新内容代码作为所述变 量或函数的内容运行。
[0044] 作为更优选地,所述热更新检测模块具体包括:
[0045] 推送消息获取单元,用于获取所述服务器发送的关于当前运行中的程序的热更新 推送消息;所述热更新推送消息包括第一哈希信息;所述第一哈希信息为存储在所述服务 器的热更新执行代码的哈希信息;
[0046] 第一判断单元,用于判断所述第一哈希信息与第二哈希信息是否一致;所述第二 哈
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1