App Store 規(guī)定了安裝包大小超過(guò) 150MB 的 App 不能使用 OTA(over-the-air)環(huán)境下載,也就是只能在 WiFi 環(huán)境下下載。所以,150MB 就成了 App 的生死線,一旦超越了這條線就很有可能會(huì)失去大量用戶。但是目前我們App企業(yè)端132.9MB,司機(jī)端124.3MB。因此減少包瘦身就顯得比較重要。
目前正在開發(fā)的任務(wù)也進(jìn)入提測(cè)階段,手頭有了空閑時(shí)間,所以就開始研究App的瘦身方案。
官方 App Thinning
App Thinning 是由蘋果公司推出的一項(xiàng)可以改善 App 下載進(jìn)程的新技術(shù),主要是為了解決用戶下載 App 耗費(fèi)過(guò)高流量的問(wèn)題,同時(shí)還可以節(jié)省用戶 iOS 設(shè)備的存儲(chǔ)空間。
現(xiàn)在的 iOS 設(shè)備屏幕尺寸、分辨率越來(lái)越多樣化,這樣也就需要更多資源來(lái)匹配不同的尺寸和分辨率。 同時(shí),App 也會(huì)有 32 位、64 位不同芯片架構(gòu)的優(yōu)化版本。如果這些都在一個(gè)包里,那么用戶下載包的大小勢(shì)必就會(huì)變大。
App Thinning 會(huì)專門針對(duì)不同的設(shè)備來(lái)選擇只適用于當(dāng)前設(shè)備的內(nèi)容以供下載。比如,iPhone 6 只會(huì)下載 2x 分辨率的圖片資源,iPhone 6plus 則只會(huì)下載 3x 分辨率的圖片資源。
App Thinning 有三種方式,包括:App Slicing、Bitcode、On-Demand Resources。
App Slicing,會(huì)在你向 iTunes Connect 上傳 App 后,對(duì) App 做切割,創(chuàng)建不同的變體,這樣就可以適用到不同的設(shè)備。
On-Demand Resources,主要是為游戲多關(guān)卡場(chǎng)景服務(wù)的。它會(huì)根據(jù)用戶的關(guān)卡進(jìn)度下載隨后幾個(gè)關(guān)卡的資源,并且已經(jīng)過(guò)關(guān)的資源也會(huì)被刪掉,這樣就可以減少初裝 App 的包大小。
Bitcode ,是針對(duì)特定設(shè)備進(jìn)行包大小優(yōu)化,優(yōu)化不明顯。
這里的大部分工作都是由 Xcode 和 App Store 來(lái)幫你完成的,你只需要通過(guò) Xcode 添加 xcassets 目錄,然后將圖片添加進(jìn)來(lái)即可。我們所做的任務(wù)較少。
圖片資源
圖片資源的優(yōu)化空間,主要體現(xiàn)在刪除無(wú)用圖片和圖片資源壓縮這兩方面。而刪除無(wú)用圖片,又是其中最容易、最應(yīng)該先做的。
隨著項(xiàng)目的不斷迭代,可能有的功能已經(jīng)廢棄,或者UI改版導(dǎo)致項(xiàng)目中無(wú)用的圖片資源不斷增加。刪除圖片資源可以通過(guò)LSUnusedResources
使用方式簡(jiǎn)單:
1、從gitHub下載該項(xiàng)目,使用Xcode運(yùn)行此項(xiàng)目
2、點(diǎn)擊?Browse.. 選擇你的項(xiàng)目工程目錄
3、如果項(xiàng)目中有動(dòng)態(tài)獲取的資源名,比如說(shuō)icon_1 icon_2,可以勾選Ignore similar name,自行添加
4、點(diǎn)擊click?Search搜索
5、刪除不需要使用的資源,注意留意fullPath,因?yàn)橛械膱D片資源是第三方庫(kù)中的,可以自行看情況是否需要?jiǎng)h除
圖片資源壓縮
對(duì)于 App 來(lái)說(shuō),圖片資源總會(huì)在安裝包里占個(gè)大頭兒。對(duì)它們最好的處理,就是在不損失圖片質(zhì)量的前提下盡可能地做壓縮。
1、可以使用將圖片轉(zhuǎn)成 WebP。WebP 是 Google 公司的一個(gè)開源項(xiàng)目。
WebP 壓縮率高,而且肉眼看不出差異,同時(shí)支持有損和無(wú)損兩種壓縮模式。比如,將 Gif 圖轉(zhuǎn)為 Animated WebP ,有損壓縮模式下可減少 64% 大小,無(wú)損壓縮模式下可減少 19% 大小。WebP 支持 Alpha 透明和 24-bit 顏色數(shù),不會(huì)像 PNG8 那樣因?yàn)樯什粔蚨霈F(xiàn)毛邊。接下來(lái),我們?cè)倏纯丛趺窗褕D片轉(zhuǎn)成 WebP?
Google 公司在開源 WebP 的同時(shí),還提供了一個(gè)圖片壓縮工具 cwebp來(lái)將其他圖片轉(zhuǎn)成 WebP。
不過(guò),WebP 在 CPU 消耗和解碼時(shí)間上會(huì)比 PNG 高兩倍。而且webp作為非官方的圖片格式,實(shí)用上不夠方便,而且不兼容App thinning。所以,我們有時(shí)候還需要在性能和體積上做取舍。
2、因?yàn)槲覀児臼褂玫氖撬{(lán)湖,也可以下載icon時(shí),開啟切圖壓縮,畫質(zhì)基本是不變的。兼容App thinning
3、平時(shí)開發(fā)中盡量保持風(fēng)格統(tǒng)一,可以跟UI設(shè)計(jì)師溝通一下,同一類型的圖標(biāo)不要每開發(fā)一個(gè)功能,就換圖標(biāo)。盡量做到同類型的圖標(biāo)能復(fù)用。如果只是顏色的不同,可以自己設(shè)置圖片的tintColor來(lái)改變顏色。多說(shuō)一句,如果沒(méi)有特殊要求,我推薦直接使用蘋果公司提供的。具體來(lái)說(shuō),在 iOS 系統(tǒng)內(nèi)置的 SF Symbols 為我們提供了 3150 個(gè)一致的、可定制的圖標(biāo)。
SF Symbols 有很多優(yōu)點(diǎn):
它數(shù)量巨大,幾乎覆蓋所有應(yīng)用場(chǎng)景;
整合了 San Francisco 字體系統(tǒng),當(dāng)用戶改變字體大小的時(shí)候,這些圖標(biāo)都會(huì)自動(dòng)對(duì)齊;
所有圖標(biāo)都支持顏色,我們可以根據(jù)需求搭配不同的顏色;
使用這些圖標(biāo)時(shí)也無(wú)須安裝,可以減少 App 的體積。
代碼瘦身
刪除無(wú)用類,可以使用腳本。將無(wú)用類導(dǎo)出,但是在刪除類的時(shí)候,盡量自己查下工程代碼排除一下,因?yàn)橛械念愂峭ㄟ^(guò)Runtime的方式使用的,這個(gè)腳本不能很好的檢測(cè)出來(lái)。