Unity自动构建总结

阿凡达2018-07-06 12:36

    手游项目组的Unity自动构建脚本勉强能用,遇到一些问题就小修小补,日子过的还行,所以一直都没有去重构它。但因为下面的原因,不得不重构了:

    1xcode版本不一致,对应的ios打包方法有所不一样。目前有两个项目同时在开发,几个build机器的xcode版本又不一样,造成维护起来很吃力,统一起来迫在眉睫。

   2:需要构造带有不同宏设置的真机版本

   既然决定重构了,在解决上述问题的同时,就顺便给新的构建脚本设定了一些更高的要求:

   1 Unity针对ios构建,开放了一些操作xcode的接口,这些接口能够使构建脚本更加清晰,新的构建脚本应该尽量使用。

   2:为以后的开发、甚至是上线预留一些必要的接口,比如各种渠道版本的构建、重签名的需求等。

   下面就介绍下重构后构建脚本的基本框架:

    上面的代码是构建脚本的入口函数,首先会调用do_analysisArgvs对输入的参数进行解析,然后根据目标版本(ios或者android),执行do_iosBuilddo_androidBuild,这两者就如字面含义,代表iosandroid的具体构建流程。

   以构造android版本为例子,只需要在命令行下输入以下内容:

   python3 build.py --ios --buildnumber=0 --schema=debug

就可以按照既定的流程,构建出对应的android版本。(buildnumber代表svn版本号)

   这里要特别说明的是,先前我们的构造脚本的参数都是通过读取配置文件来实现的,这里有2个问题:

   1:构建不同的版本,需要修改配置文件,不方便

   2:配置文件不在svn版本控制内,出现过被误删,然后傻逼的情况

   当然,不是说命令行参数的方式一定比配置文件好,只是一个选择而已,用的顺手就好,如果用命令行的话,可以直接用pythongetopt库。还有一个要说明的是,大家看上面的代码,会发现有一个ctx的变量,它其实是一个class的实例,我们将所有解析后的参数和预定义的全局变量,都存在这个实例的table中,这样做的好处是,不用到处去申明global了,做到了一次赋值,全局可用,这个还是非常好的。

    上面的代码是构造ios版本的的函数,它会依次执行task_list中的方法。

   这里要特别说明的是,先前我们的ios构建脚本是调用xcodebuild 命令来编译我们的项目生成 app,然后再用 xcrun app ipa的。现在的话改用xcodebuild archive 命令来直接生成我们需要的 ipa,这是因为官方说 PackageApplication is deprecated,而且archive是目前官方推荐的构建方法,所以这次就改成用archive的方式构建了。

   当然构建ios,基本都会遇到证书的问题,个人经验是:

   1p12证书导入到macsystem目录,并且设置权限为所有人可访问,这里要注意这个属性的设置只有重启电脑才有效

   2:如果不设置所有人可访问,那么在ios打包的时候,就要调用下面的命令

   security unlock-keychain -p "kobe" ~/Library/Keychains/login.keychain

   security list-keychains

   还有一个需要注意的是,在改成archive模式后,系统对项目的自动检查会更加严格一些,我就遇到一个下面的问题:在我们项目中,一些pluginunity中设置如下图,会导致ios下打包失败,修改的方法是,勾选指定的平台,比如iosplugin,就勾选iOS,不要勾选any platform

    新的打包脚本中,我们使用了unity开放给我们的修改xcode项目的接口,我截取了一部分代码说下:

    通过调用unity开放给我们的接口,我们可以修改plist文件和xcode项目的属性。先前我们的构造脚本并没有使用这些接口,而是直接采取了物理移动文件和直接修改文件的形式。下面给大家展示下,我们先前打包脚本中的一段给xcode增加framework的代码:

    对比下现在的构造脚本,只要调用接口AddFrameworkToProject即可,不仅清晰可读了很多,也保证了扩展性和适配性。

    上面的代码是构造android版本的的函数,它会依次执行task_list中的方法。其中Prepare4ChannelBuild4Channel是为以后的渠道版本留的接口,AndroidProtectapk加固留的接口。

   具体的每个方法这里就不一一展开了,网上也有很多相关的资料,一查便知。还有就是我们项目的打包脚本是通过jenkins去调度的,其中客户端和服务器版本的一致性保证也是在jenkins中实现的。基本的打包框架就是这样了,如果有兴趣详细了解的,可以私下再沟通。  有兴趣的可以关注公众号:gameQA24。

   打包作为项目版本质量的基础,其稳定性是非常重要的。祝大家都找到适合自己项目组的打包脚本,从源头上提高版本质量的基础。

本文来自网易实践者社区,经作者朱洁授权发布。