XCode 编译加速之Compile Asset Catalog

1,824 阅读2分钟

App经过N次的版本功能迭代后,编译时间大幅增加,除了代码外,xcasset的图片资源增加也会导致编译时间变长。 优化这一编译过程,向大家介绍一个简单易用的方案。

本文是针对xcasset的图片的Compile过程进行优化(只适用于开发时!!!)

先看一下效果:

优化前,Compile asset catalogs 时间为 90s

优化后,Compile asset catalogs 时间为 0.8s,另外加上脚本时间4.9s, 一共5.7s:

image.png

image.png

思路:

Compile asset catalogs编译主要是需要进行压缩等操作,最终编译成Asset.car文件,所以我们目标是要加速这个过程。

网上一般的思路是:如果有组件化,那么可以将xcasset进行切分,分块分开,那么可以减少重复编译的工作量。

但今天介绍的方法是直接绕过编译的过程:由于大部分图片文件我们都只是进行简单的使用,那么在compile的过程中只是一个简单的压缩过程,但这花费了大量cpu时间。开发时我们是没有必要花费大量时间进行压缩的,直接显示正常就完了。

另外,需要知道的是,在工程中,图片不加入xcasset,在编译中是直接执行copy命令复制到包中的。

方案:

第一步,编译时,不编译xcasset

第二步,编译时,直接复制xcasset中的图片到包中

实现方法:

第一步,编译时,不编译xcasset:

通过build setting的Exclude Source File Names填入不需要的xcasset,或者可以直接填入*.xcasset匹配所有xcasset

image.png

第二步,编译时,直接复制xcasset中的图片到包中:

在build phases中加入复制xcasset的图片文件的脚本,脚本很简单(感谢神帮我写了一个脚本,简单几行就用多进程缩短了70%的复制时间, 其中-P 4表示4个进程)

# This is a script Copy all png files to App folder
#!/bin/bash
# Set the source and destination directories
DESTINATION=$BUILT_PRODUCTS_DIR"/"$PRODUCT_NAME".app/"
# Copy the PNG files that don't exist in the destination directory
find "path/to/your/project" -type f  -name '*.png' ! -path "path/to/exclude" | xargs -I {} -P 4 cp {} $DESTINATION
exit 0

以上就是具体的方案,建议只在debug中使用这个方法

还有两个问题(Two More Things)

1.有一些特殊的xcasset只能用xcasset的(如AppIcon、特殊处理过的xcasset),我们要放行:

通过build setting的Included Source File Names填入必须的xcasset就可以解决问题。

image.png

2.复制图片时,imageset文件名跟png文件名不一致,导致复制后无法正常使用:

可以通过检查和修正这些文件名,使得imageset与png文件名一致。这里给大家分享一个简单Python脚本,直接调试一下使用就可以。exclude_list填入不想处理的路径。

github.com/gbfansheng/…