前言
笔者的项目中, 成员变更快, 且都是学生开发, 无用的东西堆积如山. 一堆文件没引用, 一堆方法不会调用也没有删掉. 且 UI 时有改动, 旧 UI 也不删. 打包出来 31.1M. 刚接手的时候只是 10 多 M 的孩子, 咋突然就变胖了. 而且笔者有点洁癖, 看起来好累. 最后大小 25.8M, 减肥了 5.3M, 关键是无用代码量少了舒服.
笔者上网找到以下工具, 亲自尝试一遍, 并把过程记录下来. 不过这些工具并不 100% 准确, 只起辅助作用, 最终还是由我们判断能不能删. 所以要做好备份, 并且对项目有一定的熟悉度.
https://github.com/tinymind/LSUnusedResources
作用
查找无用图片并删除.
使用
勾选的选项中, 如果代码有出现字符串和 xcassets 中图片名字一样, 这工具就认为该图片是有用到的. 该工具默认全部都勾选上了.
图二中圈住部分, 可以识别拼接的字符串, 然而, 表情包名字没有其他前缀, 所以这个工具识别不出来它们实际上是有用到的.
所以名字有数字的图 (例如上面的 000,001), 不同图片有重复子字符串 (如 homework_语文作业, homework_美术作业), 如果不确定, 保险起见, 还是需要手动搜索一下.
同理, 如果图片名称是全中文, 基本可以确定是没有引用的.
果不其然, 笔者搜索 homework_, 发现有这么一段代码.
- NSString *string = [NSString stringWithFormat:@"homework_%@",self.subjectLabel.text];
- [self.subjectImageView setImage:[UIImage imageNamed:string]];
效果
经过一番折腾, 笔者删掉了将近 100 张没用的图片. 打包测试, 这时候包大小变为 26.8M, 较原始包减小了 4.3M, 作用还是很明显的.
https://imageoptim.com
作用 通过删除图片部分无用的 EXIF 等信息来减小 PNG,JPEG 和 GIF 图片的大小.
从 Xcode 编译时自带的 "图片压缩" 说起提到, 压缩过的图片带来更高的应用运行速度. 又能减少包大小, 何乐而不为呢.
使用
选中项目路径就行.
效果
经笔者测试, 可能是项目图片太多, 加上电脑性能不怎么样, 这工具运行了超久! 而且底部 UI(节省了多少) 刷新不同步, 要点击一下才能刷新有点不舒服; 又没有进度 UI 看.
而且 Xcode 也会对图片进行压缩处理, 但不一定意味着小上加小, 所以该工具对包大小效果可能不怎么样.
所以, 笔者认为这一工具用不用都差不多.
最终运行结果截图如下:
打包测试, 大小为 26.1M, 较上一步缩小了 0.7M.
fui
fui(Find Unused Imports) 是开源项目能很好的分析出不再使用的类, 准确率非常高, 唯一的问题是它处理不了动态库和静态库里提供的类, 也处理不了 C++ 的类模板.
作用
删除不用的类.
安装
运行 sudo Gem install fui -n /usr/local/bin, 笔者出现了下面的情况, 说明 Gem sources 中没有资源. 网上搜不到怎么解决, 折腾了笔者好久.
执行 Gem sources 能查看已有 source.
笔者之前装 Cocopods, 只剩下一个 https://gems.ruby-china.org/, 国内链接没有 fui 资源.
用 Gem sources -a https://rubygems.org/, 添加进去.(顺便提一句, 安装完想删执行 - Gem sources -r https://rubygems.org/)
这时候执行 Gem sources 应该能看到两个.
最后再次执行 sudo Gem install fui -n /usr/local/bin, 终于搞定了.
使用
cd 到工程目录下, 执行 fui find, 笔者建议忽略 pod 文件引用, 执行 fui -i $(pod 路径).(可惜好像不能同时忽略多个路径, 笔者项目中还有手动拉的第三方库)
然后等上一段时间, 会打印出一个列表. 由于不是 100% 靠谱, 还得我们自己辨别, 然后在 Xcode 中把文件删掉.(心大的可以执行 fui delete, 但笔者项目中有交换方法的类, 是没有被其他类引用的, 所以还是自己辨别吧)
该图就因为没有忽略, 显示了一堆 Pods, 影响查看.
如果你发现列表中有些文件找不到, 说明在 Finder 中没删.
效果
删掉一点代码文件, 对包大小没多大影响. 但笔者认为这一步还是值得的, 代码没有之前那么恶心了.
打包测试, 大小为 25.8M, 较上一步缩小了 0.3M.
静态库瘦身
原理: 第三方静态库 支持的指令集 有交杂部分, 删掉多余部分.
其可能导致模拟器无法使用, 笔者就不折腾了, 怕项目被玩坏了其他人砍我. 解决方法可以看方法看 iOS App 安装包瘦身实践 https://www.jianshu.com/p/c94dedef90b7 . 文章作者解决方法是生成两个. a, 精简版用来发布, 原版用来运行在模拟器上.
下面写点注释看看就算了. 大家注意, 这里 Git 回退都没用... 笔者要折腾一下了. 不打算弄的就别测试了.
过程
cd 到项目目录.
找到项目中的某个. a 文件. 执行以下命令.
lipo -info ***.a
i386,x86_64, 是模拟器的指令集. armv7 可以兼容 armv7s,armv7s 也可以删了, 只保留 armv7 和 arm64.
- // 分离出 armv7.a
- lipo ***.a -thin armv7 -output ***-armv7.a
- // 分离出 arm64.a
- lipo ***.a -thin arm64 -output ***-arm64.a
- // 将前二者合并为第三者
- lipo -create ***-armv7.a ***-arm64.a -output ***-device.a
效果
笔者止步了, 但那篇文章的作者测试如是说.
AppCode https://www.jetbrains.com/objc/download/
付费工具.
作用
找到没使用的方法. 事实上这个工具还有很多其他功能.
使用
emmm... 这个工具也不是 100% 可靠, 笔者对项目中的方法不是特别熟悉, 所以就不用了 (还不是没钱买).
参考
App 瘦身
ipa 文件 "减肥" 初探 https://www.jianshu.com/p/a72d03e92c80
iOS 代码瘦身实践 https://www.cnblogs.com/wdsunny/p/7486617.html
iOS App 应用包瘦身综合实践小结 https://www.jianshu.com/p/bce8540aead4
来源: https://juejin.im/post/5c36006e6fb9a049e82bb723