安卓解压
在之前使用ASE解密ab包时,使用了FileStream这个API,在安卓平台是无法读取的。这是因为安卓平台将streamAssets文件夹下的文件都压缩成了jar包。
当安卓平台下载大版本apk时,需要将StreamAssets目录下的ab包解压到PersistentDatapath再进行解密使用。
解压的流程是:
先读取Resource文件夹下的ABMD5配置文件,获得需要解压的ab包的信息。
验证persistentDatapath下的解压路径,看看有没有已经解压过的ab包,对比一下这些解压过的包有没有被修改,最后将需要解压的ab包名都放到一个list当中。
最后开启一个协程将这些包进行解压,解压利用的核心API是UnityWebRequest.Get,和我们下载热更包一样,这个API也可以处理jar包路径。
我们之前在安卓端没有加密的时候,使用的是AssetBundle.LoadFromFile,这个API也不用关心jar包问题。
修改HotPatchManger对HotPatchManager进行一些修改,添加一些全局变量和方法
1234567891011121 ...
AES加密
AES可以对字符串和字节流进行加密,我们加密ab包主要使用字节流加密的方式。
AES工具类首先在ResFrame——Frames——ResourceFrm文件夹内新建AES文件,这是一个AES工具类。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 ...
热更UI界面
UI界面搭建进入GameStart场景,在Hierarchy窗口确认GameStart这个Prefab已经放好。
在GameStart——UIRoot——WndRoot下新建子GameObject,命名为HotFixPanel,并设为stretch窗口
在HotFixPanel下新建Image命名为BG,Color设为黑色,改为Stretch模式。
在BG下新建Image命名为ProgressBar,改为Filled——Horizontal类型。
下载时进度条走一次、解压时进度条走一次、验证时再走一次(可选)
在BG下新建SpeedText,放在BG靠近右下角ProgressBar上方的位置,在其中输入“3m/s”。
在BG下新建ProcessText,放在SpeedText左侧,在其中输入“下载中……”
在HotFixPanel下新建Image命名为Info
在Info下新建Title(Text),在其中输入“热更内容”,调整位置到Info中间上部
在Info下新建Scroll View,在它的Content子节点下新建Text,在其中输入“1.热更修复了XXX”
想 ...
客户端下载热更
当我们需要下载热更包时,同样需要中间类来维护。
热更下载的总流程在下面的StartDownloadAB方法内:
先获取一个下载列表List<Patch>,默认情况下,这个List<Patch>就是m_DownloadList,如果是MD5校验出错的情况下,这个List<Patch>就是需要重新下载资源的列表
根据下载列表List<Patch>,创建List<DownloadAssetBundle>,因为具体的下载方法我们封装在了DownloadAssetBundle类里
DownloadItem基类创建DownloadItem基类,因为在游戏中需要下载的东西有很多,不一定是AssetBundle
我们在ResFrame——Frames——ResourceFrm——Download文件夹内新建DownloadItem文件
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 ...
热更Manager
在网络游戏的入口,每次启动时都需要检测服务器是否有更新。
我们每次打AB包时,都会在Resource文件夹内生成ABMD5.bytes文件,记录最新的assetbundle文件的md5信息。这个ABMD5 .bytes文件还会根据版本和平台拷贝到工程文件夹下的Version文件夹内。
我们打热更包时,就需要指定版本的ABMD5 .bytes文件,从而将筛选打出的热更包放进工程文件夹下的Hot文件夹内。注意每次打热更包时,我们都会先打一次AB包,但是Resource文件夹内的ABMD5.bytes文件和Version文件夹内的ABMD5不会更新,它们只有正常打AB包和发布标准包时才会更新。这也意味着我们打出来的热更包都是基于当前版本的,客户端只需要下载最新的热更包即可。
当我们发布标准包时,我们在Resources文件夹内还会添加一个Version.txt文件。这个文件就是客户端的版本信息,客户端通过这个文件来读取自己的版本信息来和服务器进行比对。
HotPatchManager我们在ResFrame——Frames——ResourceFrm——Download文件夹下新建HotPatc ...
服务器文件部署
Apache服务部署这里我们使用wamp,具体见
MySQL摘要 | ATAO2017,阿宅创造奇迹! (atao-blast.github.io)
Apache是一个Web服务器软件,能够快速方便地提供Http访问。
服务器文件部署Apache服务器的文件服务是有指定的文件夹的。
我们进入wamp的安装目录:C:\wamp\www
在其中按照下面递进的顺序新建文件夹“AssetBundle——0.1——1”
然后将我们打包出来的热更文件(Unity工程目录/Hot/指定的平台/里面的文件)拷贝到上面新建的文件夹内(Patch.xml文件不用拷贝)
想要打包出热更文件,我们可以修改一些贴图,使用画图工具随便画几笔。
我们在服务器中,使用的是ServerInfo.xml,它记录了更多的信息,我们完善一些Patch.xml,添加一些东西。
复制一份Patch.xml,命名为ServerInfo.xml放在C:\wamp\www下,修改里面的内容
123456789<?xml version="1.0" encoding="utf-8"?&g ...
生成热更包
修改BundleEditor添加了热更之后,打包就有了普通打包和热更打包的区别,我们需要修改BundleEditor的Build方法
首先在BundleEditor添加NormalBuild方法,代表的是普通打包
123456[MenuItem("Tools/打AB包")]public static void NormalBuild(){ Build();}
然后修改Build方法,给这个方法添加参数
123456789101112131415161718192021 public static void Build(bool hotfix = false,string abmd5Path = "",string hotCount = "1") { //... for (int i = 0; i < oldNames.Length; i++) { AssetDatabase.RemoveAssetBundleName(oldNames ...
热更编辑器工具
记录好每次打包的文件MD5和版本信息后,我们需要根据这些信息判断出哪些文件需要热更,从而打出热更补丁。在这里我们需要制作一个编辑器窗口,方便指定热更的目标平台和版本号。
热更包打包窗口在ResFrame——Editor文件夹内新建WindowsFile脚本,这是一个调用Windows系统文件管理器的脚本。
WindowsFile
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748using System;using System.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Auto)]public class OpenFileName { public int structSize = 0; public IntPtr dlgOwner = IntPtr.Zero; public IntPtr instance = IntPt ...
打包记录信息
添加Verison写入方法我们在BuildApp中添加新的方法
1234567891011121314151617181920212223242526272829303132static void SaveVersion(string version,string package){ string content = "Version|" + version + ";PackageName|" + package + ";"; string savePath = Application.dataPath + "/Resources/Version.txt"; string lineOne = ""; string all = ""; using(FileStream fs = new FileStream(savePath, FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare ...
热更新流程概览
主要流程设置热更配置表数据结构确定热更的资源,记录资源的大小,资源对应的版本和补丁包,每次热更的描述文件。
在多版本并行的情况下,不同的版本有不同的热更配置。
本地记录下载热更版本,方便比较
生成热更包及热更配置表放到服务器自动生成热更包及自动生成热更配置表
资源加密,解密
热更回退
下载热更配置表读取需要热更文件下载热更文件热更下载中断等处理
游戏中加载热更热更资源下载后校验
资源解密
资源解压
热更流程图准备阶段打包时记录打包版本以及所有资源信息。所有信息指的是打包的当前AB包的所有信息,包括MD5码以及资源大小。由于ab包名是唯一的,所以我们把ab包名作为key值,MD5和资源大小等作为Value值。这里资源信息我们使用xml序列化成二进制,或者直接使用Json都可以。
对AB包进行加密
这些信息都放在Unity的Resources文件夹下
Unity一键生成热更资源根据资源信息,对比新旧AB包,找出需要热更的部分。将需要热更的部分存放在指定的文件夹中
热更包及配置表根据需要热更的资源,生成对应的热更补丁配置表和热更包
服务器文件部署将生成的热更包放在指定的文件夹下,热更的配置表 ...