漫談iOS的應用瘦身

? ? ? ? 前段時間部門開需求會,砍掉了應用中的部分需求.?這簡直就是給應用瘦身的良機!?這個時候測試又提出來:安卓端的app在應用市場的包只有26M,而iOS端的app在App Store上卻有88M.?

? ? ? ? 會后,我就找來安卓的測試機,對比了百度. 支付寶. 微信. 京東. 新浪和抖音幾個app在應用市場和App Store上的大小,數(shù)據(jù)如下:

AppStore和應用市場的對比圖

? ? ? ? 顯而易見,相同的應用,安卓端的應用安裝包遠小于iOS端.究其原因,筆者雖也查閱了一些資料,鑒于對安卓系統(tǒng)的機制不了解不敢妄言.但由此確定了一點, iOS端的包體難以做到安卓端那么小.?

? ? ? ? 回歸到給應用瘦身的實際問題上來, 先來一波常規(guī)操作: 刪除項目中冗余的圖片資源! 刪除項目中要砍掉的功能, 各種冗余的文件/xib/storyboard! 移除迭代掉的三方SDK!?這一個版本簡化下來,App Store中的安裝包大小由88.1M降為61.7M, 安裝包大小直線下降了百分之三十!?

? ? ? ? 這個版本的簡化成效是較為可觀的,但也值得反思:

? ??????·?陳舊冗余代碼/文件的大量存在: 一方面,據(jù)說是因為項目的核心功能是從前幾個實驗app中迭代而來,簡單的copy看似大大縮短了開發(fā)工期,但公司的項目本身一直并非組件化開發(fā),冗余龐雜在所難免. 在這里,組件化的優(yōu)勢就顯現(xiàn)出來.

? ??????·?反復無常的需求變動,加之研發(fā)本身的惰性: 需求的經(jīng)常變更多少會摧殘研發(fā)敏感的心靈, 一個功能今天要明天不要后天放一放也是蠻常見.久而久之,一個熬夜寫出來&自己又實在喜歡的功能板塊在面臨夭折時,研發(fā)可能就會先放著不管.這樣的操作多了,時間一長,幾經(jīng)轉(zhuǎn)手,這樣的代碼/文件就會沉睡在項目中.和同行的一些大牛交流,他們也普遍吐槽項目中存在很多這樣的問題.最為離奇的是,一個做音視頻SDK的大牛說,他接手的功能里有個控制器代碼有5000行, 這個文件有三四年幾乎沒怎么動過.一系列慘痛的教訓告訴我們: 當刪則刪,良好的編程習慣非常重要! 做好提交工作,寫清楚提交內(nèi)容即可!

????????說完這些表象,我們具體來談談App Thinning,有些人將App Thinning和Bitcode混為一談.其實不然, Apple Guides and Sample Code??中介紹App Thinning的三個組成部分: App Slicing, Bitcode和On Demand Resources這三個部分:

· App Slicing(應用切片):?

????????切片是為不同的目標設備創(chuàng)建和交付應用程序包變體的過程.從iOS9.0開始, ?你跟往常一樣往iTunes上提交.ipa文件. App Store將根據(jù)您的應用支持的設備來創(chuàng)建和提供不同的變體.圖片資源根據(jù)其分辨率和設備系列進行切片.GPU資源根據(jù)設備功能進行切片.

? ? ? ? 用戶在支持的設備上安裝應用程序, 應用商店會下載基于用戶設備的應用程序變體.

(1) App Slicing?
(2) 三種機型App Store上安裝包的大小

? ? ? ? ? 從圖(2)中我們可以清楚看到: 同一個應用的相同版本,在同使用2x圖片的機型(iPhone5s/iPhone6)上的包體大小相同,卻比使用3x圖片的iPhone6plus略小 .也就證明了以上觀點.

· On Demand Resources(隨需應變資源):?

????????按需資資源是一種資源,例如圖像和聲音,您可以使用標記關(guān)鍵字和組內(nèi)請求.商店托管Apple服務器上的資源并為您管理下載.按需資源可實現(xiàn)更快的下載速度和更小的應用程序大小,從而改善首次發(fā)布體驗.例如,游戲應用可以將資源劃分為游戲級別,并且僅當應用預期用戶將移動到該級別時才請求下一級資源.同樣,只有當用戶購買相應的應用購買時,應用才能請求應用內(nèi)購買資源.

? ? ? ?當不再需要資源并且磁盤空間不足時,操作系統(tǒng)會清除按需資源.如果您導出應用程序以在商店外進行測試或者分發(fā),則必須自己托管按需資源.請注意,不支持可執(zhí)行的按需資源.

? ? ? ? 對于用戶而言,按需資源在后臺透明地工作,在用戶瀏覽應用程序功能時根據(jù)需要提供資源.

備注:要在應用程序中設置按需資源,請參閱Apple Guides and Sample Code 中"On-Demand Resources Guide?".

Xcode默認啟用按需應變資源

· Bitcode(位碼):?

????????Bitcode通過消除針對不同架構(gòu)的優(yōu)化,以及只下載相關(guān)優(yōu)化,從而使下載變得更小.

Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.

Xcode hides symbols generated during build time by default, so they are not readable by Apple. Only if you choose to include symbols when uploading your app to iTunes Connect would the symbols be sent to Apple. You must include symbols to receive crash reports from Apple.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?----Apple Guides and Sample Code

? ? ? ?位碼是編譯程序的中間表示形式.你上傳到iTunes Connect中包含位碼的應用程序?qū)⒈痪幾g并鏈接到商店.包括位碼將允許蘋果在未來重新優(yōu)化你的應用程序二進制而不需要提交一個新的應用程序版本到App Store.

? ? ? ? Xcode隱藏了默認情況下在構(gòu)建期間生成的符號,因此蘋果無法讀取這些符號,只有當你的應用程序上傳到iTunes Connect時包含符號,這些符號才會被發(fā)送到蘋果.你必須包含一些符號來接收來自蘋果的崩潰報告.

Xcode默認啟用Bitcode

? ? ? ?Xcode默認啟用Bitcode, 但筆者在一次集成三方SDK時,文檔上要求關(guān)閉Bitcode. 因此,是否開啟該屬性也要靈活決定.

????????綜上可見, 蘋果官方對于應用瘦身的機制已然相當完善, 開發(fā)者養(yǎng)成良好的編程習慣至關(guān)重呀. 在探究應用瘦身的過程中, 筆者也看到有關(guān)于“無損壓縮圖片”“靜態(tài)庫瘦身”的這樣一些觀點, 大家也可觀摩學習.


參考資料:

1. Working with App Thinning in iOS 9

2.?Apple Guides and Sample Code

3.從Xcode編譯時自帶的“圖片壓縮”說起

4.iOS APP安裝包瘦身實踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容