1 分析當(dāng)前ipa的組成
一般一個(gè)ipa會包含:
1) 資源文件
- 本地文件:數(shù)據(jù)、配置、數(shù)據(jù)庫等等
- 字體文件
- 圖片資源:1.刪除不用的圖片,2.檢查重復(fù)的圖片,3.壓縮大圖片
- 源代碼
通過生成linkmap文件,分析源代碼生成的編譯文件的大小。在Build Settings中Write Link Map File設(shè)置為Yes (記住release時(shí)候不要設(shè)置為Yes)。
編譯之后會在build目錄中生成兩個(gè)LinkMap文件: XXX-LinkMap-normal-i386和XXX-LinkMap-normal-x86_64,分別代表在模擬器中32位和64位指令集生成的LinkMap文件。關(guān)于LinkMap的文件詳細(xì)結(jié)構(gòu)解釋可以參考:http://blog.cnbang.net/tech/2296/
LinkMap會包含每個(gè)可執(zhí)行文件的偏移量及大小,所以可以很方便的知道每個(gè)可執(zhí)行文件的大小??梢允褂肔inkMap分析工具:https://github.com/huanxsd/LinkMap

2 資源瘦身
無用的圖片文件
查找無用的圖片文件,使用LSUnusedResources(https://github.com/tinymind/LSUnusedResources)
注意:如果是.bundle文件可以解壓出來放到工程中,再用軟件掃描

重復(fù)的圖片文件
(同事在用,自己用了下沒找到重復(fù)的文件,只找到相似的文件,所以不知道好不好,希望用過的同學(xué)說一下怎么樣)
查找重復(fù)圖像文件,使用Duplicate Photo Finder(App Store有免費(fèi)下載)
無損壓縮圖片
使用ImageOptim(https://github.com/ImageOptim/ImageOptim)進(jìn)行png文件的無損壓縮

WebP圖片壓縮
WebP是Google提供的一種圖片編碼格式,通常情況下WebP格式的圖片是原始JPG/PNG圖片的1/3,所以對于重度依賴圖片顯示的應(yīng)用,轉(zhuǎn)換使用WebP可以節(jié)省大量的網(wǎng)絡(luò)傳輸數(shù)據(jù)和時(shí)間。對于APP瘦身,使用WebP格式可能是一種方式,可以使用WebP格式的圖片替代現(xiàn)有的圖片資源,可以一定程度的節(jié)省空間。
使用WebP轉(zhuǎn)換工具
(https://developers.google.com/speed/webp/docs/precompiled)嘗試轉(zhuǎn)換了幾張較大的圖片,效果如下:

iOS原生并不支持WebP格式加載,需要引入SDWebImage/WebP,詳細(xì)可以參考: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;
或者使用YYImage,加載WebP格式
CGFloat scale = [UIScreen mainScreen].scale;
NSData *data = [[NSData alloc] initWithContentsOfFile:webPPath];
UIImage *img = [YYImage imageWithData:data scale:scale];
//UIImage *img = [YYImage imageNamed:webPPath];
使用WebP格式的圖片,似乎就拋棄了iOS @2x @3x按照設(shè)備加載對應(yīng)圖片的機(jī)制,所以應(yīng)該還可以刪除所有@2x圖片,不過加載速度比原生較慢。
2019.07.01補(bǔ)充
WebP轉(zhuǎn)換軟件:
XnConvert (Windows/Mac OS X/Linux) :AppsStore有下載
轉(zhuǎn)的有問題,透明底色的圖片出現(xiàn)白色底色
Webp 轉(zhuǎn)換工具
線上工具:騰訊智圖 、ppms-photo(http://ppms1.jd.com/photo)
本地工具:WebP Converter
WebP Converter 的安裝請參見:https://developers.google.com/speed/webp/
mac 可用 homebrew 安裝:
sudo brew install webp
使用以下指令轉(zhuǎn)換 webp
cwebp -q 80 image.png -o image.webp
具體參見:https://developers.google.com/speed/webp/docs/cwebp
還有一個(gè)騰訊開發(fā)的iSparta,可以把圖片轉(zhuǎn)成WebP。
注釋:
XnConvert 試了,轉(zhuǎn)的有問題,透明底色的圖片出現(xiàn)白色底色 :結(jié)果失敗
WebP Converter試了,我安裝失敗了:結(jié)果失敗
ppms-photo要翻墻,所以沒試:結(jié)果沒試
iSparta,后面才發(fā)現(xiàn) :結(jié)果沒試
最后我用都是騰訊智圖 :結(jié)果成功
2019.07.01補(bǔ)充
網(wǎng)絡(luò)加載
一些圖片使用SDWebImage加載
例如:一些背景圖
圖片使用率提高
提高圖片使用率
例如:一些UI背景圖一樣,只是文字不同,可以公用一張背景圖,替換上面的內(nèi)容
圖片熱更新
把圖片,CSS樣式等資源文件從項(xiàng)目中剝離出來,放到一個(gè)特定的目錄里;然后,我們每次都這個(gè)特定地目錄讀取數(shù)據(jù);最重要的是,我們可以動(dòng)態(tài)更新這個(gè)目錄,實(shí)現(xiàn)圖片等資源文件的動(dòng)態(tài)更新,即熱更新.
3 代碼瘦身
AppCode代碼靜態(tài)檢查
AppCode提供了非常強(qiáng)大的代碼靜態(tài)檢查工具,使用Inspect Code,可以找到很多代碼優(yōu)化的地方??梢詤⒖歼@篇介紹:AppCode inspections for your code perfection
清除無用代碼
AppCode搜索出來的無用的Class,會有誤報(bào)需要仔細(xì)檢查每一個(gè)報(bào)錯(cuò)的代碼。
使用Fui(https://github.com/dblock/fui)查找發(fā)現(xiàn)下列無用文件,同樣需要double check避免誤刪
清除無用的Import
Fui(https://github.com/dblock/fui)可以用于查找無用的import,同時(shí)也提供xcfui 可以和Xcode集成。
清除無用的Method
1. 基于AppCode的掃描定期做清理
你可以用 AppCode這個(gè)IDE。工具條Code-->Inspect Code...。是的,不要以為只有Xcode才能寫OC, 這個(gè)工具可以把一些沒有使用到了類、屬性啥的都可以檢測出來,還是那句話,不要一味地相信他人,要二次確認(rèn)是否可刪。
2. 這篇文章提供了一個(gè)很好的思路可以一鍵刪除無用方法:http://www.itdecent.cn/p/a53480ad0364
查找相似的代碼
使用SameCodeFinder (https://github.com/startry/SameCodeFinder)可以查找到相似的代碼,最后一位數(shù)字代表兩個(gè)文件的海明距離,數(shù)字越小說明兩個(gè)文件越類似。
清理其他無用的代碼
1. 已經(jīng)下線的陳舊代碼,AB試驗(yàn)已經(jīng)下線的代碼
2. 通過轉(zhuǎn)H5、Hybrid或者RN實(shí)現(xiàn)的Native功能,可以定期清理
3. 一些非核心Hybrid或者RN模塊,可以考慮不要打包進(jìn)入APP,通過動(dòng)態(tài)下發(fā)的方式獲取
4. 代碼的重構(gòu),UI組件、業(yè)務(wù)邏輯的重用等等
4 一些參考文章
- iOS可執(zhí)行文件瘦身:http://blog.cnbang.net/tech/2544/
- iOS APP瘦身實(shí)踐:http://www.itdecent.cn/p/c94dedef90b7,資源優(yōu)化、編譯器配置優(yōu)化、可執(zhí)行文件優(yōu)化
- 滴滴出行iOS端瘦身實(shí)踐: http://gmtc.geekbang.org/#schedule, 提供了查找無用圖片的工具、WebP圖片壓縮、基于clang plugin實(shí)現(xiàn)查找無用代碼(https://github.com/kangwang1988/XcodeZombieCode)、查找類似代碼(https://github.com/startry/SameCodeFinder)
- 基于clang插件的一種iOS包大小瘦身方案
- 減小ipa體積之刪除frameWork中無用mach-O文件
參考文章:
iOS代碼瘦身實(shí)踐
ipa文件“減肥”初探
iOS - ipa安裝包大小優(yōu)化
newiOS App優(yōu)化1---減少包體積