给iOS App减肥

前言

笔者的项目中,成员变动快,且都是学生开发,无用的东西堆积如山。一堆文件没引用,一堆方法不会调用也没有删掉。且UI时有改动,旧UI也不删。打包出来31.1M。刚接手的时候只是10多M的孩子,咋忽然就变胖了。并且笔者有点洁癖,看起来好累。最后大小25.8M,减肥了5.3M,关键是无用代码量少了舒服。html

笔者上网找到如下工具,亲自尝试一遍,并把过程记录下来。不过这些工具并不100%准确,只起辅助做用,最终仍是由咱们判断能不能删。因此要作好备份,而且对项目有必定的熟悉度。git

LSUnusedResources

  • 做用

查找无用图片并删除。github

  • 使用

勾选的选项中,若是代码有出现字符串和xcassets中图片名字同样,这工具就认为该图片是有用到的。该工具默认所有都勾选上了。ruby

image.png

image.png

图二中圈住部分,能够识别拼接的字符串,然而,表情包名字没有其余前缀,因此这个工具识别不出来它们其实是有用到的。bash

因此名字有数字的图(例如上面的000,001),不一样图片有重复子字符串(如homework_语文做业,homework_美术做业),若是不肯定,保险起见,仍是须要手动搜索一下。工具

同理,若是图片名称是全中文,基本能够肯定是没有引用的。性能

果不其然,笔者搜索homework_,发现有这么一段代码。测试

NSString *string = [NSString stringWithFormat:@"homework_%@",self.subjectLabel.text];
        [self.subjectImageView setImage:[UIImage imageNamed:string]];
复制代码
  • 效果

通过一番折腾,笔者删掉了将近100张没用的图片。打包测试,这时候包大小变为26.8M,较原始包减少了4.3M,做用仍是很明显的。ui

imageoptim

  • 做用 经过删除图片部分无用的EXIF等信息来减少PNG、JPEG和GIF图片的大小。

从Xcode编译时自带的“图片压缩”提及提到,压缩过的图片带来更高的应用运行速度。又能减小包大小,何乐而不为呢。spa

  • 使用

选中项目路径就行。

  • 效果

经笔者测试,多是项目图片太多,加上电脑性能不怎么样,这工具运行了超久!并且底部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安装包瘦身实践。文章做者解决方法是生成两个.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

付费工具。

  • 做用

找到没使用的方法。事实上这个工具还有不少其余功能。

  • 使用

emmm...这个工具也不是100%可靠,笔者对项目中的方法不是特别熟悉,因此就不用了(还不是没钱买)。


参考