阅读 1893

给iOS App减肥

前言

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

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

LSUnusedResources

  • 作用

查找无用图片并删除。

  • 使用

勾选的选项中,如果代码有出现字符串和xcassets中图片名字一样,这工具就认为该图片是有用到的。该工具默认全部都勾选上了。

image.png

image.png

图二中圈住部分,可以识别拼接的字符串,然而,表情包名字没有其他前缀,所以这个工具识别不出来它们实际上是有用到的。

所以名字有数字的图(例如上面的000,001),不同图片有重复子字符串(如homework_语文作业,homework_美术作业),如果不确定,保险起见,还是需要手动搜索一下。

同理,如果图片名称是全中文,基本可以确定是没有引用的。

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

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

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

imageoptim

  • 作用 通过删除图片部分无用的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安装包瘦身实践。文章作者解决方法是生成两个.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%可靠,笔者对项目中的方法不是特别熟悉,所以就不用了(还不是没钱买)。


参考

关注下面的标签,发现更多相似文章
评论