随着屡次改版和时间的积累,工程愈来愈大,而这次接入某行SDK后,工程剧增几十M,让我意识到是时候给 app 瘦身了!
通过两天的实践,ipa 从70+M
缩减到了50+M
!前端
🔨工具 LSUnusedResourcesgit
⚠️注意1:对于使用 imageName_%d 这种方式使用的图片,为了防止误删,建议勾上github
使用时我对比了下勾选和不勾选 Ignore similar name 时的搜索结果,对可能会误删的图片进行逐个肯定,意外的防止了一次误删!
图片的名称是这样的,符合 tag_%d 格式:后端
然鹅,图片的引用方式是这样的:
[self.bg_Ima setImage:[UIImage imageNamed:type]];
type动态获取。
误打误撞防止了一次误删,哈哈。缓存
🔨 工具:fdupesbash
⏳使用 HomeBrew
下载:brew install fdupes
服务器
⚙ 开始使用:fdupes -r .../Assets.xcassets
架构
⚠️注意:防止 AppIcon 误删app
一个用于
40 3x
一个用于60 2x
结果同样,用的是同一张图,这种状况不该该删框架
🔨工具:ImageOptim
⚙开始使用: 直接把 工程文件夹 或 Assets.xcassets
文件夹拖进去,工具会自动提取图片,进行无损压缩,最后覆盖原图片。
🥇结果: 🎉恭喜你节省了 20.86%
的空间,超越了 80%
的玩家~
-imageWithContentsOfFile:
加载Assets.xcassets
管理,适合较小且频繁使用的图片。它会把里边的全部 png 格式的图片压缩成一个Assets.car
文件,压缩比率比其余方式管理图片要高,大大减小图片体积。二进制包是由各类代码文件、静态库和动态库通过编译后生成的可执行文件。
🔨工具:LinkMap
⚙开始使用: Xcode -> project -> Build Settings -> Link Map
编译运行后,使用工具分析 Link Map File:
结果一目了然,根据类、库等的大小排序,能够进行针对性优化。
arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
模拟器32位处理器测试须要i386架构,i386是针对intel通用微处理器32位处理器
模拟器64位处理器测试须要x86_64架构,x86_64是针对x86架构的64位处理器
真机32位处理器须要armv7,或者armv7s架构,
真机64位处理器须要arm64架构
armv7
能够兼容armv7s
,打包时Xcode
是不会将模拟器框架打进去的,因此只须要去掉armv7s
便可既达到瘦身效果,又不影响开发和生产。
lipo
能够用来移除fat binary
中不被支持的或者多余的可执行代码,达到瘦身目的。
lipo
不会改变程序执行逻辑,仅仅只是文件的大小瘦身。
lipo MESDK -thin armv7 -output MESDK-armv7
lipo MESDK -thin arm64 -output MESDK-arm64
lipo -create MESDK-armv7 MESDK-arm64 -output MESDK-device
复制代码
iOS9 发布了 iOS Thinning,具体介绍了编译器的三项 app 瘦身技术:App 切割(App Slicing)、位源码(Bitcode)和按需加载资源(On Demand Resources)
Assets.xcassets
管理图片资源iOS9
之后,确切是 iOS9.0.2
之后。(这个版本修复了 App Thinning 失效的 bug)itunes
根据用户设备类型和屏幕分辨率的不一样分发定制的下载包,开发者只须要把完整应用包的内容上传到 iTunes Connect
便可(编译器自动完成中间的处理)。Bitcode 是程序编译过程当中的中间码,介于 LLVM 编译器的前端语言和后端语言(汇编或机器语言)之间。 打包时 Xcode 会将程序编译成 Bitcode 中间码;用户下载时 App store 会再根据具体设备和芯片平台优化二进制文件、减少安装包大小,将 Bitcode 编译成相应的汇编指令以及翻译为机器码,最终成为可执行的64位或32位程序。
Bitcode 的存在,使苹果能够在 LLVM 架构的上面发明新的前端语言,以及在 LLVM 架构的下面支持新的 CPU (后端)指令输出 -> 新的前端语言写出来的程序能够兼容旧的设备;已经上架的 App 能够在搭载新的 CPU 的设备运行,而避免了发布新版本的麻烦。
不一样设备对 Bitcode 的使用:iOS 可选的,watchOS 必须的,Mac OS 不支持的。 注意:若是咱们的工程须要支持 Bitcode,则全部引入的第三方库都要支持 Bitcode。
功能:支持在 App 首次安装后再下载其余资源。
如何开启: Xcode -> project -> Build Settings -> Enable On Demand Resources -> Yes
应用:游戏开发中,某些游戏关卡的资源能够在玩家付费后再下载;在玩家经过低级关卡并再也不去玩时,能够将对应的资源删除以便节省空间。
因为 obc 的动态特性,即便是那些没有 import 使用的类,都会在 build 后被编译进可执行文件(build 后观察 linkmap 能看到相关文件信息);
对于第三方库的依赖和滥用,会致使不少第三发库利用率低或者随着需求的改变压根就没用到,删除这些不用的库;
所以删除这些无用的类和库也是缩小项目大小的有效途径之一。
71.4 -> 54.7