用戶在 app store 上看到的包大小究竟是什么?

在做安裝包大小優化前,我們應該首先搞清楚,用戶在 app store 上看到的包大小,究竟是什么?

如果我們衡量安裝包大小的口徑,和用戶看到的大小不一致,那么做優化時的優先級和ROI衡量就可能跑偏,甚至出現優化效果為負的悲慘結局。

首先拋出結論:用戶在 app store 上看到的包大小,是:

  • .app 文件
  • 的二進制部分被加殼后
  • 再經過 app slicing

的大小。

如何查看

在某個版本的 app 上線之前,開發者應該如何知曉它在用戶眼中的大小呢?
蘋果的 itunes connect 后臺為開發者提供了查看安裝包大小的功能。

在 itunes connect 后臺,開發者可以看到當前版本針對不同機型的大小。

這里的大小分為兩個口徑:
Download Size 和 Install Size。

根據網頁上的說明:
Install Size 是這個 app 安裝后,會占用的磁盤大小;
Download Size 是 app 經過壓縮后的大小。

根據經驗,用戶在 app store 上看到的大小,就是 itunes connect 后臺中顯示的 Install Size。

而令開發者在意的,“超過 150 MB 的 app 必須連接至無線局域網才能下載”的規則中的 150 MB,指的其實是 Download Size。

幾個口徑

Download Size 和 Install Size 是如何計算出來的,我們等下再說。

拋開 itunes connect 和 app store,平時我們在開發打包一個 app 時,經常會接觸到這樣幾個安裝包概念:

  • ipa
  • app

ipa 可能是我們最熟悉的“安裝包”的格式。通過 Xcode 的 archive 方式,最終打出的安裝包的格式就是 ipa。
實際上,ipa 就是一個 zip 壓縮包。我們可以用 unzip 的方式來解壓一個 ipa 文件。

這樣,我們會得到一個后綴名為.app的文件。

甚至可以想進入一個文件夾一樣進入到這個.app中,窺探二進制、各個資源分別占據了多少大小。

這里我們知道了,.app 文件和 .ipa 文件的關系:
ipa 文件是 app 文件 zip 壓縮后的產物。

用戶看到的大小

那么用戶看到的 Install Size,究竟是 .app 文件的大小,還是 .ipa 文件的大小呢?
答案:都不是。但是 .app 文件的大小與 Install Size 的口徑更為接近。

加殼

蘋果在 iOS 9 推出了能減小安裝包的 app thining 功能。我們先不考慮這個功能,看看 iOS 9 以前 Install Size 與 .app 文件的關系。

要獲取 app store 上的安裝包,其實沒有正規的做法。有一個比較trick的技巧可以獲得:
http://www.lxweimin.com/p/ce018473fad0

通過這個方式,我們可以下載到一個 .ipa 文件。
這個 ipa 文件經解壓后得到的 app 文件,其大小與 iOS 9 以下設備在 app store 上看到的大小是吻合的。也與 itunes connect 中,開發者看到的 Install Size 是吻合的。

但是,它與開發者提交到 itunes connect 前的 app 文件大小,是有一定差距的。

比如,我們提交到 app store 上的 ipa 解壓后的大小為 297.1MB
從 app store 上下載的 ipa 解壓后大小為 301.9MB

其中這 3.8 MB 的大小差異來自哪里呢?
來自加殼。

我們對比了這兩個 app 包中的各個文件大小,發現各資源文件的大小完全一致,只有二進制文件的大小發生了改變。

使用 otool 命令

otool -l 可執行文件路徑 | grep crypt

我們可以驗證,app store 中下載的包經過了加殼,而提交 itunes connect 前的包沒有。

使用

otool -l

命令可以輸出 Mach-O 文件加載的 load command。經對比發現,雖然加殼改變了TEXT段的內容,卻沒有改變TEXT段的大小。這 3.8 MB 的大小差異主要來自 __LINKEDIT 和 LC_CODE_SIGNATURE 這兩個段,這兩個段都與動態鏈接器有關。

因此,我們可以得到結論:iOS 9 之前,用戶看到的 Install Size 的大小,是 .app 文件經過加殼的大小,粗略的可以認為就是 .app 文件的大小。

app slicing

上述的分析針對于 iOS 9 以下設備看到的情況。

如果考慮蘋果在 iOS 9 上推出的 app thining 功能,安裝包大小會有什么影響呢?

我們先了解一下,如果沒有 app thining,一個安裝包中會包含哪些內容。

對二進制來說,由于一個安裝包需要同時支持 iPhone 5 等 32 位設備和 iPhone 5s 以上的 64 位設備,所以二進制中需要包含 armv7 和 arm64 兩個架構的 Mach-O 文件。

對于放在 asset catalog 中的資源來說,一般來說,開發者為了更好的適配 iPhone 6 等 2x 屏幕的設備和 iPhone 6 plus 等 3x 屏幕的設備,每一個圖片資源會引入 2x 和 3x 兩個版本。

對于其他圖片/資源來說,它們也會被收入到安裝包中。

這里,我們可以明顯發現,如果一個設備下載安裝了安裝包中的全部內容,有兩個明顯浪費的地方:

  1. 有一份它不需要的 Mach-O
  2. 有一份它不需要的資源圖

蘋果在 iOS 9 推出的 app slicing,就幫助開發者將這兩個浪費的地方干掉了。

對于資源圖,官方文檔中有說明:
A thinned .ipa is a compressed app bundle that contains only the resources needed to run the app on a specific device.
https://developer.apple.com/library/archive/qa/qa1795/_index.html

對于二進制,我們沒有在官方文檔中找到說明。但 WWDC App Thinning in Xcode 一篇中這樣介紹了 app slicing 功能:

這張圖中體現了,無論是二進制還是 asset catalog 中的資源,app slicing 都只保留了當前設備所需的部分。

而在導出 ipa 時,在配置 plist 文件中加入 <thin-for-all-variants> 選項,則可以導出針對不同機型的 ipa 文件。經實驗,這些 ipa 文件解壓后得到的 app 文件大小,與 itunes connect 后臺各個設備對應的 Install Size 是吻合的。

優化建議

正如文章開頭的結論:

用戶在 app store 上看到的包大小,是:

  • .app 文件
  • 的二進制部分被加殼后
  • 再經過 app slicing

的大小。

得知了用戶看到的包大小究竟是什么含義,我們可以避開一些包大小優化的坑。

比如,由于 app slicing 的存在,圖標應該盡可能用 asset catalog 管理起來。所以試圖用 webp 等格式來替代 asset catalog,可能是負向收益。
(這個思路經過實驗,結論是,在我們的業務場景下,如果用 webp 替代 asset catalog,對于 2x 設備的 Download Size 是負向收益,因為 2x 設備不得不使用 3x 的圖片,并且 webp 圖的壓縮率比 asset catalog 低很多)

再比如,不要幻想拋棄 armv7 架構的設備,可以減小包大小。蘋果已經幫開發者做過這一步了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容