iOS代码瘦身实践
1 分析当前ipa的组成
一般一个ipa会包含:
1) 资源文件
- 本地文件:数据、配置、数据库等等
- 字体文件
- 图片资源
2) 源代码
通过生成linkmap文件,分析源代码生成的编译文件的大小。在Build Settings中Write Link Map File设置为Yes (记住release时候不要设置为Yes)。
编译之后会在build目录中生成两个LinkMap文件: XXX-LinkMap-normal-i386和XXX-LinkMap-normal-x86_64,分别代表在模拟器中32位和64位指令集生成的LinkMap文件。关于LinkMap的文件详细结构解释可以参考:http://blog.cnbang.net/tech/2296/
LinkMap会包含每个可执行文件的偏移量及大小,所以可以很方便的知道每个可执行文件的大小。可以使用LinkMap分析工具:https://github.com/huanxsd/LinkMap
2 资源瘦身
无用的图片文件
查找无用的图片文件,使用LSUnusedResources(https://github.com/tinymind/LSUnusedResources)
无损压缩图片
使用ImageOptim(https://github.com/ImageOptim/ImageOptim)进行png文件的无损压缩
WebP图片压缩
WebP是Google提供的一种图片编码格式,通常情况下WebP格式的图片是原始JPG/PNG图片的1/3,所以对于重度依赖图片显示的应用,转换使用WebP可以节省大量的网络传输数据和时间。对于APP瘦身,使用WebP格式可能是一种方式,可以使用WebP格式的图片替代现有的图片资源,可以一定程度的节省空间。
使用WebP转换工具(https://developers.google.com/speed/webp/docs/precompiled)尝试转换了几张较大的图片,效果如下:
iOS原生并不支持WebP格式加载,需要引入SDWebImage/WebP,详细可以参考:http://blog.devzeng.com/blog/ios-webp-usage.html
NSString *path = [[NSBundle mainBundle] pathForResource:@"logo" ofType:@"webp"];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
UIImage *img = [UIImage sd_imageWithWebPData:data];
self.imageView.image = img;
使用WebP格式的图片,似乎就抛弃了iOS @2x @3x按照设备加载对应图片的机制,所以应该还可以删除所有@2x图片,不过加载速度比原生较慢。
3 代码瘦身
AppCode代码静态检查
AppCode提供了非常强大的代码静态检查工具,使用Inspect Code,可以找到很多代码优化的地方。可以参考这篇介绍:AppCode inspections for your code perfection
清除无用代码
AppCode搜索出来的无用的Class,会有误报需要仔细检查每一个报错的代码。
使用Fui(https://github.com/dblock/fui)查找发现下列无用文件,同样需要double check避免误删
清除无用的Import
Fui(https://github.com/dblock/fui)可以用于查找无用的import,同时也提供xcfui 可以和Xcode集成。
清除无用的Method
1. 基于AppCode的扫描定期做清理
2. 这篇文章提供了一个很好的思路可以一键删除无用方法:http://www.jianshu.com/p/a53480ad0364
查找相似的代码
使用SameCodeFinder (https://github.com/startry/SameCodeFinder)可以查找到相似的代码,最后一位数字代表两个文件的海明距离,数字越小说明两个文件越类似。
清理其他无用的代码
1. 已经下线的陈旧代码,AB试验已经下线的代码
2. 通过转H5、Hybrid或者RN实现的Native功能,可以定期清理
3. 一些非核心Hybrid或者RN模块,可以考虑不要打包进入APP,通过动态下发的方式获取
4. 代码的重构,UI组件、业务逻辑的重用等等
4 一些参考文章
- iOS可执行文件瘦身:http://blog.cnbang.net/tech/2544/
- iOS APP瘦身实践:http://www.jianshu.com/p/c94dedef90b7,资源优化、编译器配置优化、可执行文件优化
- 滴滴出行iOS端瘦身实践: http://gmtc.geekbang.org/#schedule, 提供了查找无用图片的工具、WebP图片压缩、基于clang plugin实现查找无用代码(https://github.com/kangwang1988/XcodeZombieCode)、查找类似代码(https://github.com/startry/SameCodeFinder)
- 基于clang插件的一种iOS包大小瘦身方案
- 减小ipa体积之删除frameWork中无用mach-O文件
iOS代码瘦身实践的更多相关文章
- APK瘦身实践
首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...
- MVVM与Controller瘦身实践
MVC是一个做iOS开发都知道的设计模式,也是Apple官方推荐的设计模式.实际上,Cocoa Touch就是按照MVC来设计的. 这里,我们先不讲MVC是什么,我们先来谈谈软件设计的一些原则或者说理 ...
- iOS可执行文件瘦身方法
缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...
- 【转】iOS可执行文件瘦身方法
http://blog.cnbang.net/tech/2544/ 缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我 ...
- iOS App 瘦身方案
缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...
- iOS控制器瘦身-面向超类编程
今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 滴滴 老司机要开车了 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tabl ...
- iOS图片瘦身总结
前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...
- iOS 可执行文件瘦身方法
编译选项 1.编译器优化级别 Build Settings->Optimization Level有几个编译优化选项,release版应该选择Fastest, Smalllest,这个选项会开启 ...
- iOS ViewControllers 瘦身
https://objccn.io/issue-1-1/ https://juejin.im/user/57ddfba4128fe10064cbb93a 把 Data Source 和其他 Proto ...
随机推荐
- codeforces 651a oysticks
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status De ...
- row format delimited fields terminated by ','
row format delimited fields terminated by ',' 以','结尾的行格式分隔字段
- 为什么Servlet修改之后,Tomcat都得重启,servlet才会生效!
最近做东西经常需要重新加载项目,今天深深的问了自己为什么? Servlet的生命周期中,只会初始化一次,如果每次要是发送请求或响应,Servlet引擎都会调用service.从这里就会看出,servl ...
- redis 底层数据结构 压缩列表 ziplist
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...
- Java进阶01 String类(转载)
String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String类. ...
- [浪风分享] -- 系列百度云管家 V2.1.0 单文件版-分享必用的神器
废话不多说,神器送上 百度云管家 V2.1.0 更新时间:2013年05月22日更新内容:1.支持云端文件管理:删除.重命名.新建文件夹.移动2.支持缩略图浏览模式3.支持三种文件排序方式:按修改时间 ...
- Eclipse 重启选项
重启 Eclipse 重启选项允许用户重启 Eclipse. 我们可以通过点击 File 菜单选择 Restart 菜单项来重启 Eclipse. 在安装插件后,用户一般都会被提醒要重启 Eclips ...
- tonymillion/Reachability的使用
tonymillion/Reachability是GitHub上的一个开源工具类,目測是依据Apple的Reachability Demo改写而成. 该类能够測试到某一网络.主机等的可达性,支持Blo ...
- poj 3683(2-sat+输出一组可行解)
题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...
- STL常用的容器
vector:相当于一个不定长数组. vector的扩充机制是按照现在容量的一倍进行增长,每次增长是重新申请一块更大的心内存,并把现在容器中的元素逐个复制过去,然后销毁旧的内攒 1.头文件: #inc ...