CN112379973B - 重载方法和装置 - Google Patents
重载方法和装置 Download PDFInfo
- Publication number
- CN112379973B CN112379973B CN202011388381.7A CN202011388381A CN112379973B CN 112379973 B CN112379973 B CN 112379973B CN 202011388381 A CN202011388381 A CN 202011388381A CN 112379973 B CN112379973 B CN 112379973B
- Authority
- CN
- China
- Prior art keywords
- code module
- virtual machine
- function prototype
- module
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 63
- 244000035744 Hura crepitans Species 0.000 claims abstract description 43
- 238000011161 development Methods 0.000 claims abstract description 37
- 238000012545 processing Methods 0.000 claims abstract description 11
- 238000012544 monitoring process Methods 0.000 claims abstract description 10
- 230000008569 process Effects 0.000 claims description 13
- 230000001419 dependent effect Effects 0.000 claims description 2
- 230000006870 function Effects 0.000 description 60
- 238000010586 diagram Methods 0.000 description 16
- 238000012986 modification Methods 0.000 description 8
- 230000004048 modification Effects 0.000 description 8
- 238000004891 communication Methods 0.000 description 7
- 230000007547 defect Effects 0.000 description 7
- 230000008439 repair process Effects 0.000 description 4
- 238000004590 computer program Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 239000013307 optical fiber Substances 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 241001391944 Commicarpus scandens Species 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45562—Creating, deleting, cloning virtual machine instances
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45575—Starting, stopping, suspending or resuming virtual machine instances
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请提供了一种重载方法和装置。该方法包括:监听应用程序的开发文件中发生修改的代码,并获取用于执行开发文件的虚拟机中代码对应的指定代码模块;对虚拟机中除了指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,并将镜像虚拟机存储至沙盒中;基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块;使用目标代码模块替换虚拟机中的指定代码模块,以对指定代码模块进行热重载,本申请实施例的技术方案不必停止虚拟机的运行,能够减少重载虚拟机中的指定代码模块时对应用程序使用的影响。
Description
技术领域
本申请涉及计算机及通信技术领域,特别涉及一种重载方法和装置。
背景技术
随着技术的不断进步,人们对应用程序的功能要求越来越多,应用程序的开发文件经常需要被修改。
但是,现有技术中修改应用程序的开发文件时通常需要停止应用程序的运行,修改完成后才能恢复应用程序的运行,十分影响用户的体验。
发明内容
本申请旨在提供一种重载方法和装置,其能够在不停止应用程序运行的情况下修改应用程序的开发文件,从而能够在一定程度上提高用户的体验。
根据本申请实施例的一个方面,提供了一种重载方法,包括:监听应用程序的开发文件中发生修改的代码,并获取用于执行所述开发文件的虚拟机中所述代码对应的指定代码模块;对所述虚拟机中除了所述指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,并将所述镜像虚拟机存储至沙盒中;基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块;使用所述目标代码模块替换所述虚拟机中的所述指定代码模块,以对所述指定代码模块进行热重载。
根据本申请实施例的一个方面,提供了一种重载装置,包括:监听模块,配置为监听开发文件中发生修改的代码,并获取用于执行所述开发文件的虚拟机中所述代码对应的指定代码模块;镜像模块,配置为制作所述虚拟机中除了所述指定代码模块之外的文件的镜像,得到镜像虚拟机,并将所述镜像虚拟机存储至沙盒中;重载模块,配置为在所述沙盒中,基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块;替换模块,配置为使用所述目标代码模块替换所述虚拟机中的所述指定代码模块,以对所述指定代码模块进行热重载。
根据本申请实施例的一个方面,所述重载模块配置为:在基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块中,若检测到所述修改后的代码中包含对所述镜像虚拟机中的全局变量进行初始化的语句,则提示重载错误并停止重载。
根据本申请实施例的一个方面,所述重载模块配置为:在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之前,获取所述目标代码模块中的外部局部变量,作为目标外部局部变量;获取所述指定代码模块中的外部局部变量,作为指定外部局部变量;将所述目标外部局部变量,替换为与所述目标外部局部变量对应的指定外部局部变量。
根据本申请实施例的一个方面,所述重载模块配置为:在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之前,获取所述目标代码模块中的父函数原型;查找所述指定代码模块中与所述父函数原型对应的子函数原型,作为所述目标代码模块中与所述父函数原型对应的子函数原型;实例化所述子函数原型;填充实例化后的子函数原型,得到所述目标代码模块中与所述父函数原型对应的子函数。
根据本申请实施例的一个方面,所述重载模块配置为:在所述指定代码模块中,查找所述子函数原型对应的外部局部变量;使用所述子函数原型对应的外部局部变量,填充所述实例化后的子函数原型。
根据本申请实施例的一个方面,所述重载模块配置为:在所述目标代码模块中,获取所述父函数原型对应的外部局部变量列表;在所述父函数原型对应的外部局部变量列表中,查找与所述子函数原型对应的外部局部变量;使用与所述子函数原型对应的外部局部变量,填充所述实例化后的子函数原型。
根据本申请实施例的一个方面,所述重载模块配置为:在基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块的过程中,若检测到需要调用所述镜像虚拟机中的文件对应的功能,则获取所述镜像虚拟机中的安全表,通过所述安全表从所述虚拟机中获取与所述镜像虚拟机中的文件对应的功能。
根据本申请实施例的一个方面,所述替换模块配置为:获取所述目标代码模块中文件的类型,并获取所述指定代码模块中文件的类型;若所述目标代码模块中文件的类型和所述指定代码模块中文件的类型一致,则使用所述目标代码模块替换所述虚拟机中的所述指定代码模块。
根据本申请实施例的一个方面,所述替换模块还配置为:在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之后,获取所述虚拟机中与所述指定代码模块具有依赖关系的相关代码模块,并获取所述指定代码模块与所述相关代码模块之间的依赖关系;基于所述目标代码模块与所述依赖关系,重载所述相关代码模块。
根据本申请实施例的一个方面,提供了一种计算机可读程序介质,其存储有计算机程序指令,当所述计算机程序指令被计算机执行时,使计算机执行上任一项所述的方法。
根据本申请实施例的一个方面,提供了一种电子装置,包括:处理器;存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,实现如上任一项所述的方法。
根据本申请实施例的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各种可选实施例中提供的广告推荐方法。
本申请的实施例提供的技术方案可以包括以下有益效果:
在本申请的一些实施例所提供的技术方案中,通过监听应用程序的开发文件中发生修改的代码,并获取用于执行开发文件的虚拟机中代码对应的指定代码模块,对虚拟机中除了指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,并将镜像虚拟机存储至沙盒中,基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块,不会影响虚拟机的运行,使用目标代码模块替换虚拟机中的指定代码模块,以对虚拟机中指定代码模块进行热重载。可见,本申请实施例的技术方案不必停止开发文件对应的应用程序的运行,从而能够在一定程度上提高用户的体验。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并于说明书一起用于解释本申请的原理。
图1示出了可以应用本申请实施例的技术方案的示例性系统架构的示意图;
图2示意性示出了根据本申请的一个实施例的重载方法的流程图;
图3示意性示出了根据本申请的一个实施例的沙盒示意图;
图4示意性示出了根据本申请的一个实施例的基于Slua热重载Unity 3D的流程图;
图5示意性示出了根据本申请的一个实施例的重载方法的时序图;
图6A示意性示出了本申请的一个实施例的具有缺陷的界面示意图;
图6B示意性示出了本申请的一个实施例的定位缺陷的界面示意图;
图6C示意性示出了本申请的一个实施例的使用本申请的重载方法修复缺陷完成的界面示意图;
图7示意性示出了根据本申请的一个实施例的重载装置的框图;
图8是根据一示例性实施例示出的一种电子装置的硬件图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本申请将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本申请的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本申请的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本申请的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
图1示出了可以应用本申请实施例的技术方案的示例性系统架构100的示意图。
如图1所示,系统架构100可以包括客户端101、网络102和服务器103。网络102用以在发送客户端101和服务器之间提供通信链路的介质。网络102可以包括各种连接类型,例如有线通信链路、无线通信链路等等。
应该理解,图1中的客户端101、网络102和服务器103的数目仅仅是示意性的。根据实现需要,可以具有任意数目的客户端101、网络102和服务器103。比如服务器103服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
在本申请的一个实施例中,服务器103通过监听应用程序的开发文件中发生修改的代码,并获取用于执行开发文件的虚拟机中代码对应的指定代码模块,对虚拟机中除了指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,并将镜像虚拟机存储至沙盒中,基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块,使用目标代码模块替换虚拟机中的指定代码模块,以对虚拟机中指定代码模块进行热重载。可见,本申请实施例的技术方案不必停止开发文件对应的应用程序的运行,从而能够在一定程度上提高用户的体验。
需要说明的是,本申请实施例所提供的重载方法一般由服务器103执行,相应地,重载装置一般设置于服务器103中。但是,在本申请的其它实施例中,客户端101也可以与服务器103具有相似的功能,从而执行本申请实施例所提供的重载方法。
以下对本申请实施例的技术方案的实现细节进行详细阐述:
图2示意性示出了根据本申请的一个实施例的重载方法的流程图,该重载方法的执行主体可以是服务器,比如可以是图1中所示的服务器103。
参照图2所示,该重载方法至少包括步骤S210至步骤S240,详细介绍如下:
在步骤S210中,监听应用程序的开发文件中发生修改的代码,并获取用于执行开发文件的虚拟机中代码所在的指定代码模块。
在本申请的一个实施例中,应用程序可以是Unity3D,可以使用Unity3DFileSystemWatcher(Unity3D文件系统监视程序)监听应用程序的开发文件中发生修改的代码。
在本申请的一个实施例中,代码可以是Lua语言的代码,也可以是其他语言的代码,在此不做限制。
在本申请的一个实施例中,虚拟机可以是Lua虚拟机。
在本申请的一个实施例中,可以基于发生修改的代码在虚拟机中查找该代码对应的指定代码模块。
在本申请的一个实施例中,代码对应的指定代码模块是将代码加载至虚拟机中得到的。
在本申请的一个实施例中,虚拟机中可以包括模块、函数、变量等多种文件。
在步骤S220中,对虚拟机中除了指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,并将镜像虚拟机存储至沙盒中。
在本申请的一个实施例中,可以通过复制虚拟机中除了指定代码模块之外的文件,以对虚拟机中除了指定代码模块之外的文件进行镜像处理。
在本申请的一个实施例中,沙盒(sandbox)又称沙箱,能够为镜像代码模块提供与虚拟机相隔离的环境。
在本申请的一个实施例中,可以使用环境变量(Environment Variables,ENV)指令创建沙盒。
在步骤S230中,基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块。
在本申请的一个实施例中,发明人发现,程序状态分为两种类型数据:全局变量和外部局部变量(Upvalue),因此,在将修改后的代码加载至镜像虚拟机,得到目标代码模块的过程中,若检测到修改后的代码中包含对镜像虚拟机中的全局变量进行初始化的语句,则提示重载错误并停止重载,以避免了全局变量在热重载时的重置,从而保留了程序状态,也不会增加开发成本。在该实施例中,如果应用需要用户登录,则可以在导航层次结构中向下几个级别修改并重新加载页面,而无需重新输入登录凭据,方便用户使用。
在本申请的一个实施例中,可以设置沙盒元表(metatable)的元方法(__newindex)指向错误(error)函数,当模块初始化时如有全局变量初始化时产生错误(error)并停止重载,保证了虚拟机的正确性。
在本申请的一个实施例中,可以获取目标代码模块中的外部局部变量,作为目标外部局部变量;获取指定代码模块中的外部局部变量,作为指定外部局部变量;将目标外部局部变量,替换为与目标外部局部变量对应的指定外部局部变量,以将目标代码模块中的外部局部变量的状态保留,从而方便用户使用。
在本申请的一个实施例中,可以获取目标代码模块中的父函数原型;查找指定代码模块中与父函数原型对应的子函数原型,作为目标代码模块中与父函数原型对应的子函数原型;实例化子函数原型;填充实例化后的子函数原型,得到目标代码模块中与父函数原型对应的子函数,以解决目标代码模块中子函数更新的问题,从而解决了重载后不存在子函数的问题。
在该实施例中,在实际开发中给UI(User Interface用户界面)控件添加Lua事件的示意性代码可以为:
可见,被点击事件(onClick事件)持有的局部函数在重载时不存在,所以也就无法重载,而发明人通过分析发现,可以通过虚拟机中的子函数原型得到子函数,通过该实施例中的方法就有效的解决了子函数重载的问题,解决了重载业界的一个难点。
在本申请的一个实施例中,可以在指定代码模块中,查找子函数原型对应的外部局部变量;使用子函数原型对应的外部局部变量,填充实例化后的子函数原型。
在本申请的一个实施例中,可以在目标代码模块中,获取父函数原型对应的外部局部变量列表;在父函数原型对应的外部局部变量列表中,查找与局部函数原型对应的外部局部变量;使用与子函数原型对应的外部局部变量,填充实例化后的子函数原型。
在本申请的一个实施例中,可以将局部函数的原型作键值遍历虚拟机,以更新虚拟机中引用该子函数的函数。
在本申请的一个实施例中,在将修改后的代码加载至镜像虚拟机,得到目标代码模块的过程中,若检测到需要调用镜像虚拟机中的文件对应的功能,则获取镜像虚拟机中的安全表,通过安全表从虚拟机中获取与镜像虚拟机中的文件对应的功能。
图3示意性示出了根据本申请的一个实施例的沙盒示意图,如图3所示,使用环境变量(Environment Variables,ENV)指令创建沙盒300,沙盒中包括元表(metatable)301、虚拟机中除了指定代码模块之外的文件的镜像302、安全表303和目标代码模块304,元表(metatable)301的元方法(__newindex)指向错误(error)函数;若检测到得到目标代码模块304向虚拟机中除了指定代码模块之外的文件的镜像302和安全表303发送调用需求,可以检测调用需求是否安全,如果安全,则从虚拟机中除了指定代码模块之外的文件的镜像302和安全表303中获取与镜像虚拟机中的文件对应的功能。具体的,目标代码模块304向虚拟机中除了指定代码模块之外的文件的镜像302发送的是调用镜像虚拟机中保存的虚拟机中除了指定代码模块之外的文件的镜像文件的需求,目标代码模块304向安全表303中发送的是调用镜像虚拟机中的文件在虚拟机中对应的功能的需求。
继续参照图2,在步骤S240中,使用目标代码模块替换虚拟机中的指定代码模块,以对指定代码模块进行热重载。
在本申请的一个实施例中,可以获取目标代码模块中的目标代码的类型,并获取指定代码模块中与目标代码对应的代码的类型;若目标代码的类型和指定代码模块中与目标代码对应的代码的类型一致,则使用目标代码模块替换虚拟机中的指定代码模块。
在本申请的一个实施例中,若目标代码的类型和指定代码模块中与目标代码对应的代码的类型不一致,则可以拒绝并结束整个重载流程。
在本申请的一个实施例中,可以获取镜像虚拟机中与指定代码模块具有依赖关系的相关代码模块,并获取指定代码模块与相关代码模块之间的依赖关系;基于目标代码模块与依赖关系,以对于指定代码模块相关的相关代码模块进行热重载。
在本申请的一个实施例中,可以利用记录路径在虚拟机中找到引用指定代码模块的相关代码模块进行替换。
在图2的实施例中,通过监听应用程序的开发文件中发生修改的代码,并获取用于执行开发文件的虚拟机中代码对应的指定代码模块,对虚拟机中除了指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,以为沙盒营造沙盒初始化时的虚拟环境,并将镜像虚拟机存储至沙盒中,在沙盒中将修改后的代码加载至镜像虚拟机,得到目标代码模块,不会影响虚拟机的运行,使用目标代码模块替换虚拟机中的指定代码模块,以对虚拟机中指定代码模块进行热重载。可见,本申请实施例的技术方案不必停止开发文件对应的应用程序的运行,从而能够在一定程度上提高用户的体验。
在该实施例中,在沙盒中加载修改后的代码,将热重载逻辑限制在沙盒中进行不污染到整个虚拟机,即使热重载失败也不会影响虚拟机的正确性,也避免了修改从沙盒溢出至虚拟机中,避免影响虚拟机的运行。
图4示意性示出了根据本申请的一个实施例的基于Slua热重载Unity 3D的流程图,该重载方法的执行主体可以是服务器,比如可以是图1中所示的服务器103。
参照图4所示,该重载方法至少包括步骤S410至步骤S460,详细介绍如下:
在步骤S410中,文件系统监视程序的监听指令(FileSystemWatcher.OnChage)在Unity 3D的开发文件层监听开发文件中文件或模块中的代码修改(File/Modulechanged)。
在步骤S420中,应用编辑器的更新指令(EditorApplication.Update)主线程在界面层获取修改后的代码,并进行Slua_c编译。
在本申请的一个实施例中,可以将修改后的代码存储至Unity 3D的开发文件层的内存(bytecode)中。
在步骤S430中,触发热重载。
在本申请的一个实施例中,可以是Lua虚拟机通过Slua.DoBuffer加载代码文件(或者bytecode)到虚拟机并执行,以触发热重载。
在本申请的一个实施例中,触发热重载可以包括括沙盒的创建,镜像虚拟机的创建等一些初始化。
在本申请的一个实施例中,镜像虚拟机的创建可以包括在沙盒中对虚拟机中除了指定代码模块之外的文件进行镜像处理,得到镜像虚拟机。
在步骤S440与步骤S450中,在Unity 3D的开发文件层中,使用加载器(loader)从指定内存(bytecode)加载编译后的修改后的代码至镜像虚拟机得到目标代码模块。
在本申请的一个实施例中,可以使用sandbox.require将修改后的代码加载至沙盒中得到目标代码模块。
在步骤S460中,在虚拟机中使用目标代码模块替换指定代码模块,同时更新虚拟机中引用了指定代码模块的相关代码模块。
在图4的实施例中,本申请的重载方案分为两个系统:文件监听系统和重载系统。文件监听系统,功能是用来发现哪些代码有修改,这部分利用Unity3D FileSystemWatcher完成。重载系统,功能是加载修改后的代码然后替换内存中的代码所在的指定代码模块,从而使代码快速生效。当Unity 3D的开发文件层监听系统监听到代码修改后触发重载系统进行重载生效最新应用程序。
图5示意性示出了根据本申请的一个实施例的重载方法的时序图,该重载方法的执行主体可以是服务器,比如可以是图1中所示的服务器103。
参照图5所示,该重载方法至少包括步骤S510至步骤S580,详细介绍如下:
在步骤S510中,启动Unity Editor;
在步骤S520中,给Slua增加加载器,方便Slua从指定内存加载修改后的代码;
在步骤S530中,文件系统监听程序的监听指令(FileSystemWatcher.OnChage)监听代码修改增加至代码列表中;
在步骤S540中,在应用编辑器的更新指令(EditorApplication.Update)主线程获取修改后的代码列表,并进行Slua编译然后通过Slua触发重载系统;
在步骤S550中,沙盒初始化,制作虚拟机中除了指定代码模块之外的文件的镜像,得到镜像虚拟机;
在步骤S560中,将修改后的代码加载至镜像虚拟机得到目标代码模块;
在步骤S570中,替换目标代码模块与指定代码模块中需要替换的子函数、全局变量和外部局部变量(Upvalue)等;
在步骤S580中,将镜像虚拟机中相关代码模块的镜像模块引用目标代码模块的关系,还原为相关代码模块的镜像模块引用指定代码模块,将虚拟机中的相关代码模块进行更新,替换更新后的相关代码模块与更新之前的相关代码模块中需要替换的子函数、全局变量和外部局部变量(Upvalue)等。
在图5的实施例中,整个流程没有重启Unity3D Editor,在Unity 3D的开发文件层中修改代码再保存就自动触发热重载快速生效,大幅提高了开发效率。
在本申请的一个实施例中,可以用本申请的方案修复应用程序的缺陷(bug),如图6A,图6A示意性示出了本申请的一个实施例的具有缺陷的应用程序的界面示意图,当点击弹窗关闭时出现了一些bug导致无法关闭,并显示了bug详情。定位到bug如图6B,图6B示意性示出了本申请的一个实施例的定位应用程序缺陷的界面示意图,如图6B中右侧所示后,修复并保存文件立马就会进行热重载,生成热重载日志。热重载完成后再次点击关闭按钮验证bug已经修复弹窗已经关闭也没有错误日志,如图6C,图6C示意性示出了本申请的一个实施例的使用本申请的重载方法修复应用程序的缺陷完成的界面示意图。
可见,在热修复bug中,Unity3D Editor一直处于运行状态,修复bug后只需要保存一下代码就立马生效了。对比一般的流程中间省去了编译、打包、重启Unity3D Editor、复现UI栈,而且这一过程开发的思路容易打断,初步统计效率可提高83.16%。这仅只是一次修复的过程的效率对比,随着次数增加提升效率更加明显。
在本申请的一个实施例中,本申请的重载方案可以开着Unity3D Editor一边开发新功能立马就能生效新功能。
以下介绍本申请的装置实施例,可以用于执行本申请上述实施例中的重载方法。对于本申请装置实施例中未披露的细节,请参照本申请上述的重载方法的实施例。
图7示意性示出了根据本申请的一个实施例的重载装置的框图。
参照图7所示,根据本申请的一个实施例的重载装置700,包括监听模块701、镜像模块702、重载模块703和替换模块704。
在本申请的一些实施例中,基于前述方案,监听模块701配置为监听开发文件中发生修改的代码,并获取用于执行开发文件的虚拟机中代码对应的指定代码模块;镜像模块702配置为制作虚拟机中除了指定代码模块之外的文件的镜像,得到镜像虚拟机,并将镜像虚拟机存储至沙盒中;重载模块703配置为基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块;替换模块704配置为使用目标代码模块替换虚拟机中的指定代码模块,以对指定代码模块进行热重载。
根据本申请实施例的一个方面,重载模块703配置为:在基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块中,若检测到修改后的代码中包含对镜像虚拟机中的全局变量进行初始化的语句,则提示重载错误并停止重载。
根据本申请实施例的一个方面,重载模块703配置为:在使用目标代码模块替换虚拟机中的指定代码模块之前,获取目标代码模块中的外部局部变量,作为目标外部局部变量;获取指定代码模块中的外部局部变量,作为指定外部局部变量;将目标外部局部变量,替换为与目标外部局部变量对应的指定外部局部变量。
根据本申请实施例的一个方面,重载模块703配置为:在使用目标代码模块替换虚拟机中的指定代码模块之前,获取目标代码模块中的父函数原型;查找指定代码模块中与父函数原型对应的子函数原型,作为目标代码模块中与父函数原型对应的子函数原型;实例化子函数原型;填充实例化后的子函数原型,得到目标代码模块中与父函数原型对应的子函数。
根据本申请实施例的一个方面,重载模块703配置为:在指定代码模块中,查找子函数原型对应的外部局部变量;使用子函数原型对应的外部局部变量,填充实例化后的子函数原型。
根据本申请实施例的一个方面,重载模块703配置为:在目标代码模块中,获取父函数原型对应的外部局部变量列表;在父函数原型对应的外部局部变量列表中,查找与子函数原型对应的外部局部变量;使用与子函数原型对应的外部局部变量,填充实例化后的子函数原型。
根据本申请实施例的一个方面,重载模块703配置为:在基于镜像虚拟机将修改后的代码加载至沙盒中,得到目标代码模块的过程中,若检测到需要调用镜像虚拟机中的文件对应的功能,则获取镜像虚拟机中的安全表,通过安全表从虚拟机中获取与镜像虚拟机中的文件对应的功能。
根据本申请实施例的一个方面,替换模块704配置为:获取目标代码模块中文件的类型,并获取指定代码模块中文件的类型;若目标代码模块中文件的类型和指定代码模块中文件的类型一致,则使用目标代码模块替换虚拟机中的指定代码模块。
根据本申请实施例的一个方面,替换模块704还配置为:在使用目标代码模块替换虚拟机中的指定代码模块之后,获取虚拟机中与指定代码模块具有依赖关系的相关代码模块,并获取指定代码模块与相关代码模块之间的依赖关系;基于目标代码模块与依赖关系,重载相关代码模块。
所属技术领域的技术人员能够理解,本申请的各个方面可以实现为系统、方法或程序产品。因此,本申请的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
下面参照图8来描述根据本申请的这种实施方式的电子设备80。图8显示的电子设备80仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图8所示,电子设备80以通用计算设备的形式表现。电子设备80的组件可以包括但不限于:上述至少一个处理单元81、上述至少一个存储单元82、连接不同系统组件(包括存储单元82和处理单元81)的总线83、显示单元84。
其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元81执行,使得所述处理单元81执行本说明书上述“实施例方法”部分中描述的根据本申请各种示例性实施方式的步骤。
存储单元82可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)821和/或高速缓存存储单元822,还可以进一步包括只读存储单元(ROM)823。
存储单元82还可以包括具有一组(至少一个)程序模块825的程序/实用工具824,这样的程序模块825包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线83可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备80也可以与一个或多个外部设备(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备80交互的设备通信,和/或与使得该电子设备80能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口85进行。并且,电子设备80还可以通过网络适配器86与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器86通过总线83与电子设备80的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备80使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本申请实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本申请实施方式的方法。
根据本申请一个实施例,还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施方式中,本申请的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述“示例性方法”部分中描述的根据本申请各种示例性实施方式的步骤。
根据本申请一个实施例,用于实现上述方法的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本申请的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
此外,上述附图仅是根据本申请示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围执行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
Claims (9)
1.一种重载方法,其特征在于,包括:
监听应用程序的开发文件中发生修改的代码,并获取用于执行所述开发文件的虚拟机中所述代码对应的指定代码模块;
对所述虚拟机中除了所述指定代码模块之外的文件进行镜像处理,得到镜像虚拟机,并将所述镜像虚拟机存储至沙盒中;
基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块;
使用所述目标代码模块替换所述虚拟机中的所述指定代码模块,以对所述指定代码模块进行热重载;
在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之前,所述方法还包括:
获取所述目标代码模块中的父函数原型;
查找所述指定代码模块中与所述父函数原型对应的子函数原型,作为所述目标代码模块中与所述父函数原型对应的子函数原型;
实例化所述子函数原型;
填充实例化后的子函数原型,得到所述目标代码模块中与所述父函数原型对应的子函数。
2.根据权利要求1所述的重载方法,其特征在于,还包括:
在基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块的过程中,若检测到所述修改后的代码中包含对所述镜像虚拟机中的全局变量进行初始化的语句,则提示重载错误并停止重载。
3.根据权利要求1所述的重载方法,其特征在于,在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之前,所述方法还包括:
获取所述目标代码模块中的外部局部变量,作为目标外部局部变量;
获取所述指定代码模块中的外部局部变量,作为指定外部局部变量;
将所述目标外部局部变量,替换为与所述目标外部局部变量对应的指定外部局部变量。
4.根据权利要求1所述的重载方法,其特征在于,所述填充实例化后的子函数原型,包括:
在所述指定代码模块中,查找所述子函数原型对应的外部局部变量;
使用所述子函数原型对应的外部局部变量,填充所述实例化后的子函数原型。
5.根据权利要求1所述的重载方法,其特征在于,所述填充实例化后的子函数原型,包括:
在所述目标代码模块中,获取所述父函数原型对应的外部局部变量列表;
在所述父函数原型对应的外部局部变量列表中,查找与所述子函数原型对应的外部局部变量;
使用与所述子函数原型对应的外部局部变量,填充所述实例化后的子函数原型。
6.根据权利要求1所述的重载方法,其特征在于,
在基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块的过程中,
若检测到需要调用所述镜像虚拟机中的文件对应的功能,则获取所述镜像虚拟机中的安全表,通过所述安全表从所述虚拟机中获取与所述镜像虚拟机中的文件对应的功能。
7.根据权利要求1所述的重载方法,其特征在于,所述使用所述目标代码模块替换所述虚拟机中的所述指定代码模块,包括:
获取所述目标代码模块中文件的类型,并获取所述指定代码模块中文件的类型;
若所述目标代码模块中文件的类型和所述指定代码模块中文件的类型一致,则使用所述目标代码模块替换所述虚拟机中的所述指定代码模块。
8.根据权利要求1所述的重载方法,其特征在于,在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之后,所述方法还包括:
获取所述虚拟机中与所述指定代码模块具有依赖关系的相关代码模块,并获取所述指定代码模块与所述相关代码模块之间的依赖关系;
基于所述目标代码模块与所述依赖关系,重载所述相关代码模块。
9.一种重载装置,其特征在于,包括:
监听模块,配置为监听开发文件中发生修改的代码,并获取用于执行所述开发文件的虚拟机中所述代码对应的指定代码模块;
镜像模块,配置为制作所述虚拟机中除了所述指定代码模块之外的文件的镜像,得到镜像虚拟机,并将所述镜像虚拟机存储至沙盒中;
重载模块,配置为基于所述镜像虚拟机将修改后的代码加载至所述沙盒中,得到目标代码模块;
替换模块,配置为使用所述目标代码模块替换所述虚拟机中的所述指定代码模块,以对所述指定代码模块进行热重载;
在使用所述目标代码模块替换所述虚拟机中的所述指定代码模块之前,所述重载模块还配置为:
获取所述目标代码模块中的父函数原型;
查找所述指定代码模块中与所述父函数原型对应的子函数原型,作为所述目标代码模块中与所述父函数原型对应的子函数原型;
实例化所述子函数原型;
填充实例化后的子函数原型,得到所述目标代码模块中与所述父函数原型对应的子函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011388381.7A CN112379973B (zh) | 2020-12-01 | 2020-12-01 | 重载方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011388381.7A CN112379973B (zh) | 2020-12-01 | 2020-12-01 | 重载方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112379973A CN112379973A (zh) | 2021-02-19 |
CN112379973B true CN112379973B (zh) | 2023-10-24 |
Family
ID=74589642
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011388381.7A Active CN112379973B (zh) | 2020-12-01 | 2020-12-01 | 重载方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112379973B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116048735B (zh) * | 2023-03-23 | 2023-08-29 | 阿里云计算有限公司 | 信息处理方法以及对象共享方法 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7941813B1 (en) * | 2006-02-17 | 2011-05-10 | Parallels Holdings, Ltd. | System and method for using virtual machine for driver installation sandbox |
CN102402427A (zh) * | 2010-09-09 | 2012-04-04 | 阿里巴巴集团控股有限公司 | 一种Java应用程序的更新方法及装置 |
CN104766007A (zh) * | 2015-03-27 | 2015-07-08 | 杭州安恒信息技术有限公司 | 一种基于文件系统过滤驱动实现沙箱快速恢复的方法 |
CN106557355A (zh) * | 2016-12-01 | 2017-04-05 | 北京奇虎科技有限公司 | 虚拟机镜像的生成方法及生成装置 |
CN108229148A (zh) * | 2016-12-21 | 2018-06-29 | 武汉安天信息技术有限责任公司 | 一种基于Android虚拟机的沙箱脱壳方法及系统 |
CN108345773A (zh) * | 2017-07-27 | 2018-07-31 | 江苏通付盾信息安全技术有限公司 | 基于虚拟机的代码保护方法及装置、电子设备、存储介质 |
US10089461B1 (en) * | 2013-09-30 | 2018-10-02 | Fireeye, Inc. | Page replacement code injection |
CN111324361A (zh) * | 2018-12-14 | 2020-06-23 | 中国移动通信集团北京有限公司 | 一种应用升级方法及设备 |
-
2020
- 2020-12-01 CN CN202011388381.7A patent/CN112379973B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7941813B1 (en) * | 2006-02-17 | 2011-05-10 | Parallels Holdings, Ltd. | System and method for using virtual machine for driver installation sandbox |
CN102402427A (zh) * | 2010-09-09 | 2012-04-04 | 阿里巴巴集团控股有限公司 | 一种Java应用程序的更新方法及装置 |
US10089461B1 (en) * | 2013-09-30 | 2018-10-02 | Fireeye, Inc. | Page replacement code injection |
CN104766007A (zh) * | 2015-03-27 | 2015-07-08 | 杭州安恒信息技术有限公司 | 一种基于文件系统过滤驱动实现沙箱快速恢复的方法 |
CN106557355A (zh) * | 2016-12-01 | 2017-04-05 | 北京奇虎科技有限公司 | 虚拟机镜像的生成方法及生成装置 |
CN108229148A (zh) * | 2016-12-21 | 2018-06-29 | 武汉安天信息技术有限责任公司 | 一种基于Android虚拟机的沙箱脱壳方法及系统 |
CN108345773A (zh) * | 2017-07-27 | 2018-07-31 | 江苏通付盾信息安全技术有限公司 | 基于虚拟机的代码保护方法及装置、电子设备、存储介质 |
CN111324361A (zh) * | 2018-12-14 | 2020-06-23 | 中国移动通信集团北京有限公司 | 一种应用升级方法及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112379973A (zh) | 2021-02-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10732962B1 (en) | End-to-end deployment infrastructure | |
US11086656B2 (en) | Sharing templates and multi-instance cloud deployable applications | |
US10146524B1 (en) | Preemptive deployment in software deployment pipelines | |
US9575739B2 (en) | Performing unattended software installation | |
US10592237B2 (en) | Efficient detection of architecture related bugs during the porting process | |
US10684897B2 (en) | Event notification | |
US9519472B2 (en) | Automation of virtual machine installation by splitting an installation into a minimal installation and customization | |
US9712379B2 (en) | Robust cloud instance launching | |
US10255086B2 (en) | Determining optimal methods for creating virtual machines | |
CN113312037A (zh) | 应用于微服务的数据处理方法、装置、设备和存储介质 | |
US10411961B2 (en) | Image management in cloud environments | |
WO2013109860A1 (en) | Software builder | |
US9141385B2 (en) | Managing operating system components | |
CN110727575A (zh) | 一种信息处理方法、系统、装置、以及存储介质 | |
WO2021243342A1 (en) | Action recommendation for application failure | |
CN116048644A (zh) | 一种系统迁移方法、装置和可读存储介质 | |
CN112379973B (zh) | 重载方法和装置 | |
US10102008B2 (en) | Managed boot process system | |
CN112230944B (zh) | 应用安装方法、装置、电子设备和计算机可读介质 | |
CN112925675B (zh) | 用于小程序的恢复方法和装置 | |
CN111290818A (zh) | 创建应用程序的操作方法及应用程序的操作方法 | |
CN111190693A (zh) | 一种基于鲲鹏平台搭建云平台的方法及装置 | |
CN113220507B (zh) | 双主控系统的版本一致性检验方法及装置 | |
US20230259347A1 (en) | Container based generation of inputs for generic functions | |
CN110197067B (zh) | 文件查杀方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |