一种查找缺失资源并补充的方法及系统
技术领域
本发明涉及一种查找缺失资源并补充的方法及系统,属于计算机技术领域。
背景技术
随着Unity游戏的复杂度越来越高,贴图资源,特效资源相关的依赖性层次越来越复杂.游戏内如果出现某一个资源缺失,逻辑处理不正确的话.将会产生有些崩溃,画面显示不正确等现象,严重影响用户的游戏体验,同时还会造成用户流失等情况。
传统方法而言,都是基于Unity项目工程,获取资源的依赖及其引用情况.从而进行资源的检查,进而判断是否有缺失情况。
但是很多情况下会出现工程中,资源依赖关系都是正确和合理的,但是因为打包过程中,部分文件未引入,导致引用关系缺失,因此并没有很好的解决对应的问题。
相较于传统方案而言,本方案直接对APK包进行引用关系查找和检查,能够有效的解决传统方案的弊端.同时通用性更强,不依赖工程文件,项目组只需上传对应的APK包便可以自动化分析并输出结果。
发明内容
为解决上述问题,本发明的目的在于提供一种查找缺失资源并补充的方法及系统,包括对程序安装包执行解包操作,得到解包文件;将解包文件进行多次扫描分析,得到已封包资源库和安装包中的资源引用关系图及对应的资源引用关系表,将缺失资源汇总重新封包到程序安装包中,完成缺失资源的补充。
本发明解决其问题所采用的技术方案一方面是:一种查找缺失资源并补充的方法,其特征在于,该方法包括以下步骤:对程序安装包执行解包操作,得到解包文件;将解包文件进行第一次扫描分析,获得程序安装包中的所有资源的通用唯一识别码,得到已封包资源库;对解包文件进行第二次扫描分析,获得安装包中的资源引用关系图及对应的资源引用关系表,其中资源引用关系表包括资源的通用唯一识别码以及对应资源引用资源的通用唯一识别码;将第一次扫描分析得到的已封包资源库与第二次扫描分析得到的资源引用关系表进行检索对比,已封包资源库中未存在而在资源应用关系表中存在的资源即为缺失资源;将缺失资源汇总重新封包到程序安装包中,完成缺失资源的补充。
进一步的,所述通用唯一识别码为全局唯一标识符。
进一步的,所述引用关系图为树状图。
进一步的,所述对程序安装包执行解包操作,得到解包文件包括:使用UnityUnpackTool对程序安装包进行资源还原,得到后缀为unpack的解包文件。
进一步的,所述将解包文件进行第一次扫描分析,获得程序安装包中的所有资源的通用唯一识别码,得到已封包资源库包括:使用binary2text对Resource资源进行分析,得到Resource下的所有资源的通用唯一识别码;对于由LZ4进行数据压缩的资源,还需要使用LZ4UnpackTool执行解压操作;使用binary2text对解压后的AssetBundle资源进行分析,得到AssetBundle下的所有资源的通用唯一识别码;得到所有资源的通用唯一识别码,并根据通用唯一识别码建立已封包资源库。
进一步的,所述对解包文件进行第二次扫描分析,获得安装包中的资源引用关系图及对应的资源引用关系表包括:根据unity内置的引用关系文件获取资源引用关系;将引用关系转换为资源引用关系图和资源引用关系表。
进一步的,所述程序安装包中的程序由Unity引擎制作。
本发明解决其问题所采用的技术方案另一方面是:一种查找缺失资源并补充的系统,其特征在于,包括:安装包解包模块,用于对程序安装包执行解包操作;资源信息抓取模块,用于根据资源存储路径对对应的资源进行信息抓取,其中信息包括资源的通用唯一识别码以及对应资源引用资源的通用唯一识别码;资源库建立模块,用于根据第一次扫描分析的结果,将资源对应的通用唯一识别码信息作为已封包资源库;可视化处理模块,根据资源信息抓取模块抓取的信息,对所有资源进行排列组合处理,得到所有资源的引用关系图以及引用关系表;重封包模块,将缺失资源汇总重新封包到程序安装包中,完成缺失资源的补充。
进一步的,还包括二次解包模块,用于将LZ4算法压缩的资源,执行解压操作。
进一步的,还包括树状图生成模块,用于根据抓取的资源的通用唯一识别码以及对应资源引用资源的通用唯一识别码,生树装引用关系图,并根据引用层级,生成对应的层级的多层引用菜单。
本发明的有益效果是:具有通用性和易用性,解决由于引用资源丢失而导致的画面显示不正确等问题,优化用户游戏体验,保证了数据的正确性和精确性,从而保证了项目的品质。
附图说明
图1所示为根据本发明较佳实施例的方法流程示意图;
图2所示为根据本发明较佳实施例的系统模块框图;
图3所示为根据本发明较佳实施例的解包示意图;
图4所示为根据本发明较佳实施例的资源信息示意图;
图5所示为根据本发明较佳实施例的资源信息抓取示意图;
图6所示为根据本发明较佳实施例的资源引用关系示意图。
具体实施方式
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。
需要说明的是,如无特殊说明,本公开中所使用的上、下、左、右等描述仅仅是相对于附图中本公开各组成部分的相互位置关系来说的。在本公开中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。
本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。本发明的查找缺失资源并补充的方法及系统适用于程序安装包内资源的信息查询。
参照图1所示为根据本发明较佳实施例的方法流程示意图,具体步骤包括:
对程序安装包执行解包操作,得到解包文件;
以一游戏程序安装包为例,根据muse构建对应的通用安装包muse_common.apk,
使用UnityUnpackTool工具对apk安装包进行解包,
APK是Android Package的缩写,即Android application package文件或Android安装包。每个要安装到Android平台的应用都要被编译打包为一个单独的文件,扩展名为.apk。APK文件是用专业软件eclipse编译生成的文件包,其中包含了应用的二进制代码、资源、配置文件等。通过将APK文件直接传到Android手机中执行即可安装。APK文件其实就是zip格式,但其扩展名被改为apk,在Windows下用解压软件WinRAR/WinZIP/7-Zip可以直接打开。解压后,你会看到有几个文件和文件夹。一个典型的APK文件通常有下列内容组成:
AndroidManifest.xml程序全局配置文件
classes.dex Dalvik字节码
resources.arsc编译后的二进制资源文件
META-INF\该目录下存放的是签名信息
res\该目录存放资源文件
assets\该目录可以存放一些配置文件
下面对这些文件和目录做些基本的注释和介绍:
AndroidManifest.xml
该文件是每个apk应用程序都必须包含的文件,它描述了应用程序的名字、版本、权限、引用的库文件等等信息。
classes.dex文件
classes.dex是java源码编译后生成的java字节码文件。dex是Dalvik VMexecutes的全称,即Android Dalvik执行程序。利用解析工具可以将其转换成java来加以阅读和理解。
resources.arsc
编译后的二进制资源文件。在做主题美化时要常与这个文件打交道。
META-INF目录
META-INF目录下存放的是签名信息,有三个签名文件,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
res目录
res目录存放资源文件。包括图片,字符串等等。res下有若干个子目录,主要为drawable,layout,xml。
解包后,几乎所有可能的修改和编辑工作基本都在这里。汉化ROM的主要工作就在这里。汉化ROM实际上就是汉化所有的apk应用程序的字符文件。
assets目录
assets目录可以存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。
将解包文件进行分析获取资源存储路径;
Assets目录一般为存放资源的目录。
将解包文件进行第一次扫描分析,获得程序安装包中的所有资源的通用唯一识别码,得到已封包资源库;
对解包文件进行第二次扫描分析,获得安装包中的资源引用关系图及对应的资源引用关系表,其中资源引用关系表包括资源的通用唯一识别码以及对应资源引用资源的通用唯一识别码;
使用binary2text对Resource资源进行分析,得到Resource下的所有资源的通用唯一识别码;
对于由LZ4进行数据压缩的资源,还需要使用LZ4UnpackTool执行解压操作,LZ4就是一个用16k大小哈希表储存字典并简化检索的LZ77,LZ4是一种无损压缩算法,压缩速度为每核心400MB/s(0.16字节/周期)。它拥有速度极快的解码器,速度为每核心多GB/s(0.71字节/周期)。此外,一种称为LZ4_HC的高压缩率衍生产品可用于交易可定制的CPU时间以实现高压缩率;
使用binary2text对解压后的AssetBundle资源进行分析,得到AssetBundle下的所有资源的通用唯一识别码;
得到所有资源的通用唯一识别码,并根据通用唯一识别码建立已封包资源库。
根据unity内置的引用关系文件获取资源引用关系;
将引用关系转换为资源引用关系图和资源引用关系表。
将第一次扫描分析得到的已封包资源库与第二次扫描分析得到的资源引用关系表进行检索对比,已封包资源库中未存在而在资源应用关系表中存在的资源即为缺失资源;
将缺失资源汇总重新封包到程序安装包中,完成缺失资源的补充。
一般来说unity引擎的封包有如下流程:
1.Texture,都去掉alpha通道,作为背景展示的图片,基本都没有透明要求,有特殊要求的则放到atlas里面
a.Loading图这类需要比较精细的,则把图片设置为Automatic TrueColor,设置真彩色,保证不失真
b.地图、缩略图、UI背景图等等要求不精细的,则可以设置为自动压缩格式(有压缩情况,都需要图片宽高尺寸是2的幂,可以在Advance里面设置toNearest)
2.animation clip
动作片段的优化,主要是减少动作的无用帧,就是两个Keyframe之间的旋转或者位移或者缩放的差别很小很小,则可以把Keyframe去掉,这样一个几百k的动作片段优化下来可能只有几十k,还是相当可观的。
3.检查无效的脚本
很多时候美术制作资源的时候,为了即时看到效果,会把脚本给挂上去,但是制作完以后通常会忘了把脚本卸载。通常这些资源会打包成bundle资源,这个时候脚本就会缺失,加载bundle的时候会一直报警告消息,这样会增加CPU的开销,严重的话会引起卡顿。所以检查无效的脚本是很有必要的。
4.特效的检查
游戏里面的特效非常多,几百上千个。而特效里面引用相同材质的情况是很多的,如果不把这些材质的剔出来,会造成很多资源的冗余。一个最简单的办法就是把所有特效的材质贴图都抠出来打包成一个bundle文件,加载特效的时候动态加载材质贴图,还是会减少几MB内存的。
还有一点,特效贴图很多都使用了alpha通道,渲染的时候容易造成重绘情况(alpha test和alpha blend),会加大CPU和开销。解决办法是拆分贴图的alpha,shader里面做alhpa的混合。
5.场景处理
纹理合并+静态批处理,lightmap贴图设置自动压缩。一个是减少drawcall,一个是减少内存占用。静态批处理的。
6.atlas贴图
和特效贴图类似,也是拆分alpha通道,在shader里面做混合。不过有一个很大的好处就是,atlas都是需要显示很精细的,做贴图压缩处理的时候基本都是使用truecolor,一个1024x1024的RGBA32的图片在内存中会占用4MB的大小。做了alpha通道拆分后,就可以把alpha图片和RGB图片做自动压缩成ETC 4bit格式,占用的内存会大大减少。对于游戏同时会使用几个atlas的情况下,这种处理方式一个atlas大概就能减少2到3MB的内存,几个下来,20MB都有可能,还是很客观的。
7.GameUI游戏窗体界面
窗体界面在打包的时候把挂载的脚本去掉,加载窗体的时候动态挂上去。
8.角色模型和怪物模型处理依赖
角色模型通常都会有几套动作,所以打包角色模型时都需要先把角色上的动作给去除掉,游戏中在动态挂上去。这样处理需要动作文件命名规范,有可能会用到配置表。
怪物、npc、坐骑等模型和动作基本都是一一对应的,不存在冗余的情况,所以不用拆分动作,直接全依赖打包
9.音效、texutre不需要考虑依赖情况,直接打包。不过,因为这类资源本身都是经过压缩的,打包的时候可以尝试选择不压缩打包的方式打成bundle,加载bundle的时候就是加载的没有压缩的资源,可以提高加载资源的速度
10.场景打包,unity 5.0以后加入了LZ4的压缩方式,对比LZMA的压缩方式,在加载速度上提升是非常大的。
参照图2所示为根据本发明较佳实施例的系统模块框图,用于生成资源引用关系的系统有以下系统结构:
安装包解包模块,用于对程序安装包执行解包操作;
资源信息抓取模块,用于根据资源存储路径对对应的资源进行信息抓取,其中信息包括资源的通用唯一识别码以及对应资源引用资源的通用唯一识别码;
资源库建立模块,用于根据第一次扫描分析的结果,将资源对应的通用唯一识别码信息作为已封包资源库;
可视化处理模块,根据资源信息抓取模块抓取的信息,对所有资源进行排列组合处理,得到所有资源的引用关系图以及引用关系表;
重封包模块,将缺失资源汇总重新封包到程序安装包中,完成缺失资源的补充。
其中,对于一些由LZ4数据压缩技术压缩的资源,还可调用二次解包模块,用于将LZ4算法压缩的资源,执行解压操作。
还包括树状图生成模块,用于根据抓取的资源的通用唯一识别码以及对应资源引用资源的通用唯一识别码,生树装引用关系图,并根据引用层级,生成对应的层级的多层引用菜单。
最后以游戏《云裳羽衣》Unity手游为例,提取游戏中的资源信息,
第一步:根据muse(云裳羽衣工程)构建对应的通用安装包muse_common.apk
第二步:使用UnityUnpackTool对muse_common.apk进行资源还原得到muse_resouce.unpack,参照图3所示为根据本发明较佳实施例的解包示意图,
第三步:对Resource资源进行分析获取依赖和自身唯一ID,首先Resource资源存放在asset/bin/Data目录,Unity引擎本身就将文件名取名为uuid,其依赖信息存储于文件内部通过binary2text工具获取,例如f8e82775f6e34e8408112c98075858f3文件依赖于0000000000000000f000000000000000文件,同时我们可以得到所有Resource资源的依赖关系,参照图4所示为根据本发明较佳实施例的资源信息示意图,
第四步:对AssetBundle资源进行分析获取依赖信息和自身唯一性标识guid
AssetBundle资源存放于asset/AssetBundle,为Unity常用数据存储格式.其内部使用了LZ4数据压缩,我们需要解压缩才能获取到对应的原始数据.参照图5所示为根据本发明较佳实施例的资源信息抓取示意图。
第五步:通过第三步和第四步,最终我们可以得到整个游戏工程的资源依赖情况。
图6所示为根据本发明较佳实施例的资源引用关系示意图。
通过遍历Unity游戏安装包中每一个游戏资源,我们可以生成整个项目的资源依赖关系树.从而可以用于方便做资源检查和资源的加载,举例来说
如果guid为0000010的文件依赖的guid为00000210的文件并未在Resource目录和AssetBundle文件中,则认为00000210文件缺失.遍历所有依赖,便可以找出工程中所有文件的依赖缺失。
而Resource目录和AssetBundle文件中的资源文件就是由第二步骤中已封包资源库来表述的。
应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。