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

在做安裝包大小優(yōu)化前埋同,我們應該首先搞清楚州叠,用戶在 app store 上看到的包大小,究竟是什么凶赁?

如果我們衡量安裝包大小的口徑咧栗,和用戶看到的大小不一致,那么做優(yōu)化時的優(yōu)先級和ROI衡量就可能跑偏虱肄,甚至出現(xiàn)優(yōu)化效果為負的悲慘結局致板。

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

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

的大小咏窿。

如何查看

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

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

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

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

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

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

幾個口徑

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

拋開 itunes connect 和 app store情组,平時我們在開發(fā)打包一個 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 上的安裝包鼻百,其實沒有正規(guī)的做法绞旅。有一個比較trick的技巧可以獲得:
http://www.reibang.com/p/ce018473fad0

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

但是,它與開發(fā)者提交到 itunes connect 前的 app 文件大小琐鲁,是有一定差距的卫旱。

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

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

我們對比了這兩個 app 包中的各個文件大小,發(fā)現(xiàn)各資源文件的大小完全一致奈泪,只有二進制文件的大小發(fā)生了改變适贸。

使用 otool 命令

otool -l 可執(zhí)行文件路徑 | grep crypt

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

使用

otool -l

命令可以輸出 Mach-O 文件加載的 load command烙样。經對比發(fā)現(xiàn),雖然加殼改變了TEXT段的內容蕊肥,卻沒有改變TEXT段的大小谒获。這 3.8 MB 的大小差異主要來自 __LINKEDIT 和 LC_CODE_SIGNATURE 這兩個段,這兩個段都與動態(tài)鏈接器有關晴埂。

因此究反,我們可以得到結論: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 中的資源來說荷辕,一般來說凿跳,開發(fā)者為了更好的適配 iPhone 6 等 2x 屏幕的設備和 iPhone 6 plus 等 3x 屏幕的設備,每一個圖片資源會引入 2x 和 3x 兩個版本疮方。

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

這里骡显,我們可以明顯發(fā)現(xiàn)疆栏,如果一個設備下載安裝了安裝包中的全部內容,有兩個明顯浪費的地方:

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

蘋果在 iOS 9 推出的 app slicing惫谤,就幫助開發(fā)者將這兩個浪費的地方干掉了壁顶。

對于資源圖,官方文檔中有說明:
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 功能:

這張圖中體現(xiàn)了,無論是二進制還是 asset catalog 中的資源痹愚,app slicing 都只保留了當前設備所需的部分富岳。

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

優(yōu)化建議

正如文章開頭的結論:

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

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

的大小。

得知了用戶看到的包大小究竟是什么含義阁簸,我們可以避開一些包大小優(yōu)化的坑爬早。

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

再比如析命,不要幻想拋棄 armv7 架構的設備,可以減小包大小逃默。蘋果已經幫開發(fā)者做過這一步了鹃愤。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市笑旺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馍资,老刑警劉巖筒主,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸟蟹,居然都是意外死亡乌妙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門建钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藤韵,“玉大人,你說我怎么就攤上這事熊经≡笏遥” “怎么了欲险?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匹涮。 經常有香客問我天试,道長,這世上最難降的妖魔是什么然低? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任喜每,我火速辦了婚禮,結果婚禮上雳攘,老公的妹妹穿的比我還像新娘带兜。我一直安慰自己,他們只是感情好吨灭,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布刚照。 她就那樣靜靜地躺著,像睡著了一般沃于。 火紅的嫁衣襯著肌膚如雪涩咖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天繁莹,我揣著相機與錄音檩互,去河邊找鬼。 笑死咨演,一個胖子當著我的面吹牛闸昨,可吹牛的內容都是我干的。 我是一名探鬼主播薄风,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼饵较,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遭赂?” 一聲冷哼從身側響起循诉,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撇他,沒想到半個月后茄猫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡困肩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年划纽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌畸。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡勇劣,死狀恐怖,靈堂內的尸體忽然破棺而出潭枣,到底是詐尸還是另有隱情比默,我是刑警寧澤幻捏,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站退敦,受9級特大地震影響粘咖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜侈百,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一瓮下、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钝域,春花似錦讽坏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至织咧,卻和暖如春胀葱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笙蒙。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工抵屿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捅位。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓轧葛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艇搀。 傳聞我的和親對象是個殘疾皇子尿扯,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 1、前言 關于上傳 ipa 包到 App Store Connect 的方法焰雕,相信做過 iOS 開發(fā)的同學衷笋,一定知...
    iHTCboy閱讀 21,993評論 10 15
  • 原地址:https://blog.csdn.net/xxw888/article/details/73618837...
    旭娃閱讀 12,666評論 0 10
  • 姓名:刁偉聰 公司:寧波貞觀電器有限公司 寧波盛和塾《六項精進》235期謙虛二組學員 【知~學習】 誦讀匠人精神3...
    真誠無敵閱讀 145評論 0 0
  • 一 一到假期辟宗,躲不掉的就是被媽媽拉著干活。爸爸媽媽是賣菜的档插,我自然躲不掉在菜市場幫忙賣菜慢蜓,這幾天又正逢節(jié)假日亚再,菜市...
    山雨sanyu閱讀 221評論 0 1
  • 這一季郭膛,隴肅的梵宮人人都心如止水,唯獨想你的我引日成歲氛悬。 這一季则剃,浙杭的靈隱能否真讓我隱退耘柱,縱使遁入空門比愛你憔悴...
    TestimH閱讀 533評論 0 1