Unity引擎iOS增量编译方法解析

作者主页:https://zhuanlan.zhihu.com/p/45236018

在利用Jenkins自动化出包过程中发现一个问题,每次iOS编译的时候都是全量编译。根据Incremental builds for IL2CPP

(https://forum.unity.com/threads/incremental-builds-for-il2cpp.365470/)里的说法只要选择Append应该已经支持了才对,但每次还是会触发全量编译。

文件时间戳

拿出Beyond Compare对比了下,发现即使没有代码修改,Append出来的Xcode工程里也有一个头文件和一个文件夹的修改时间变了,因为很多IDE是根据这个来检查是否需要重新编译的。

另外写了个Python脚本,完成了类似rsync的功能,推荐大家参考作者狂飙的开源工程:https://github.com/networm/UnityXcodeCache

Xcode增量打包

接下来较麻烦的是出包服务器上调用的是xcode archive,然后xcodebuild -exportArchive来生成.ipa,但这个默认就是clean build。如果直接xcodebuild的话得到的是.app无法签名。

网上搜了下How to create Xcode archive without a clean build

(https://stackoverflow.com/questions/14640816/how-to-create-xcode-archive-without-a-clean-build),有人提的方法是PackageApplication但这货已经被官方移除了(不推荐使用)。下载了PackageApplication放到Xcode目录,确实是能用的,但是证书部分怎么都不正确。

后来分析了下xarchive文件,发现里面其实就是.app和Info.Plist而已(其实还有DSYM,但删掉完全没影响)。这样的话解决方案就很简单了。

1.直接调用xcodebuild生成.app,这里有个小技巧是CONFIGURATION_BUILD_DIR=build指定输出文件夹;

2.构造Info.plist,里面诸如CFBundleIdentifier、CFBundleVersion等信息可以通过两种方式获得:

xcodebuild -showbuildsettings获得xcode project信息;

/usr/libexec/PlistBuddy -c \"Print xxx\"获得原Info.plist信息。

构造完成之后就可以像原来一样xcodebuild -exportArchive操作即可。

实验效果

在C#代码不变情况下(这个对我们这种Lua为主的项目是常态),出包最耗时的就变成IL2CPP以及最后的Id,本身Compile消耗非常小。配合Asset Bundle的增量编译,对于我们这种体量的工程来说从20min降到10min

日常开发过程中使用增量节约时间,封版本的时候用全量则可避免潜在问题。

也欢迎大家来积极参与U Sparkle开发者计划,简称"US",代表你和我,代表UWA和开发者在一起!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181010A1U3I800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券