前言

昨天去美团吹水,聊到 BitCode 话题,朋友说他们发现美团没有开启 Bitcode,下载下来的包还是二进制文件只有一个架构的状态。我感到非常不可思议,晚上就去越狱了我的 iPad mini,刚好上周 9.1 越狱出了。结果发现果真如此。今天早晨和 SunnyXX 提及此事,都倍感神奇,研究了一番,SunnyXX 又去查了苹果文档,发现大家都把 Bitcode 理解错了

BitCode 是什么

我们最近聚会总说,xxx SDK 不求上进,一年了还不支持 Bitcode。一旦支持了,ipa 大小能少了不小。然而今天看完文档发现并不是这么回事。

Bitcode,干的事情是指令集优化。根据你设备的状态去做编译优化,进而提升性能,但这对包的大小优化起不到什么本质上的作用

那么美团那个事件是怎么回事呢?

App Thinning in Xcode

在查文档之前,我干了这么样一件事。对比了一下 iOS 8、iOS 9 上的美团占手机大小。结果发现了一个问题,如图。


我确定美团是 Universial 版本,也确定这两个美团是同一版本号。然而体积差了 40+ MB。直接把 iOS 8 上的二进制包拿出来(需越狱),在命令行下

file imeituan

我们发现,他是同时存在 armv7 和 arm64 两个指令集的。


我又在 iOS 7 上干了同样的事情,与 iOS 8 结果一致。于是我们能得出一个推论:这个 ipa 变小的事情是 iOS 9 的 feature。

知道是 iOS 9 的问题了,就回过头来去看 WWDC 2015 Session 404,App Thinning in Xcode,我当初看这篇睡着了。官方有这么一张 PPT。

说明,APP Thining 这件事并不只是 Bitcode,而是由: App SlicingOn Demand Resources, Bitcode 组成

其中,App Slicing 干的事情是如下图这样,根据你设备型号,生成对应资源的 ipa,以节省空间。

并且我们在文档里看到了这么一句话:

In fact, app slicing handles the majority of the app thinning process. ‘App Slicing’ feature finally switched on in iOS 9.0.2

也就是说,对于 ipa 减肥,主要是由拆分架构、资源文件来起到绝对性作用。而这个功能 iOS 9.0.2 之前的用户都享受不到。

再来说一下 On Demand Resource 的作用,苹果的示意图很清晰。


作为游戏,只需要下载公共资源文件、初始关卡。每过一关,再下载对应资源文件可以大幅减少包的大小。这对安装包只有 200M 限制的 Apple TV 格外重要。

那么,我们知道。开了 Bitcode 后,会根据不同设备来分包。会不会能起到 iOS 8 缩减体积的作用呢?事实上并不是如此,大家可以去下载一下手机百度。会发现 iOS 8,比 iOS 9 大得多。

所以我们能得出来 2 个不大不小的结论:

1. 如果想给 ipa 减肥,Bitcode 乃至 App Thinning 都对 iOS 9.0.2 以下用户无效。
2. 其实Bitcode 对 ipa 减肥起不到什么作用。

如何正确理解BitCode相关推荐

  1. ADSL的PPPOE拨号客户端上的ppp authentication pap “callin”的正确理解

    ADSL的PPPOE拨号客户端上的ppp authentication pap "callin"的正确理解 对callin参数的理解一定要注意,很容易单让初学者通过"中国 ...

  2. 调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优。

    调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优.  个人理解

  3. html的区域大小,JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性...

    在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...

  4. 智能的定义是什么?如何正确理解智能家居?

    近几年,智能家居是一个比较火爆的行业!有很多的人(特别是寻找好的创业的项目的朋友)想从事这个行业,也有很多是想在自己家里装上智能化,享受科技带来的生活便利:还有部分人处于对智能家居的了解期.不管你属于 ...

  5. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  6. 软件测试作业1:正确理解原型方法对软件生命周期不同阶段的支持

    作业1 1.正确理解原型方法对软件生命周期不同阶段的支持,分别给出:辅助或代替分析阶段:辅助设计阶段:代替分析与设计阶段:代替分析.设计和实现阶段:代替全部开发阶段所对应的开发活动执行时间顺序. 答: ...

  7. python函数可以作为容器对象吗_正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  8. c语言正确理解以下名词及其含义,C程序作业答案.doc

    C程序作业答案.doc 什么是程序及程序设计 程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行 操作的一系列语句和指令.一般分为系统程序和应 ...

  9. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以"人"为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是 ...

最新文章

  1. 【自动驾驶】5. ROS和DDS的区别总结
  2. mysql 登录_Spring boot redis +mysql实现登录功能
  3. 阿里巴巴和印度最大移动支付和商务平台Paytm
  4. SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下
  5. (pytorch-深度学习系列)网络中的网络(NiN)
  6. 海底捞员工:假笑到脸僵,撑到经理月入20万
  7. python下面的代码_求下面python代码的差别。
  8. python非法变量名_数据库错误:ORA-01036:非法变量名/numb
  9. 印江中学2021高考成绩查询,贵州印江中学2021年排名
  10. android电池充电动画,Android 开机充电图标和充电动画效果
  11. .NETFramework:Byte
  12. linux初识到入门_系统
  13. Three.js 学习笔记 - 给跳一跳小游戏添加光源,阴影
  14. 移除collection中元素的注意事项(应用collection.remove移除元素造成的错误)
  15. Java基础:List集合和Set接口
  16. unity2018设置雾在哪_【zSpace实操】Unity2018发布设置
  17. 洛谷刷题笔记——P3953 [NOIP2017 提高组] 逛公园
  18. nginx 区分手机浏览器和pc浏览器
  19. peer之间的通信协议
  20. 基于Linux的socket网络编程项目——游侠手机商城

热门文章

  1. RS485/云台控制(PTZ)学习文档
  2. 【蓝桥杯】第11届Scratch国赛中级组第6题 -- 3D打印小猫
  3. 聚合函数是否可以写在order by后面,为什么?
  4. bland c++_为什么要使用bland altman图进行ab测试python代码
  5. ThinkpadE450开启Intel VT
  6. VisionMaster4.2.0 联合C#实现相机SDK取图
  7. 浏览器的三种刷新方式
  8. 张小龙演讲4小时之我认为重要的点
  9. 2018清华计算机类专业录取分数线,2018清华大学分数线 各专业分数线是多少
  10. 福晰阅读器打开PDF时如何不展开目录