因为我们的项目是Flutter+Unity的混合体,所以每次打包都需要导出iOS和安卓的Unity包。之后再按照平时打Flutter的安装包出来。
我们目前的Unity算是比较庞大的架构,用的是目前阿里云达摩院的底座。别说这底座不是一般的烂,从阿里的一个桌游临时剥离出来的框架,代码老旧,很多遗留的资源等等。
我们采用了最新的HybridCLR热更新框架,并且使用AA包作为管理资源热更。对于Unity和Flutter进行通信我们采用flutter_unity_widget这个框架。
导出iOS的包就需要执行下面的操作
①HybridCLR
①.①HybridCLR/CompileDll/ActiveBuildTarget
①.②HybridCLR/Generate/All
①.③HybridCLR/Build/BuildAssetsAndCopyToStreamingAssets
②Addressables
②.①Addressables/BuilddatainAPP
③FlutterExport
③.①ExportFlutteriOSRelease
③.①ExportFlutterAndroidRelease
但是上面操作完毕,给iOS的包还不能马上使用,还需要额外的操作。
打开iOSUnity的项目目录的路径~/HybridCLRData/iOSBuild下,执行下面的脚本。
bashbuild_libil2cpp.sh执行完毕之后,将目录~/HybridCLRData/iOSBuild/build/libil2cpp.a文件复制到Flutter项目中~/ios/UnityLibrary/Libraries/libil2cpp.a处。
打开~/ios/UnityLibrary/Unity-iPhone.xcodeproj文件将UnityFramework的Bitcode关闭掉。
至此导出包的全部操作才算操作完毕,整体的过程我写出来之后就已经感觉很繁琐了,别说每天因为Unity的更新就要重新的操作。
为此我一直想通过Dart写一套打包脚本,不但包含导出Unity包,之后打出apk/ipa的安装包。苹果的就上传Testflight安卓的就上传到蒲公英。
写的时候发现其实整个过程步骤还是挺多的,所以就萌发了上一篇要做一个自动化流程软件,可以将这些流程组合起来的想法。
比如包含至少下面的自动化插件
应该这个过程可以公开使用的步骤还是很多的,就可以将一个完整的流程拆分处不同的插件。每个插件都会死一个独立命令行程序,也可以是其他语言实现的,比如用Shell。
不同语言怎么串联起来呢?只需要将他们规定输入和输出保持一直都统一走文件,这样整体运行期间的变量可以通过Environment获取也可以将每个插件运行输入和输出放在一个全局的字典保管,其他程序可以通过运行的ID进行访问。
这个扯远了,现在继续说怎么实现Uinty的自动化打包。
本来昨天我是持怀疑态度的,心想这个按照理论上应该支持,但是不是很确定。通过Ai的推荐,果然有对应的参数和方法。
我很快就按照所说的方法,在Editor创建了Unity编辑器脚本。不过在测试的过程中发现了一些坑需要注意。
1在对应文件夹下运行不会读取当前文件夹项目进行操作,而是最近UintyHub打开的项目,可以使用-projectPath这个参数进行修改
2对于当前的Unity没有退出完毕,会弹出一个运行允许一个Unity实例错误。
3默认没有关闭UI,会影响执行的速度。
目前我们最终的打包命令如下:
/Users/king/Documents/2021.3.16f1c1/Unity.app/Contents/MacOS/unity-quit-batchmode-executeMethodExportAppData.exportAndroid-nographics-projectPath./第一个参数是Unity的路径,每个人的路径可能不一样,需要自己设置。
第二个参数代表运行完毕自动退出
第三个参数是开启批处理模式,这样不会启动Untiy界面
第四个参数代表要执行Unity的对应方法
第五个参数是执行的方法类名和方法这个类名和方法一定要唯一,方法要是静态方法。
第六个参数不启动UI支持在只有主机的电脑运行
第七个参数是代表设置自定义工程路径
第八个参数是代表工程路径
代表是需要根据情况进行修改的,代表参数不需要变动的。第八个参数如果在当前的工程运行也是可以不进行修改的。
ExportAppData.exportAndroid这个实现的过程就不用说了,其实也很简单就把对应功能菜单的方法串联在一起调用即可。