一种游戏应用的热更新方法和装置
技术领域
本发明涉及一种游戏应用的热更新方法和装置,属于游戏开发的技术领域。
背景技术
当前,在游戏发布版本后,常需要一种不用重新发版就能更新版本的热更新需求。由于市面上的热更新方案尚未完善,给开发者带来很大困扰的同时,也增加了开发成本。
Unity是在游戏开发的过程中常使用游戏引擎。针对Unity游戏引擎开发的游戏应用目前市面上常见的热更新方案都存在一些不足的地方,如使用il2cpp的打包模式可以用于打包使用C++语言开发的so动态链接库文件,但却不适用于打包使用C#语言通过反射方式开发的dll动态链接路文件;又如,采用LUA脚本的方案则增加开发者的学习成本。
发明内容
本发明提供一种游戏应用的热更新方法和装置,基于游戏应用的热更新方式进行改进,采用将与游戏更新资源的类型对应更新方式对游戏应用进行热更新,从而适用于对不同程序语言开发的游戏更新资源的热更新,增加兼容性,节省游戏应用的更新时间。
本发明的技术方案第一方面为一种游戏应用的热更新方法,该方法包括以下步骤:S100)在游戏运行环境中启动游戏应用,所述游戏运行环境根据所述游戏应用的第一主程序包安装得到,所述游戏运行环境中包括根据所述第一主程序包生成的第二主程序包;S200)确定所述游戏应用需要更新时,从服务器中下载游戏更新资源;S300)确定所述游戏更新资源为第一游戏资源,则使用所述第一游戏资源更新所述第二主程序包;S400)确定所述游戏更新资源为第二游戏资源,则根据所述第二游戏资源更新本地库列表文件;S500)加载所述更新的第二主程序包,以运行所述游戏应用的主程序;S600)根据所述本地库列表文件通过反射方式加载所述第二游戏资源。
进一步的,在根据所述游戏应用的第一主程序包安装得到的初始的所述游戏运行环境中,所述第二主程序包是根据所述第一主程序包中的预设文件目录打包得到的压缩包。
进一步的,所述步骤S300还包括以下子步骤:S310)确定加载所述第二主程序包的第一预设路径;S320)将所述第一主程序包中的预设文件目录解压至第二预设路径;S330)将所述第一游戏资源覆写至所述第二预设路径;S340)将所述第二预设路径中的所有文件打包后覆写到所述第一预设路径,以替换所述第二主程序包。
进一步的,所述预设文件目录为原生资源目录,所述第一游戏资源包括第一动态链接库和原生资源文件;所述步骤S330还包括以下子步骤:S331)将所述第一游戏资源中的第一动态链接库写入所述第二预设路径;S332)将所述第一游戏资源中的原生资源文件覆写至所述第二预设路径中的所述原生资源目录中。
进一步的,所述第二游戏资源为第二动态链接库,所述步骤S400还包括以下步骤:S410)将所述第二游戏资源覆写至预设的动态链接库路径;S420)根据所述动态链接库路径中的所有第二动态链接库更新本地库列表文件。
进一步的,所述第一主程序包为所述游戏应用提供签名信息。
本发明的技术方案第二方面为一种计算机装置,包括存储器、处理器及储存在存储器上并能够在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
S100)在游戏运行环境中启动游戏应用,所述游戏运行环境根据所述游戏应用的第一主程序包安装得到,所述游戏运行环境中包括根据所述第一主程序包生成的第二主程序包;
S200)确定所述游戏应用需要更新时,从服务器中下载游戏更新资源;
S300)确定所述游戏更新资源为第一游戏资源,则使用所述第一游戏资源更新所述第二主程序包;
S400)确定所述游戏更新资源为第二游戏资源,则根据所述第二游戏资源更新本地库列表文件;
S500)加载所述更新的第二主程序包,以运行所述游戏应用的主程序;
S600)根据所述本地库列表文件通过反射方式加载所述第二游戏资源。
本发明的技术方案第三方面为一种计算机可读存储介质,其上储存有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
S100)在游戏运行环境中启动游戏应用,所述游戏运行环境根据所述游戏应用的第一主程序包安装得到,所述游戏运行环境中包括根据所述第一主程序包生成的第二主程序包;
S200)确定所述游戏应用需要更新时,从服务器中下载游戏更新资源;
S300)确定所述游戏更新资源为第一游戏资源,则使用所述第一游戏资源更新所述第二主程序包;
S400)确定所述游戏更新资源为第二游戏资源,则根据所述第二游戏资源更新本地库列表文件;
S500)加载所述更新的第二主程序包,以运行所述游戏应用的主程序;
S600)根据所述本地库列表文件通过反射方式加载所述第二游戏资源。
本发明的有益效果为:采用将与游戏更新资源的类型对应更新方式对游戏应用进行热更新,从而适用于对不同程序语言开发的游戏更新资源的热更新,增加兼容性,节省游戏应用的更新时间。
附图说明
图1所示为本申请所公开的游戏应用的热更新方法的流程图;
图2所示为在本申请的一个实施例中,第一游戏资源更新子方法的流程图;
图3所示为在本申请的另一个实施例中,第二游戏资源更新子方法的流程图。
具体实施方式
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。
需要说明的是,如无特殊说明,当某一特征被称为“固定”、“连接”在另一个特征,它可以直接固定、连接在另一个特征上,也可以间接地固定、连接在另一个特征上。此外,本公开中所使用的上、下、左、右等描述仅仅是相对于附图中本公开各组成部分的相互位置关系来说的。在本公开中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种元件,但这些元件不应限于这些术语。这些术语仅用来将同一类型的元件彼此区分开。例如,在不脱离本公开范围的情况下,第一元件也可以被称为第二元件,类似地,第二元件也可以被称为第一元件。本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。
参照图1所示的方法流程图,在本申请的一个或多个实施例中,根据本发明的方法可以用于对游戏应用进行热更新。该方法包括以下步骤:
S100)在游戏运行环境中启动游戏应用,所述游戏运行环境根据所述游戏应用的第一主程序包安装得到,所述游戏运行环境中包括根据所述第一主程序包生成的第二主程序包;200)确定所述游戏应用需要更新时,从服务器中下载游戏更新资源;S300)确定所述游戏更新资源为第一游戏资源,则使用所述第一游戏资源更新所述第二主程序包;S400)确定所述游戏更新资源为第二游戏资源,则根据所述第二游戏资源更新本地库列表文件;S500)加载所述更新的第二主程序包,以运行所述游戏应用的主程序;S600)根据所述本地库列表文件通过反射方式加载所述第二游戏资源。
具体的,本实施例中以游戏应用是使用Unity游戏引擎制作的安卓应用为例进行说明。第一主程序包为基于游戏应用编译并打包得到的Android应用程序包(Androidapplication package,APK)。APK是安卓操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个安卓应用程序的代码想要在安卓设备上运行,必须先进行编译,然后被打包成为一个被安卓系统所能识别的文件才可以被运行,而这种能被安卓系统识别并运行的文件格式便是“APK”。一个APK文件内包含被编译的代码文件(.dex文件),文件资源(resources),原生资源文件(assets),证书(certificates),和清单文件(manifest file)等。在安卓设备上安装第一主程序包得到游戏运行环境,具体的,可以通过点击生成的快捷图标启动游戏应用。一般的,在启动游戏应用后,游戏应用加载NativeActivity组件,并调用getPackageCodePath()方法,得到第一主程序包的路径,加载第一主程序包运行游戏应用的主程序。但是,在本申请的一个或多个实施例中,所述第一主程序为所述游戏应用提供签名信息,如上述的证书,保证第一主程序的来源是安全的,通过认证的。但是,由于该签名信息与所述第一主程序包,无法通过根据下载的游戏更新资源修改第一主程序包来进行热更新。所以,本申请中引入第二主程序包来实现热更新的功能。在本申请的一个或多个实施例中,在根据所述游戏应用的第一主程序包安装得到的初始的所述游戏运行环境中,所述第二主程序包是根据所述第一主程序包中的预设文件目录打包得到的压缩包。进一步的,将getPackageCodePath()方法返回的路径更改为第二主程序包对应的路径,即在启动游戏应用后,游戏应用加载NativeActivity组件,并调用getPackageCodePath()方法,得到第二主程序包的路径,加载第二主程序包运行游戏应用的主程序。
又进一步的,游戏更新资源为动态链接库或原生资源。游戏更新资源的类型包括第一游戏资源和第二游戏资源。其中,第一游戏资源为不可以通过il2cpp打包的动态链接库或原生资源,第二游戏资源为可以通过反射方式进行加载的动态链接库。
再进一步的,通过加载所述更新的第二主程序包,以运行所述游戏应用的主程序;并根据所述本地库列表文件通过反射方式加载所述第二游戏资源,即可完成整个游戏应用的运行。具体的,在本申请的一个或多个实施例中,可以通过在游戏应用中NativeActivity组件的onCreate方法中增加ClassLoader方法,并修改ClassLoader方法中pathList的本地库列表文件来确定需要加载的第二游戏资源。其中,本地库列表文件为dexElements列表,可以在该dexElements列表中设置第二游戏资源的名称和第二游戏资源的存储路径。
对于上述第一游戏资源的更新方式,参照图2所示的子方法流程图,在本申请的一个或多个实施例中,步骤S300可以通过以下子步骤实现:S310)确定加载所述第二主程序包的第一预设路径;S320)将所述第一主程序包中的预设文件目录解压至第二预设路径;S330)将所述第一游戏资源覆写至所述第二预设路径;S340)将所述第二预设路径中的所有文件打包后覆写到所述第一预设路径,以替换所述第二主程序包。具体的,在本申请的一个或多个实施例中,所述预设文件目录为原生资源目录(assets),所述第一游戏资源包括第一动态链接库和原生资源文件;所述步骤S330还包括以下子步骤:S331)将所述第一游戏资源中的第一动态链接库写入所述第二预设路径;S332)将所述第一游戏资源中的原生资源文件覆写至所述第二预设路径中的所述原生资源目录中。其中,第一动态链接库为通过C#程序语言编译得到的dll动态链接库;原生资源文件是游戏应用需要加载的资源文件,可以是音频文件或图像文件等。覆写为如果文件名相同则替换,不存在则写入。具体的,由于第二主程序包是根据所述第一主程序包中的预设文件目录打包得到的压缩包,同样具有效的签名,进一步的,通过将第一游戏资源对第二主程序包进行覆写,生成新的第二主程序包,来实现在不需经过重新签名的前提下,完成游戏应用的热更新。
对于上述第二游戏资源的更新方式,参照图3所示的子方法流程图,在本申请的一个或多个实施例中,步骤S400可以通过以下子步骤实现:S410)将所述第二游戏资源覆写至预设的动态链接库路径;S420)根据所述动态链接库路径中的所有第二动态链接库更新本地库列表文件。其中,第二动态链接库可以是通过C++程序语言编译得到的so动态链接库,或者是通过Java程序语言编译得到的Android Dalvik执行程序DEX,其中,DEX是Dalvik VMexecutes的全称。通过更新本地库列表文件,即可以通过反射方式加载已更新的第二游戏资源。进一步的,若第二动态链接库是so动态链接库,即可以支持il2cpp的打包模式。
应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。