官方App Thining
App Thining會(huì)根據(jù)不同的設(shè)備提供相應(yīng)的App包進(jìn)行下載珍特。
App Thinning 有三種方式,包括:App Slicing二蓝、Bitcode、On-Demand Resources。
- App Slicing承二,會(huì)在你向 iTunes Connect 上傳 App 后,對 App 做切割纲爸,創(chuàng)建不同的變體亥鸠,這樣就可以適用到不同的設(shè)備。
- On-Demand Resources识啦,主要是為游戲多關(guān)卡場景服務(wù)的负蚊。
- Bitcode ,是針對特定設(shè)備進(jìn)行包大小優(yōu)化颓哮,優(yōu)化不明顯家妆。
App Thining大部分工作都是由 Xcode 和 App Store 完成的,具體操作:
- 根據(jù)屏幕分辨率區(qū)分圖片資源:2x和3x圖冕茅。(需要使用xcassets來保存圖片資源)
- 根據(jù)芯片架構(gòu)區(qū)分:arm64伤极、armv7、armv7s
圖片資源優(yōu)化
-
無用圖片資源:
- 腳本檢測
- LSUnusedResources
-
圖片壓縮:
- 無損壓縮:可能會(huì)帶來反效果姨伤。Xcode的Building Setting中有Compress PNG Files選項(xiàng)哨坪,如果開啟后,打包時(shí)會(huì)對圖片進(jìn)行處理姜挺。Compress PNG Files最主要的目的并不是壓縮圖片的大小齿税,而是將圖片轉(zhuǎn)換成iPhone能更方便處理的格式,加快APP運(yùn)行時(shí)圖片的處理速度炊豪,有可能會(huì)增大圖片的大小凌箕。
- 有損壓縮
-
對于過大的圖片拧篮,可以利用工具轉(zhuǎn)換為WebP格式
- WebP 壓縮率高,而且肉眼看不出差異
- 缺點(diǎn):顯示圖片時(shí)需使用 libwebp 進(jìn)行解析牵舱,WebP 在 CPU 消耗和解碼時(shí)間上會(huì)比 PNG 高兩倍
-
圖片云化
- 采用相應(yīng)的策略將圖片進(jìn)行云化處理串绩,在APP啟動(dòng)或空閑時(shí)再進(jìn)行下載。
代碼瘦身
OC是動(dòng)態(tài)語言芜壁,檢測無用代碼時(shí)需要注意Runtime調(diào)用礁凡。
使用腳本,檢測import的文件
-
使用AppCode的靜態(tài)分析慧妄,檢測無用代碼顷牌。但是有缺陷:
- JSONModel 里定義了未使用的協(xié)議會(huì)被判定為無用協(xié)議;
- 如果子類使用了父類的方法塞淹,父類的這個(gè)方法不會(huì)被認(rèn)為使用了窟蓝;
- 通過點(diǎn)的方式使用屬性,該屬性會(huì)被認(rèn)為沒有使用饱普;
- 使用 performSelector 方式調(diào)用的方法也檢查不出來运挫,比如 self performSelector:@selector(arrivalRefreshTime);
- 運(yùn)行時(shí)聲明類的情況檢查不出來套耕。比如通過 NSClassFromString谁帕。
-
利用Mach-O的section獲取到所有的類、使用的類冯袍、使用的方法等做差集:
- __objc_classlist:項(xiàng)目中所有的類
- __objc_classrefs:被使用的類
- __objc_superrefs:被使用的父類
- __objc_nlclslist和__objc_nlcatlist:實(shí)現(xiàn)了+load的類和分類
- __cstring:靜態(tài)字符串匈挖,可以匹配使用了NSClassFromString的類名
- __objc_selrefs:被調(diào)用的方法
-
LinkMap 和 Mach-O結(jié)合使用:通過linkmap取出所有類和方法,再結(jié)合Mach-O被使用的類和方法做差集
獲取 LinkMap 可以通過將 Build Setting 里的 Write Link Map File 設(shè)置為 Yes
-
LinkMap 文件分為三部分:Object File颠猴、Section 和 Symbols:
- Object File 包含了代碼工程的所有文件关划;
- Section 描述了代碼段在生成的 Mach-O 里的偏移位置和大小翘瓮;
- Symbols 會(huì)列出每個(gè)方法、類裤翩、block资盅,以及它們的大小。
通過 LinkMap 踊赠,不光可以統(tǒng)計(jì)出所有的方法和類呵扛,還能夠清晰地看到代碼所占包大小的具體分布,進(jìn)而有針對性地進(jìn)行代碼優(yōu)化筐带。
-
已經(jīng)沒有流量的業(yè)務(wù)今穿,但是代碼存在引用:
- 利用埋點(diǎn)相關(guān)數(shù)據(jù)檢測PV(Page View,頁面瀏覽量)伦籍,PV為0表示相關(guān)代碼可以下掉
-
運(yùn)行時(shí)檢查類是否真正被使用過
對象第一次發(fā)送消息時(shí)蓝晒,會(huì)調(diào)用+initialize方法進(jìn)行初始化腮出。
isInitialized 的結(jié)果會(huì)保存到元類的 class_rw_t 結(jié)構(gòu)體的 flags 信息里,flags 的 1<<29 位記錄的就是這個(gè)類是否初始化了的信息芝薇。
參考來源:
- 戴銘《iOS開發(fā)高手課》
- 項(xiàng)目經(jīng)驗(yàn)