iOS 性能优化-APP瘦身

应用距离上次瘦身已接近一年时间,恰好版本修改了一些功能实现,需要删除一些三方库使用,所以借机进行一次应用瘦身。在此将本次使用和查询到的瘦身方法做一些总结。

ipa文件内容

IPA文件包主要包括可执行文件、签名文件、info.plist、entitlements、App Plugins、链接库、资源文件等。(详见:iOS开发:Archive、ipa 和 App 包瘦身
瘦身的主要操作集中在可执行文件及资源文件。

资源瘦身

1.删除无用资源

使用LSUnusedResources查找无用图片。
使用方式:从github下载后直接运行,输入项目路径,点击搜索查询。

LSUnusedResources.png

查询结果不是特别准确,建议查询后根据结果在项目中逐一查询确认,手动删除

2.删除重复的资源

重复资源(主要指图片)不是指命名重复而是内容相同。
fdupes 是Linux下的一个工具,可以在指定的目录及子目录中查找重复的文件。fdupes通过对比文件的MD5签名,以及逐字节比较文件来识别重复内容。

  • 安装fdupes。
 brew install fdupes

安装较慢,需要等待一段时间。


fdupes.png
  • 查找重复的资源
fdupes -r asse文件夹位置  image文件夹位置

可直接查找项目总路径,方便查出整个项目中的相同图片及类文件(.plist及.xcconfig等也会被排查输出)。

3.无损压缩图片

通过优化压缩参数,移除无用的文件数据和不必要的颜色搭配来实现无损压缩的。

WebP是Google提供的一种图片编码格式,通常情况下WebP格式的图片是原始JPG/PNG图片的1/3,所以对于重度依赖图片显示的应用,转换使用WebP可以节省大量的网络传输数据和时间。对于APP瘦身,使用WebP格式可能是一种方式,可以使用WebP格式的图片替代现有的图片资源,可以一定程度的节省空间。

4.图片管理方式
  • 使用Assets.xcassets管理文件
    因为它会把里边的所有 png 格式的图片压缩成一个Assets.car文件,压缩比率比其他方式管理图片要高,大大减少图片体积,同时也保证了安全性。

  • 用LaunchScreen.storyboard替换启动图片。



可执行文件瘦身

1.删除已废弃pod引用
  • 删除弃用的库文件

  • 减少release模式下的库引入

避免一些在debug模式下调试用的库,在release环境Archive编译至IPA包中。

pod 'MLeaksFinder', :configurations => ['Debug']
pod 'FBRetainCycleDetector', :git=> 'https://github.com/facebook/FBRetainCycleDetector.git', :configurations => ['Debug']
2.删除未使用头文件
3.删除已废弃代码类

Fui用来找出OC项目中未用到OC的头文件引用。

安装:打开终端进入fui下载文件

gem install fui

比较慢,耐心等待。

在目标路径下检索未使用类:

fui find

由于工具只是检测类文件是否被引用,故检测结果并非完全正确,如一些扩展类文件(扩展中方法置换,无需头文件引用),同时未被使用三方库文件也会输出。

建议检测出后逐文件查询排查后手动删除

4.去除相同代码
  • 安装python环境
sudo easy_install pip
  • 下载安装SimHash的python工具
pip install simhash
  • 下载SameCodeFinder查找相似代码
    启动终端,cd 至SameCodeFinder代码文件夹,执行python SameCodeFinder.py [arg0] [arg1]
Optional

* [arg0]
    * Target Directory of files should be scan
* [arg1]
    * Doc Suffix of files should be scan, eg
        * .m     - Object-C file 
        * .swift - Swift file
        * .java  - Java file
* --detail        
    * show process detail of scan
* --functions         
    * Use Functions as code scan standard
* --max-distance=[input] 
    * max hamming distance to keep, default is 20
* --min-linecount=[input]
    * for function scan, the function would be ignore if the total line count of the function less than min-linecount
* --output=[intput]
    * Customize the output file, default is "out.txt"

示例:

python SameCodeFinder.py ~/Projects/opensource/MWPhotoBrowser/ .m  --max-distance=10 --min-linecount=3 --functions --detail

结果:
在SameCodeFinder文件夹会生成一个out.txt文件,打开即可看到检测结果。

...
('YYDiskCache.m(_trimRecursively)', 'YYMemoryCache.m(_trimRecursively)', 0)
('YYCache.m(description)', 'YYMemoryCache.m(description)', 0)
...

最后一位数字代表两个文件的海明距离,数字越小说明两个文件越类似。

5.LinkMap

LinkMap文件是Xcode产生可执行文件的同时生成的链接信息,用来描述可执行文件的构造成分,包括代码段(__TEXT)和数据段(__DATA)的分布情况。

在 Xcode Target -> Build Settings -> Write Link Map File 设置为 YES,然后在 Target -> Build Settings -> Path to Link Map File 选项中设置好 LinkMap 的生成地址(一般用 build 文件夹中的默认地址就好了),archive 成功后,我们就可以在对应地址找到该次编译的 LinkMap 了

这里还可以设置Link Map存放的位置,默认的位置为:

$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt

我们可根据自己的需要自行设置该文件的位置,这里为便于查看,我设置为桌面路径。

/Users/***/Desktop/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt

路径修改完成后,command+B我们编译一下,桌面上会多一个***-LinkMap-normal-arm64.txt的文件。

LinkMap.png

但是这个文件比较多,不太好分析,我们可以通过借助第三方工具解析LinkMap

下载完成后,运行该项目并选择路径,界面如下:

ScreenShot1.png
ScreenShot2.png

这样就能很清晰的看到编译后文件的大小了,根据情况进行文件优化。

6.编译选项优化
  • Optimization Level在release状态设置为Fastest,Smallest[-Os]

  • Strip Debug Symbols During Copy在release状态设置为YES

  • Strip Linked Product在release状态设为YES

  • Make String Read-Only在release状态设为YES

  • Dead Code Stripping在release状态设为YES

  • Deployment PostProcessing在release状态设为YES

  • Symbols hidden by default在release状态设为YES

7.开启BitCode
'/Users/***/Desktop/TestDemo/IFlyMSC_Dylib.framework/IFlyMSC_Dylib' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. file '/Users/***/Desktop/TestDemo/IFlyMSC_Dylib.framework/IFlyMSC_Dylib' for architecture arm64

必须项目中使用的库文件都支持bitcode,才能设置为YES。

8.其他


思维导图

借用Vinecnt大神思维导图。

思维导图.png


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350