CN105487885A - 手游热更新方法 - Google Patents
手游热更新方法 Download PDFInfo
- Publication number
- CN105487885A CN105487885A CN201510819844.3A CN201510819844A CN105487885A CN 105487885 A CN105487885 A CN 105487885A CN 201510819844 A CN201510819844 A CN 201510819844A CN 105487885 A CN105487885 A CN 105487885A
- Authority
- CN
- China
- Prior art keywords
- unity
- member variable
- update method
- hand
- swims
- 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.)
- Granted
Links
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/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- 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/445—Program loading or initiating
- G06F9/44568—Immediately runnable code
- G06F9/44578—Preparing or optimising for loading
-
- 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/445—Program loading or initiating
- G06F9/44568—Immediately runnable code
- G06F9/44584—Portable applications, i.e. making applications self-contained, e.g. U3 standard
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)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种手游热更新方法,包括:修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新;修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。通过修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。然后再修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配,从而实现所述运行代码和资源的热更新,使得游戏分区更新和版本回退得以实现。提高了游戏开发的效率,也提高了游戏玩家的体验。
Description
技术领域
本发明涉及计算机应用领域,尤其是一种手游热更新方法。
背景技术
当前,通常用Unity3D来开发各种游戏。由于Unity3D的非开源性,Unity3D项目在手机平台上的程序和资源热更新可能成为困扰很多团队顺利开发游戏产品的主要技术瓶颈之一。
Unity3D的游戏逻辑运行代码是以DLL(DynamicLinkLibrary,动态链接库)文件形式储存于APK之中的。Android系统下APK(AndroidPackage,Android安装包)在安装后是无法写入新的文件并重新打包的。因此,如果需要修改可执行的DLL文件,由于所述DLL文件的加载路径被确定在APK中,只能以重装APK的方法来实现。而重装APK对手游玩家来说是一种流失的重要风险。
同时,在Unity3D机制下,运行代码和资源是不能同时更新的,从而导致了无法实现游戏分区更新和版本回退。分区更新对于项目研发有着重要的意义:它使项目组可以在每个版本全面推出之前,在部分服务器对于新功能进行试点;考察更新对于游戏数值平衡性的影响;监控是否有大规模的程序稳定性异常。版本回退对于玩家来说也有重要的意义,对于已经进入高版本服务器的玩家可以通过选择低版本的服务器,回退本地游戏资源进入低版本服务器进行游戏,而不会出现由于服务器版本选择错误,无法退回原来版本的尴尬。
发明内容
本发明的目的在于提供一种手游热更新方法,以解决Unity3D的游戏运行代码和资源不能同时热更新,而导致的无法实现游戏分区更新和版本回退的问题。
为了达到上述目的,本发明提供了一种手游热更新方法,包括:修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新;
修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。
优选的,在上述的手游热更新方法中,通过Hook方式修改所述运行代码的加载路径。
优选的,在上述的手游热更新方法中,所述运行代码以DLL文件形式存储在APK中,通过修so文件以实现DLL文件的加载路径。
优选的,在上述的手游热更新方法中,通过修改libmono.so文件以实现修改DLL文件的加载路径。
优选的,在上述的手游热更新方法中,通过修改libmono.so文件中的mono_image_open_from_data_with_name函数以实现修改DLL文件的加载路径,使得所述DLL文件按照指定目录加载。
优选的,在上述的手游热更新方法中,修改Unity成员变量的序列化方式的步骤包括:
取消记录在APK中的Unity成员变量的序列化顺序;
自定义Unity成员变量的序列化顺序。
优选的,在上述的手游热更新方法中,取消记录在APK中的Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,打开NONE_SEARIALIZE编译开关,以关闭Unity自定义的数据序列化功能。
优选的,在上述的手游热更新方法中,自定义Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,将SerialBehavior的对象数据导出为自定义的Unity成员变量的序列化数据。
优选的,在上述的手游热更新方法中,所述自定义的Unity成员变量的序列化数据以.bytes文件形式存储。
在本发明提供的手游热更新方法中,通过修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。然后再修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配,从而实现所述运行代码和资源的热更新,使得游戏分区更新和版本回退得以实现。提高了游戏开发的效率,也提高了游戏玩家的体验。
附图说明
图1为本发明实施例中手游热更新方法的流程图;
图2为本发明实施例中通过手游热更新方法而实现Unity3D游戏热更新的流程图。
具体实施方式
下面将结合示意图对本发明的具体实施方式进行更详细的描述。根据下列描述和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
本发明实施例提供了一种手游热更新方法,具体的,如图1所示,包括:
S1:修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。
在Android系统中,Unity3D的游戏逻辑代码是以DLL文件形式存储在APK中,而APK一旦安装则无法修改。因此,为了实现可执行文件的动态更新替换,即DLL文件的热更新,必须避开从APK加载的方式,而采用从外部目录加载的方式。
申请人经过研究发现,所述DLL文件的加载是通过libmono.so文件中的mono_image_open_from_data_with_name函数实现的。只需要将所述DLL文件的载入函数进行修改替换,就可以达到修改所述DLL文件的加载路径的目的。
进一步的,通过Hook运行时修改代码的方式实现了libmono.so文件中的载入函数mono_image_open_from_data_with_name的替换。在替换文件中自定义所述DLL文件的加载路径,使得所述DLL文件按照指定目录加载,从而实现所述运行代码按照指定目录加载。从而使得在APK安装后,可以加载DLL文件,以实现DLL文件的热更新,即所述运行代码的热更新。
在本实施例中,所述libmono.so文件是基于C++语言开发的,所述DLL文件是基于C#语言开发的,所述DLL文件的下载过程是通过JAVA语言实现的。在本发明的其他实施例中,所述libmono.so文件还可以基于C或者其他计算机语言进行开发,所述DLL文件还可以基于C/C++、JAVA或者其他计算机语言进行开发,同样,所述DLL文件的下载过程也可以通过C#语言、C/C++或者其他计算机语言进行开发,在此不再赘述。
S2:修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。
原生的Unity会将Monobehavior的子类的所有成员变量进行序列化,数据部分保存在.prefab文件中,序列化顺序则记录在APK包中。由于APK包在安装完毕之后,就无法修改,则如果仅仅实现了所述运行代码的热更新,将出现资源与所述运行代码不匹配的问题。因此必须使用与所述运行代码匹配的序列化方式替代原有的序列化方式。
具体的,首先,需要取消记录在APK中的Unity成员变量的序列化顺序。即在利用Unity编辑器编译时,打开所述Unity编辑器的NONE_SEARIALIZE编译开关,以关闭Unity自定义的数据序列化功能,从而使得所述Unity自定义的数据序列化顺序无效,即实现取消记录在APK中的Unity成员变量的序列化顺序。
其次,在利用Unity编辑器编译时,将SerialBehavior的对象数据导出为自定义的Unity成员变量的序列化数据,且所述自定义的Unity成员变量的序列化数据以.bytes文件形式存储。
而当手机游戏运行时,在载入SerialBehavior之后,载入所述.bytes文件以还原所述SerialBehavior的实际对象属性,使得所述资源与所述运行代码向匹配。
在实现所述运行代码和资源的热更新之后,即可实现游戏的分区更新以及版本回退,提高玩家的体验。
通过手游热更新方法而实现Unity3D游戏热更新的流程如下:
步骤S001:启动游戏。
步骤S002:判断本地的临时目录下是否有DLL文件,如果有,直接将所述DLL文件复制到Unity的可载入目录,然后启动所述Unity;如果没有,则直接启动所述Unity。
步骤S003:通过所述Unity访问区服务器的web接口,并通过选择界面选择区服务器。
步骤S004:下载所选择的区服务器上的版本号。
步骤S005:判断所选择的区服务器上的版本号与本地所存储的版本号是否一致,如果一致,则开始游戏;如果不一致,分析所选择的区服务器上的版本号与本地所存储的版本号之间的差异,下载差异文件包。
在这个过程中,通过本发明所提供的手游热更新方法以实现游戏运行代码和资源的热更新。
步骤S006:将下载的差异文件包解压并存储在本地的临时目录上,然后重启客户端APK,重新启动游戏即可。
需要说明的是,本发明不仅适用于Android系统,还适用于linux、IOS系统及其他系统,只是在linux、IOS系统以及其他系统中,由于平台机制不同,所调用的文件以及函数名称不同,但是原理一致,在此不再赘述。
综上,在本发明实施例提供的手游热更新方法中,通过修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。然后再修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配,从而实现所述运行代码和资源的热更新,使得游戏分区更新和版本回退得以实现。提高了游戏开发的效率,也提高了游戏玩家的体验。
上述仅为本发明的优选实施例而已,并不对本发明起到任何限制作用。任何所属技术领域的技术人员,在不脱离本发明的技术方案的范围内,对本发明揭露的技术方案和技术内容做任何形式的等同替换或修改等变动,均属未脱离本发明的技术方案的内容,仍属于本发明的保护范围之内。
Claims (9)
1.一种手游热更新方法,其特征在于,包括:
修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新;
修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。
2.如权利要求1所述的手游热更新方法,其特征在于,通过Hook方式修改所述运行代码的加载路径。
3.如权利要求1所述的手游热更新方法,其特征在于,所述运行代码以DLL文件形式存储在APK中,通过修so文件以实现DLL文件的加载路径。
4.如权利要求3所述的手游热更新方法,其特征在于,通过修改libmono.so文件以实现修改DLL文件的加载路径。
5.如权利要求4所述的手游热更新方法,其特征在于,通过修改libmono.so文件中的mono_image_open_from_data_with_name函数以实现修改DLL文件的加载路径,使得所述DLL文件按照指定目录加载。
6.如权利要求1所述的手游热更新方法,其特征在于,修改Unity成员变量的序列化方式的步骤包括:
取消记录在APK中的Unity成员变量的序列化顺序;
自定义Unity成员变量的序列化顺序。
7.如权利要求6所述的手游热更新方法,其特征在于,取消记录在APK中的Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,打开NONE_SEARIALIZE编译开关,以关闭Unity自定义的数据序列化功能。
8.如权利要求6所述的手游热更新方法,其特征在于,自定义Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,将SerialBehavior的对象数据导出为自定义的Unity成员变量的序列化数据。
9.如权利要求8所述的手游热更新方法,其特征在于,所述自定义的Unity成员变量的序列化数据以.bytes文件形式存储。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510819844.3A CN105487885B (zh) | 2015-11-23 | 2015-11-23 | 手游热更新方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510819844.3A CN105487885B (zh) | 2015-11-23 | 2015-11-23 | 手游热更新方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105487885A true CN105487885A (zh) | 2016-04-13 |
CN105487885B CN105487885B (zh) | 2018-10-19 |
Family
ID=55674881
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510819844.3A Active CN105487885B (zh) | 2015-11-23 | 2015-11-23 | 手游热更新方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105487885B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106201868A (zh) * | 2016-06-28 | 2016-12-07 | Tcl集团股份有限公司 | 一种修复Android应用程序的方法和装置 |
CN106878380A (zh) * | 2016-12-27 | 2017-06-20 | 北京五八信息技术有限公司 | 一种修复APP线上bug的方法、装置及终端 |
CN106897103A (zh) * | 2017-03-03 | 2017-06-27 | 广州四三九九信息科技有限公司 | 一种移动端网络游戏版本快速热更新的方法 |
CN107800740A (zh) * | 2016-09-06 | 2018-03-13 | 盛趣信息技术(上海)有限公司 | Mmorpg服务器热更新 |
CN108089870A (zh) * | 2016-11-21 | 2018-05-29 | 百度在线网络技术(北京)有限公司 | 用于修复应用的方法和装置 |
CN108228208A (zh) * | 2016-12-22 | 2018-06-29 | 北京神州泰岳软件股份有限公司 | 一种java应用程序的动态更新方法和装置 |
CN108415719A (zh) * | 2018-03-29 | 2018-08-17 | 网易(杭州)网络有限公司 | 代码热更新方法和装置、存储介质、处理器及终端 |
CN109086059A (zh) * | 2017-06-14 | 2018-12-25 | 腾讯科技(北京)有限公司 | 代码加载更新方法、装置及服务器 |
CN109683927A (zh) * | 2018-11-01 | 2019-04-26 | 苏州蜗牛数字科技股份有限公司 | 一种更新u3d安卓游戏的方法 |
CN109857432A (zh) * | 2019-01-14 | 2019-06-07 | 珠海金山网络游戏科技有限公司 | 一种游戏应用的热更新方法和装置 |
CN110457054A (zh) * | 2019-07-22 | 2019-11-15 | 珠海金山网络游戏科技有限公司 | 一种UnityNGUI控件锚点更新模式优化方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060123159A1 (en) * | 2004-11-19 | 2006-06-08 | Microsoft Corporation | Systems and methods for processing input data before, during, and/or after an input focus change event |
CN102314561A (zh) * | 2010-07-01 | 2012-01-11 | 电子科技大学 | 基于api hook的恶意代码自动分析方法和系统 |
CN103605518A (zh) * | 2013-11-19 | 2014-02-26 | 北京国双科技有限公司 | 对象反序列化方法和装置 |
CN104038819A (zh) * | 2014-05-30 | 2014-09-10 | 四川长虹电器股份有限公司 | 数字机顶盒的软件升级系统及方法 |
CN104461622A (zh) * | 2014-11-28 | 2015-03-25 | 广州视睿电子科技有限公司 | 智能终端的系统更新方法和装置 |
-
2015
- 2015-11-23 CN CN201510819844.3A patent/CN105487885B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060123159A1 (en) * | 2004-11-19 | 2006-06-08 | Microsoft Corporation | Systems and methods for processing input data before, during, and/or after an input focus change event |
CN102314561A (zh) * | 2010-07-01 | 2012-01-11 | 电子科技大学 | 基于api hook的恶意代码自动分析方法和系统 |
CN103605518A (zh) * | 2013-11-19 | 2014-02-26 | 北京国双科技有限公司 | 对象反序列化方法和装置 |
CN104038819A (zh) * | 2014-05-30 | 2014-09-10 | 四川长虹电器股份有限公司 | 数字机顶盒的软件升级系统及方法 |
CN104461622A (zh) * | 2014-11-28 | 2015-03-25 | 广州视睿电子科技有限公司 | 智能终端的系统更新方法和装置 |
Non-Patent Citations (2)
Title |
---|
LUXIAOYU_SDC: "unity动态运行外部代码", 《CSDN博客》 * |
YY405145590: "unity IOS下的热更新研究", 《CSDN博客》 * |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106201868A (zh) * | 2016-06-28 | 2016-12-07 | Tcl集团股份有限公司 | 一种修复Android应用程序的方法和装置 |
CN107800740B (zh) * | 2016-09-06 | 2021-12-24 | 盛趣信息技术(上海)有限公司 | Mmorpg服务器热更新 |
CN107800740A (zh) * | 2016-09-06 | 2018-03-13 | 盛趣信息技术(上海)有限公司 | Mmorpg服务器热更新 |
CN108089870A (zh) * | 2016-11-21 | 2018-05-29 | 百度在线网络技术(北京)有限公司 | 用于修复应用的方法和装置 |
CN108089870B (zh) * | 2016-11-21 | 2022-01-21 | 百度在线网络技术(北京)有限公司 | 用于修复应用的方法和装置 |
CN108228208A (zh) * | 2016-12-22 | 2018-06-29 | 北京神州泰岳软件股份有限公司 | 一种java应用程序的动态更新方法和装置 |
CN106878380A (zh) * | 2016-12-27 | 2017-06-20 | 北京五八信息技术有限公司 | 一种修复APP线上bug的方法、装置及终端 |
CN106897103A (zh) * | 2017-03-03 | 2017-06-27 | 广州四三九九信息科技有限公司 | 一种移动端网络游戏版本快速热更新的方法 |
CN109086059A (zh) * | 2017-06-14 | 2018-12-25 | 腾讯科技(北京)有限公司 | 代码加载更新方法、装置及服务器 |
CN108415719A (zh) * | 2018-03-29 | 2018-08-17 | 网易(杭州)网络有限公司 | 代码热更新方法和装置、存储介质、处理器及终端 |
US11720344B2 (en) | 2018-03-29 | 2023-08-08 | Netease (Hangzhou) Network Co., Ltd. | Code hot-update method and device, storage medium, processor, and terminal |
CN109683927A (zh) * | 2018-11-01 | 2019-04-26 | 苏州蜗牛数字科技股份有限公司 | 一种更新u3d安卓游戏的方法 |
CN109857432A (zh) * | 2019-01-14 | 2019-06-07 | 珠海金山网络游戏科技有限公司 | 一种游戏应用的热更新方法和装置 |
CN110457054A (zh) * | 2019-07-22 | 2019-11-15 | 珠海金山网络游戏科技有限公司 | 一种UnityNGUI控件锚点更新模式优化方法及装置 |
CN110457054B (zh) * | 2019-07-22 | 2023-01-03 | 珠海金山数字网络科技有限公司 | 一种UnityNGUI控件锚点更新模式优化方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105487885B (zh) | 2018-10-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105487885A (zh) | 手游热更新方法 | |
CN102053831B (zh) | 一种Linux操作系统的定制方法及系统 | |
KR100506203B1 (ko) | 부팅 및 부트 코드 업데이트 방법 및 시스템 | |
JP4006337B2 (ja) | 共有ライブラリを使用して実行可能ファイルの実行を修正する方法 | |
US9720711B2 (en) | Dynamically loaded plugin architecture | |
CN104572206A (zh) | 应用程序自更新和备份恢复的方法 | |
US8914785B2 (en) | Providing virtual appliance system firmware images | |
CN100454258C (zh) | 嵌入式系统加载程序与应用程序一体化更新方法 | |
CN105138382B (zh) | 一种Android系统升级的方法及终端 | |
CN104918114B (zh) | 一种操作系统升级方法及装置 | |
CN105320554A (zh) | 程序更新的方法、用于程序更新的客户端及系统 | |
US9158521B2 (en) | Automatic provisioning of a software platform to a device ecosystem | |
CN105511889A (zh) | 一种通用的游戏版本增量更新系统和方法 | |
CN104899091B (zh) | 一种智能嵌入式设备多操作系统切换方法 | |
KR20120052406A (ko) | 펌웨어 이미지 갱신 및 관리 | |
CN102609274B (zh) | 一种系统快速启动运行方法及电视机 | |
CN101937356B (zh) | 一种编译WebKit浏览器的方法及装置 | |
CN103077056B (zh) | 使用少量ROM资源的Bootlorder实现方法 | |
CN111061638A (zh) | 一种iOS系统调试的方法、装置及服务器 | |
WO2018024198A1 (zh) | 机顶盒的应用程序升级方法、系统及机顶盒 | |
TW201721412A (zh) | 選擇及載入韌體卷區之技術 | |
CN105025364A (zh) | 一种智能电视ota延迟升级的方法 | |
CN106293790A (zh) | 基于Firefox操作系统的应用程序升级方法和装置 | |
CN107153613B (zh) | 基于HCS12单片机的BootLoader程序调试方法及系统 | |
JP2009009545A (ja) | データ処理システム及び方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |