[iOS] App Store上的包大小

前言:最近在了解 APP性能优化相关的一些知识,其中很重要的一个点就是包大小的优化,在做优化之前,我们需要搞清楚用户在 App Store上看到的包的大小是什么?

1. 用户眼中的App大小

以微信为例,我们可以直接在 App Store中打开微信App 的详情页,在【信息】模块中,可以查看App的大小,如下图:


21614418141_.pic.jpg

而作为开发者的我们,在App 的某个版本上线之前,可以通过苹果的 App Store Connect后台查看安装包大小的功能:
选择APP -> 打开 "TestFlight" -> 点击构建的版本 -> 点击顶部的"构建版本元数据" -> 在"综合信息"下点击"App Store 文件大小",会展示出不同变体版本的大小,如下图所示:

image.png

在上图中可以清楚的看到不同变体版本的大小,而且区分了安装大小和下载大小:

  • 安装大小
    是指App 在设备上安装后占用磁盘空间的大小,用户在 App Store中用户看到的大小就是安装大小

  • 下载大小
    是指对 App 进行下载的压缩大小

2. .app文件&.ipa文件

我们在发布应用时,最后提交的是一个 .ipa 文件,其实它就是一个 zip 压缩包,我们可以使用unzip命令,直接解压就可以得到一个.app文件,这个.app文件其实就是个文件夹,里面包含了二进制文件和资源文件等等:

demo@MacBook-Pro ~ % file MonkeyDemo.app 
MonkeyDemo.app: directory

所以.ipa文件和.app文件的关系:.ipa文件其实就是.app文件压缩后的产物。

可以说明用户下载的是.ipa文件,下载完成之后解压为.app文件,下载大小是.ipa文件的大小,导入大小是.ipa解压后得到.app文件的大小。

但是我们通过某种方式从 AppStore 下载的.ipa解压后得到的.app文件的大小和我们直接导出的.ipa解压后得到的.app文件大小是有区别的,这个区别其实是苹果会对已经通过审核的 App进行DRM 加密并重新压缩,这个会影响到二进制文件的压缩,所以 AppStore 显示的二进制文件大小可能会比上传到 App Store Connect的二进制文件更大,如下图:

截屏2021-02-27 下午8.07.48.png

另一方面,苹果在 iOS 9 推出了App Thining,会影响我们导出 ipa 的大小,我们先来了解一下。

3. App Thinning

具体的可以参考:App Thinning官方文档,这里简单了解一下。

App Thinning可以翻译成应用瘦身,指的是App Store和操作系统在安装 app 的时候,会通过一系列的优化,减少安装包的大小,而这一系列的优化,包括了三个过程:slicingbitcodeon-demand resources

3.1 slicing

这一步其实就是应用裁减,针对于不同的设备,它们可能需要ipa 中的不同的独立资源,所以 App Store会针对不同的设备制作不同的"简化版"的 ipa,也就是常说的"变体",这个简化版的 ipa 值包含目标设备和操作系统版本所需的可执行架构和资源。

比如我们的图片资源大都放在 Assets.xcassets中,其中包含 @1x @2x @3x 的图片,但是我们 iPhone 5S手机只需要@2x 的图片,这一步做的就是帮我们去除 @1x @3x的图片,也就是说,当用户下载 App 的时候,苹果会根据当前机型生成一套最适合这个机型的一套图片,这样就节省了大量的不必要的图片资源,节省出来很大一部分空间。

还有就是我们导出的ipa 中的可执行文件,一般是含有多个 CPU 架构的:armv7arm64 ,现在的iPhone一般都是需要 arm64 的,在这一步中苹果就会把armv7 架构干掉。

从这一点来看在 VALID ARCHS 中干掉 armv7 架构,对于包大小的优化来说没啥用了,苹果已经帮开发者做了这一步了。

image.png

从苹果介绍App Slicing时的这张图中也可以看出来。

3.2 BitCode

Bitcode是一个编译好的程序的中间表示形式,开启BitCode,也就是说当未来有新的iPhone使用了新的 CPU 架构时,允许苹果可以重新优化可执行文件,对可执行文件重新编译和链接,不用我们重新提交 App了。

image.png
3.3 On-Demand Resources (iOS)

ODRon-demand resources 随需应变资源)是iOS减少应用资源消耗的另外一种方法。比如多级游戏,用户需要的通常都是他们当前的级数以及下一级的资源。ODR意味着用户可以下载他们需要的几级游戏资源。随着你的级数不断增加,应用再下载其他级数的资源,并将用户成功过关的级数删掉。

4. 自己导出的 ipa 和从 AppStore 下载的 ipa 对比

4.1 自己导出的 ipa 验证

我们自己导出的 AppStore 正式包是没有经过 App Slicing 的,比如可执行文件中含有多个CPU 架构,可以使用file命令查看,如下:

2021-02-28 09-54-58 % file TestApp
TestApp: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O executable arm_v7] [arm64]
TestApp (for architecture armv7):   Mach-O executable arm_v7
TestApp (for architecture arm64):   Mach-O 64-bit executable arm64

使用otool 命令验证是否加壳:

otool -l 可执行文件路径 | grep crypt
 2021-02-28 09-54-58 % otool -l TestApp | grep crypt
     cryptoff 16384
    cryptsize 901120
      cryptid 0
     cryptoff 16384
    cryptsize 999424
      cryptid 0

可以看到cryptid值为0,说明两种架构下都没有加壳。

在导出Ad Hoc类型的ipa 时,是可以选择导出指定设备所需要的包的,这需要我们在导出时修改配置,导出iPhone 7 Plus的包,如下:

image.png

导出之后会包含一个 Apps 文件夹,里边有多个 ipa:


image.png

可以通过App Thinning Size Report.txt文件,查看Apps 文件夹中不同 ipa 的信息:

image.png

这里为什么有多个,我也不清楚,但是在上面文件中可以看到不同的ipa分别有自己支持安装的设备(Supported variant descriptors)。

我们解压一个ipa ,再次用file 命令查看,可执行文件只包含一个 arm64架构了。

5. 总结

通过上面的验证,我们可以知道用户在App Store上看到的包的大小,其实就是.app文件的二进制部分加壳之后,再经过 app slicing的大小。
了解这个有助于我们对于ipa大小优化的操作进行数值化,验证我们的操作是否有用。

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

推荐阅读更多精彩内容