用户在 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的技巧可以获得:
https://www.jianshu.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阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容