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代码瘦身实践的更多相关文章

  1. APK瘦身实践

    首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...

  2. MVVM与Controller瘦身实践

    MVC是一个做iOS开发都知道的设计模式,也是Apple官方推荐的设计模式.实际上,Cocoa Touch就是按照MVC来设计的. 这里,我们先不讲MVC是什么,我们先来谈谈软件设计的一些原则或者说理 ...

  3. iOS可执行文件瘦身方法

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  4. 【转】iOS可执行文件瘦身方法

    http://blog.cnbang.net/tech/2544/ 缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我 ...

  5. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  6. iOS控制器瘦身-面向超类编程

    今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 滴滴 老司机要开车了 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tabl ...

  7. iOS图片瘦身总结

    前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...

  8. iOS 可执行文件瘦身方法

    编译选项 1.编译器优化级别 Build Settings->Optimization Level有几个编译优化选项,release版应该选择Fastest, Smalllest,这个选项会开启 ...

  9. iOS ViewControllers 瘦身

    https://objccn.io/issue-1-1/ https://juejin.im/user/57ddfba4128fe10064cbb93a 把 Data Source 和其他 Proto ...

随机推荐

  1. ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

    于遇到了项目中实体类嵌套多层子级实体集合,并且子级实体集合的数据需要提交保存到数据库中的问题.针对此情况需要进行一些特殊的处理才可以将整个 实体类及子级实体集合数据提交表单到控制器中,解决的方法是根据 ...

  2. MySQL 中文显示乱码

    最近关于中文显示乱码的贴子比较多,所以也做了个总结: 可以参考一下杨涛涛版主的<各种乱码问题汇总> http://topic.csdn.net/u/20071124/08/3b7eae69 ...

  3. 浅谈push推送的一点感受

    在手机已成为生活必不可分的一部分,push服务伴随而来.ios的apns,android随着谷歌退出中国市场,各家在android的推送不断展开.有厂商的推送,如小米.华为.魅族.oppo等,还有中间 ...

  4. php 图片上传 文件上传 大小 限制

    nginx  413 Request Entity Too Large Php无法上传文件 查看php脚本运行用户,写个php脚本 <?php echo shell_exec("id ...

  5. Hibernate通过one-to-one元素的一对一映射

    正如我们在前面的例子中讨论过的,在hibernate中执行一对一映射有两种方法: 通过many-to-one元素 通过one-to-one元素 这里,我们将通过one-to-one元素进行一对一的映射 ...

  6. Spring MVC静态页面

    以下示例显示如何使用Spring MVC Framework编写一个简单的基于Web的应用程序,它可以使用<mvc:resources>标记访问静态页面和动态页面.首先使用Eclipse ...

  7. Eclipse 创建 Java 包

    打开新建 Java 包向导 你可以使用新建 Java 包向导来创建 Java 包.Java 包向导打开方式有: 通过点击 "File" 菜单并选择 New > Package ...

  8. python 面试题 string int

    str1 = 'hello' str2 = str1 str3 = str1 str4 = str1 str1 = '' int1 = 1 int2 = int1 int3 = int1 int4 = ...

  9. Laravel5.1 模型 --软删除

    软删除是比较实用的一种删除手段,比如说 你有一本账 有一笔记录你觉得不对给删了 过了几天发现不应该删除,这时候软删除的目的就实现了 你可以找到已经被删除的数据进行操作 可以是还原也可以是真正的删除. ...

  10. Java手记

    由于腾讯的MTA只有JAVA的demo,为了测试用php实现的加密算法是否正确,所有只能运行一下Java 配置环境:http://www.runoob.com/java/java-environmen ...