1.Build
- 配置必要参数
- 创建AB
- 创建ABList
- 压缩AB
- 文件迁移
- 打包
- 包体加固
1.配置项
一些配置相关的内容,包括:打包目标平台、是否需要打AB、是否需要打ABList、AB是否需要压缩等,具体根据项目需要进行添加即可。
此外还有一些打包需要的固定路径,如包体存放路径,AB路径等等可以通过一些常量或是Asset进行配置
2.创建AB
3.创建ABList
生成ABList是为了后面我们做Patch做准备,当资源发生更改时,我们需要知道哪些资源更改了,我们需要Patch哪些资源。修改的资源变化有多大,提供给玩家需要更新的资源大小信息等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public static void GenerateAssetBundleList() { AssetBundleManifest manifest = LoadAssetBundleManifest(); if (manifest == null) { Debug.LogError("LoadAssetBundleManifest Failed"); return; } var allAssetBundles = manifest.GetAllAssetBundles().ToList(); allAssetBundles.Add(BuildSetting.Instance.AssetBundleFolder); var abList = new AssetBundleList(); foreach (var abName in allAssetBundles) { var abPath = GetAssetBundleBuildPath(abName); FileInfo fileInfo = new FileInfo(abPath); var md5 = StringUtils.GetFileHash(abPath); //写入资源名,资源大小,md5等信息 abList.AddABInfo(abName, fileInfo.Length, md5); Debug.Log("Generate AssetBundle MD5: " + abName); } //serialize AssetBundleList var path = GetABListBuildPath(); abList.Save(path); Debug.Log("Generate AssetBundleList Success: " + path); } |
4.AB压缩
为了让我们的包体更小,首包外放的时候资源会使用压缩包,第一次进游戏的时候进行解压缩。后面在更新patch的时候一般就不会再使用压缩AB了。(我只想Patch其中的一个文件,如果打压缩AB还要全下载下来)
1 2 3 4 5 6 7 8 9 10 11 |
//自定义cmd指令执行7z压缩(要注意先安装7z压缩环境哦https://www.7-zip.org/) var args = "a \"" + path + ".7z\" \"" + path + "/*\" "; var cmd = "C:/Program Files/7-Zip/7z.exe"; System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(cmd, args); info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; info.UseShellExecute = false; info.RedirectStandardOutput = true; System.Diagnostics.Process process = System.Diagnostics.Process.Start(info); string content = process.StandardOutput.ReadToEnd(); process.WaitForExit(); |
5.文件迁移
把压缩后的压缩包迁移到StreamingAssets,保证资源打进包内。
这没啥可说的,就是记得io前先创建对应的文件夹路径就可以了,直接使用File.Copy都不用自己开流写入保存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//搞一个递归创建文件夹的函数 public static void RecursivelyCreateDirectory(string fullDirectoryPath) { if (Directory.Exists(fullDirectoryPath)) return; string text = string.Empty; string text2 = fullDirectoryPath; List<string> list = new List<string>(); while (!Directory.Exists(text2)) { if (text2.LastIndexOf(Path.DirectorySeparatorChar) == text2.Length - 1) { text2 = text2.Substring(0, text2.Length - 1); } int num = text2.LastIndexOf(Path.DirectorySeparatorChar); text = text2.Substring(num + 1, text2.Length - (num + 1)); list.Add(text); text2 = text2.Substring(0, num); } while (list.Count > 0) { int num = list.Count - 1; text = list[num]; list.RemoveAt(num); text2 = text2 + Path.DirectorySeparatorChar + text; Directory.CreateDirectory(text2); } } |
6.打包
AB都处理完了,接下来就是打apk了。没啥好说的,调一下API就行了。
1 |
BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, outputPackage, platform, option); |
7.加固包体
这就看接入的加固SDK了,SDK一般都有固定的加固流程,只要使用对应平台的指令就可以完成加固了。
2.Patch
Patch的编辑器流程其实和Build类似
- 创建AB
- 构建ABList
- 差异处理
- 差异AB上传到服务器
其中创建AB和构建ABList其实和Build的流程是完全一样的。
差异处理就是通过对比本地ABList和服务器上的ABList把不同的AB找出来。
然后把这些差异AB上传到服务器就可以拉,记得也要把ABList上传哦~