隨著項目一步一步的開發(fā)赃梧,團隊小伙伴的增多省核,業(yè)務量的增多掂僵,以及swift的引入航厚,混合編譯導致APP體積也在慢慢增大,期初項目在打完包锰蓬,并且經(jīng)過APP Strore上線后包的大小只有30mb左右幔睬,到現(xiàn)在起步67mb還沒經(jīng)過app Store上線蘋果外加的一些驗證的東西。因此APP瘦身刻不容緩芹扭,但是項目時間都比較緊張一直沒有騰出時間來做一次瘦身麻顶。終于在項目一次大改版后有兩天時間來瘦身一下了赦抖。
瘦身離不開這三個方面(暫時想到,同時也參考了其他公司的瘦身經(jīng)驗)澈蚌,首先想到的是圖片資源摹芙,其次是代碼優(yōu)化,最后是編譯build setting的瘦身宛瞄。
首先說下圖片資源吧浮禾,這個可能是最好想到的,因為項目中最常見的就是圖片過多導致的包越來越大份汗。
具體下面需要用到的工具已經(jīng)上傳到github盈电,需要的同學可以自行下載
一. 針對圖片瘦身
1. 對于在項目中沒有使用的圖片資源的剔除,(可能是老版本遺留下來杯活,但是現(xiàn)有版本已經(jīng)不用匆帚,甚至代碼都已經(jīng)改沒了,但是圖片還在的情況旁钧,)
這個時候可以使用LSUnusedResources查找沒有用到的圖片吸重。?LSUnusedResources是一個開源的項目,你可以在對應的github上下載下來直接運行就可以使用歪今,使用方式在github上已經(jīng)介紹的很詳細了嚎幸。
下載好LSUnusedResources 之后在Mac上運行項目。出現(xiàn)查找的圖片可以直接刪除寄猩。
注意:使用的時候注意不要誤刪<稻А!不要誤刪田篇,對于LSUnusedResources這個項目其實也有一些問題替废,比如在項目中通過for循環(huán)加入的圖片,沒有具體的引用圖片的名稱也是會被檢測出來的泊柬,這個時候就需要我們手動的去查看一下椎镣,項目中這些到底有沒有使用。如果沒有使用可以直接刪除兽赁,但是如果有引用衣陶,但是你刪除了這時候就會導致crash。
```
[UIImage imageNamed:[NSString stringWithFormat:@"01_0000%d.png",I] 這種情況容易出現(xiàn)找到對應的圖片闸氮,但是項目中還在使用,不要錯誤刪除教沾。
```
2. 重復圖片的剔除(就是同樣大小尺寸蒲跨,只是名稱不同的圖片)
重復資源(主要指圖片)不是指命名重復而是內(nèi)容相同。
fdupes 是Linux下的一個工具授翻,可以在指定的目錄及子目錄中查找重復的文件或悲。fdupes通過對比文件的MD5簽名孙咪,以及逐字節(jié)比較文件來識別重復內(nèi)容。項目中圖片分兩處存放巡语,Assets.xcassets和images文件夾翎蹈,所以在這兩個目錄查找就可以。如果沒有安裝fdupes直接在電腦終端運行
?brew install fdupes
只需等待fdupes更新完成后男公,就可以安裝在項目中可以直接使用查找重復的資源荤堪,
fdupes -r asse文件夾位置? image文件夾位置
針對找出來的重復資源處理方式:
1. 同一張圖片文件名稱也相同的在asset.xcassets和images中,刪除image的圖片枢赔。
2. 不同文件名的圖片尺寸內(nèi)容完全相同的(可以使用刪除一個保留另一個澄阳,在代碼中更換圖片資源名稱,如果是跨組件間的圖片重復就需要放在公共業(yè)務中心或者組件中心了)踏拜。
3. 2x 和3x 圖片尺寸是一樣的碎赢,(現(xiàn)在只保留3x圖片)
3. 無損壓縮圖片
可以使用imageOptim工具直接壓縮相應的圖片,他是通過優(yōu)化壓縮參數(shù)速梗,移除無用的文件數(shù)據(jù)和不必要的顏色搭配來實現(xiàn)無損壓縮的肮塞。
如果UI同學在給你設計圖的時候沒有壓縮圖片,那么你的項目也是會變得異常的大姻锁,通過這個免費的軟件可以直接瘦身壓縮你需要的圖片枕赵。
當然也可以使用這個鏈接下的網(wǎng)頁工具,但是這個是有損壓縮屋摔。http://tinypng.com烁设。
4. 可執(zhí)行文件瘦身
linkmap是Xcode產(chǎn)生可執(zhí)行文件的同時產(chǎn)生的連接信息,用來描述可執(zhí)行文件的構造成分钓试,具體的是在項目中打開wirte link file 設置為yes装黑。build之后在項目中可以找到對應的位置(我是用過模擬器運行的,所以對對應的位置是模擬器的弓熏,真機可以直接在真機的相應的位置進行查找恋谭。)
相應的位置是在執(zhí)行下面的js ? ,由于使用的環(huán)境是node挽鞠,因此需要安裝node環(huán)境 可以執(zhí)行 brew install ndoe
環(huán)境安裝完成后執(zhí)行 node linkmap.js ?filepath(這個就是剛剛找到的linkmap的文件)-hl
下載好linkmap.js文件并且執(zhí)行node linkmap.js ?filepath(這個就是上圖的linkmap的文件位置)就可以看到相應變異后文件的大小疚颊,這樣就可以使用根據(jù)具體的代碼進行分析優(yōu)化了。
5. 編譯的靜態(tài)庫瘦身
在項目中使用lipo 工具可以查看自持的指令集信认,由于armv7 完全兼容armv7s 可以刪除armv7s材义。
lipo -info? 庫名稱
對應的可以查看對應的庫名稱,進而修改庫的支持嫁赏,建議去掉armv7s其掂,畢竟armv7已經(jīng)兼容了armv7s,多一個內(nèi)核架構的支持就會意味著多一份指令集的加入潦蝇,體積就會相應的增大一些款熬,實際在項目中減少了大約8mb(包括自己項目維護的SDK也去掉了相應的armv7s)深寥。
具體的刪除armv7s的方式如下:
注意:在xcode10之后多了一種指令集的支持,arm64e 贤牛,這個是查看蘋果的官方文檔這個是A12芯片開始支持惋鹅,但是在testflight和打包上線的時候刪除,這個暫時沒有研究過殉簸,但是看了官方的文檔后猜測這個架構的指令集引入是為了方便開發(fā)人員調(diào)試時使用的闰集,因為現(xiàn)在項目中也并沒有使用到這個架構,因此我們準備刪除這個架構的指令集的支持喂链,(可能后期會加回來)
6. 編譯項目中的build setting來優(yōu)化
到此想到的優(yōu)化都已經(jīng)實施了返十,APP在多方考慮下進行了瘦身,由原來的68mb椭微,縮減到了只有55mb左右洞坑,這個是直接在蒲公英上面打出來的包,就像上面的build setting只是做了部分的優(yōu)化蝇率,這個在上testflight或者上線的時候設置后還可以縮小一些體積迟杂,由于現(xiàn)在階段還處于開發(fā)階段暫時沒有做處理,等項目上線前設置下就可以本慕。
參考文章:
http://www.reibang.com/p/c94dedef90b7??
http://www.reibang.com/p/b38052ee56af