手游项目组的Unity自动构建脚本勉强能用,遇到一些问题就小修小补,日子过的还行,所以一直都没有去重构它。但因为下面的原因,不得不重构了:
1:xcode版本不一致,对应的ios打包方法有所不一样。目前有两个项目同时在开发,几个build机器的xcode版本又不一样,造成维护起来很吃力,统一起来迫在眉睫。
2:需要构造带有不同宏设置的真机版本
既然决定重构了,在解决上述问题的同时,就顺便给新的构建脚本设定了一些更高的要求:
1: Unity针对ios构建,开放了一些操作xcode的接口,这些接口能够使构建脚本更加清晰,新的构建脚本应该尽量使用。
2:为以后的开发、甚至是上线预留一些必要的接口,比如各种渠道版本的构建、重签名的需求等。
下面就介绍下重构后构建脚本的基本框架:
上面的代码是构建脚本的入口函数,首先会调用do_analysisArgvs对输入的参数进行解析,然后根据目标版本(ios或者android),执行do_iosBuild或do_androidBuild,这两者就如字面含义,代表ios和android的具体构建流程。
以构造android版本为例子,只需要在命令行下输入以下内容:
python3 build.py --ios --buildnumber=0 --schema=debug
就可以按照既定的流程,构建出对应的android版本。(buildnumber代表svn版本号)
这里要特别说明的是,先前我们的构造脚本的参数都是通过读取配置文件来实现的,这里有2个问题:
1:构建不同的版本,需要修改配置文件,不方便
2:配置文件不在svn版本控制内,出现过被误删,然后傻逼的情况
当然,不是说命令行参数的方式一定比配置文件好,只是一个选择而已,用的顺手就好,如果用命令行的话,可以直接用python的getopt库。还有一个要说明的是,大家看上面的代码,会发现有一个ctx的变量,它其实是一个class的实例,我们将所有解析后的参数和预定义的全局变量,都存在这个实例的table中,这样做的好处是,不用到处去申明global了,做到了一次赋值,全局可用,这个还是非常好的。
上面的代码是构造ios版本的的函数,它会依次执行task_list中的方法。
这里要特别说明的是,先前我们的ios构建脚本是调用xcodebuild 命令来编译我们的项目生成 app,然后再用 xcrun 将 app 转 ipa的。现在的话改用xcodebuild archive 命令来直接生成我们需要的 ipa,这是因为官方说 PackageApplication is deprecated,而且archive是目前官方推荐的构建方法,所以这次就改成用archive的方式构建了。
当然构建ios,基本都会遇到证书的问题,个人经验是:
1:p12证书导入到mac的system目录,并且设置权限为所有人可访问,这里要注意这个属性的设置只有重启电脑才有效
2:如果不设置所有人可访问,那么在ios打包的时候,就要调用下面的命令
security unlock-keychain -p "kobe" ~/Library/Keychains/login.keychain
security list-keychains
还有一个需要注意的是,在改成archive模式后,系统对项目的自动检查会更加严格一些,我就遇到一个下面的问题:在我们项目中,一些plugin在unity中设置如下图,会导致ios下打包失败,修改的方法是,勾选指定的平台,比如ios的plugin,就勾选iOS,不要勾选any platform。
新的打包脚本中,我们使用了unity开放给我们的修改xcode项目的接口,我截取了一部分代码说下:
通过调用unity开放给我们的接口,我们可以修改plist文件和xcode项目的属性。先前我们的构造脚本并没有使用这些接口,而是直接采取了物理移动文件和直接修改文件的形式。下面给大家展示下,我们先前打包脚本中的一段给xcode增加framework的代码:
对比下现在的构造脚本,只要调用接口AddFrameworkToProject即可,不仅清晰可读了很多,也保证了扩展性和适配性。
上面的代码是构造android版本的的函数,它会依次执行task_list中的方法。其中Prepare4Channel和Build4Channel是为以后的渠道版本留的接口,AndroidProtect是apk加固留的接口。
具体的每个方法这里就不一一展开了,网上也有很多相关的资料,一查便知。还有就是我们项目的打包脚本是通过jenkins去调度的,其中客户端和服务器版本的一致性保证也是在jenkins中实现的。基本的打包框架就是这样了,如果有兴趣详细了解的,可以私下再沟通。 有兴趣的可以关注公众号:gameQA24。
打包作为项目版本质量的基础,其稳定性是非常重要的。祝大家都找到适合自己项目组的打包脚本,从源头上提高版本质量的基础。
本文来自网易实践者社区,经作者朱洁授权发布。