创建一个新的项目projectTest.
- 在项目中添加文件夹Resources, 向Resources放入一张png
- 在项目中Assets.xcassets放入一张png
创建一个脚本文件
主要修改
- PrjPath为项目工程所在目录,包含.m .xib文件;
- ResPath为被扫描的资源文件目录,包含.png .wav
- xcodeprojPath为工程xcodeproj位置
#!/bin/sh
##### several cases that the scripts does not work:
##### 1) there is space or slash in the resources file, such as "aaa .png" 资源文件名中含有空格或者/
##### 2) reference resources in commented code 资源引用代码被注释了
##### 3) you need to manually checked the resources one by one in the result 对于脚本检查结果,最好人工检查一遍
##### 4) you can add some other types more than png, jpg, gif, wav, m4a 如果需要检查其他资源,请自行修改脚本;
##### 5)默认文件后缀都是如@2x.png格式,如果后缀格式不同,请自行修改脚本;
#### set parameters:
#### PrjPath为项目工程所在目录,包含.m .xib文件;
#### ResPath为被扫描的资源文件目录,包含.png .wav
#### xcodeprojPath为工程xcodeproj位置
PrjPath=/Users/liliguang/Desktop/projectTest
ResPath=/Users/liliguang/Desktop/projectTest
xcodeprojPath=/Users/liliguang/Desktop/projectTest/projectTest.xcodeproj
if [ -f ~/Desktop/resource_san_result.txt ];then
rm -f ~/Desktop/resource_san_result.txt
fi
# 当前项目下所有的m, xib, mm, plist, json文件
cd $PrjPath
files=$(find . -name "*.m" -o -name "*.xib" -o -name "*.mm" -o -name "*.plist" -o -name "*.json")
# 当前项目下所有的资源文件
cd $ResPath
for res in $(find . -name "*.png" -o -name "*.jpg" -o -name "*.gif" -o -name "*.wav" -o -name "*.m4a")
do
basename='basename/'$res
basename=${basename##*/}
if [ "${basename##*.}" == "png" ];then
if [ $? -eq 0 ];then
name=${basename%%@2x.png}
else
echo $basename|grep -q @3x.png
if [ $? -eq 0 ];then
name=${basename%%@3x.png}
else
name=${basename%.png}
fi
fi
echo Png文件 ${name}
elif [ "${basename##*.}" == "jpg" ];then
if [ $? -eq 0 ];then
name=${basename%%@2x.jpg}
else
echo $basename|grep -q @3x.jpg
if [ $? -eq 0 ];then
name=${basename%%@3x.jpg}
else
name=${basename%%.jpg}
fi
fi
echo Jpg文件 ${name}
elif [ "${basename##*.}" == "gif" ];then
if [ $? -eq 0 ];then
name=${basename%%@2x.gif}
else
echo $basename|grep -q @3x.gif
if [ $? -eq 0 ];then
name=${basename%%@3x.gif}
else
name=${basename%%.gif}
fi
fi
echo Gif文件 ${name}
elif [ "${basename##*.}" == "wav" ];then
name=${basename%%.wav}
echo Wav文件 ${basename}
elif [ "${basename##*.}" == "m4a" ]; then
name=${basename%%.m4a}
echo M4a文件 ${basename}
else
name=''
echo name为空字符串
fi
# 判断name长度不为0
if [ ${#name} -gt 0 ];then
cd $PrjPath
if grep -q $name $files;then
echo "$res" is used
else
cd $xcodeprojPath
if grep -q $name project.pbxproj;then
echo "$res" is not used >> ~/Desktop/resource_san_result.txt
else
:
fi
fi
else
echo name is empty
fi
done
if [ -f ~/Desktop/resource_san_result.txt ]; then
echo ***************the end of scan. Please see result from resource_san_result.txt
else
echo ***************the end of scan, everything is OK
fi
如果资源文件没有使用, 最终会输出打印存放到桌面的resource_san_result.txt文件中.
执行结果
当你的项目越来越大的时候, 对于一些冗余的资源文件. 可以为自己的项目做瘦身.
PS : 这里引用的资源图片名称, 就算是注释也当做为正在使用过这个图片, 所以写代码的时候需要注意自己的代码规范.
更多参考 :
iOS 项目结构与应用包瘦身实践
从资源和代码两方面为App瘦身处理
包大小:如何从资源和代码层面实现全方位瘦身?
Apple Developer App Thinning in Xcode