iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

10 | 包大小:如何从资源和代码层面实现全方位瘦身?

戴铭 2019-04-02
你好,我是戴铭。今天我来跟你说下如何对 App 包大小做优化。
对 App 包大小做优化的目的,就是节省用户流量,提高用户下载速度。当初,我在主持滴滴客户端的瘦身时,就是奔着对包大小进行最大化优化的目标,3 个月内将包大小从 106MB 降到了最低 64MB,半年内稳定在了 70MB。当时业务还没有停,从 106MB 降到 64MB 的这 3 个月里如履薄冰,不同团队各显神威,几乎用到了所有手段,也做了很多创新,最终达成了目标。
图 1 瘦身背景
上图就是当时主流 App 的大小,可以看到最大的百度和淘宝,分别是 131MB 和 115MB,滴滴是 106MB,最小的是微信 87MB。
图 2 主流 App 安装包半年内的大小变化
可以看到,经过半年的时间,除了滴滴外每个 App 的安装包都增大了不少,先前最小的微信也从 87MB 增加到了 116MB。
相信你的团队也曾遇到过或正在经历着对包大小进行优化的任务,特别是 App Store 规定了安装包大小超过 150MB 的 App 不能使用 OTA(over-the-air)环境下载,也就是只能在 WiFi 环境下下载。所以,150MB 就成了 App 的生死线,一旦超越了这条线就很有可能会失去大量用户。
如果你的 App 要再兼容 iOS7 和 iOS8 的话,苹果官方还规定主二进制 text 段的大小不能超过 60MB。如果没有达到这个标准,你甚至都没法提交 App Store。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(56)

  • Geek_97bcf5
    元类和类的数据结构是同一个,只是运行时使用的字段不一样。

    实例方法调用是通过objc_msgSend来调用,它的第一个入参就是实例对象,其流程是查找实例对象的isa指针,找到类对象,然后找到method_t的IMP,bl直接跳转调用。

    类方法的调用和实例方法调用一致,它的第一个入参对象是类对象,类对象的isa指向的是元类。

    所以,没有元类的话,类方法是没有办法调用的。objc_msgSend的调用流程是一定要isa指针的。

    如果实例方法和类方法都放在类对象上,那类对象的isa指针只能指向自己了,那一旦类方法和实例方法重名,就没法搞了!

    所以,问这个问题的,都是objc_msgSend源码没看过的同学。
    2019-04-03
    8
    49
  • 元元
    老师ios为什么要设计元类?能讲一下吗

    作者回复: 其实这个问题是个开放性的问题。
    不同阶段的解读也会不一样。因为这个知识点大家都会去学,主要是希望能够通过面试者的回答,加上追问方式来看他是不是会带着思考去学习。比如元类和类的结构体非常类似,他有没有想过为什么不合在一起用一个结构体?(结构体设计能力)元类和类创建的时机是不是一样的,为什么?(用过 runtime 接口开发没)元类的 flag 字段里记录了什么?(是否有深入探究的意识)

    2019-04-02
    1
    25
  • leoliu
    本地的同一图片的2倍和3倍图被转换成相应的webp后,这样苹果就无法根据设备选择了相应的图片了,对瘦身的影响哪个比重会大一下
    2019-04-04
    1
    4
  • codertiany
    我也不懂啥叫元类
    2019-04-02
    1
    4
  • mαnajay
    我觉得设计元类 ,主要思想是 处理代码 通用逻辑与 特有逻辑。有些作为模板可以复用代码逻辑甚至节省内存空间分配,有些则是要针对独立个体单独处理,就是常说的面向对象编程中处处皆对象
    2019-04-02
    3
  • 小前端
    课后作业的官方答案啥时候同步?谢谢
    2019-04-02
    1
    3
  • Mit
    重复图片与无用图片的检索工具
    https://github.com/mitchell-dream/MitImgChecker 可以尝试一下这个工具。
    2019-08-26
    2
  • leoliu
    本地的@2x和@3x转成webp以后,调用的时候是否要判断设备分辨率,根据不同的设备分辨率调用不同倍数的webp
    2019-04-04
    2
  • Norman
    老师好,有个问题。我使用imageOptim压缩图片之前的xcassets大小是8.7M,压缩之后是6.4M,但是打包出来的ipa大小并没有明显改变,请问这是为什么呢。
    2019-04-03
    2
  • 李乾坤David
    看了之后并没有给出具体找到无用类的方法?
    2019-07-30
    1
  • lcp
    运行时检查类,请问调用 isInitialized() 方法的时机是什么时候呢?
    我理解只能通过hook msgSend的时候,判断方法是否为 +initialize 比 运行时通过isInitialized() 方案要来得简单一些。
    2019-07-19
    1
  • Geek_e1c05c
    您好,苹果不是禁止使用动态库的吗?把静态库换成动态库能上架成功吗?抱歉不是很懂
    2019-05-09
    1
  • 鹏sir
    老师,使用webp压缩图片后项目的包体积大概能减少多少呢??我们项目的图片最多也就100kb出头的样子,好多都是几kb,而且使用webp压缩后的图片,加载图片方式也需要改变,代码改动量比较大。。。
    2019-04-18
    1
  • 开发小能手
    请教老师,我在评论中看到老师有提到“元类的flag中记录了什么?”这里的 “flag” 是指isa是一个共用体中每段 “位域” 的含义么?还是指其它的概念?

    作者回复: 元类结构体中的 flag 字段

    2019-04-13
    1
    1
  • 一纸丶荒年
    您的这个 工具 对于 swfit 和 xib 不适用.

    作者回复: 哪个工具?

    2019-04-12
    1
  • 卓小土
    戴老师为什么没有讲一下,用clang AST分析代码依赖关系,找出无用代码的方法。

    作者回复: clang 插件篇里会说下

    2019-04-12
    1
  • drunkenMouse
    App Thinning原理:每个App包会包含多个芯片(如真机、模拟器)的指令集架构文件,App Thinning会使用户只下载一个适合自己设备的芯片指令架构文件。

    简单说,使用App Thinning之后苹果会自动帮你把App包按照型号分割成不同变体,保证每个型号只下载自己所需要的资源。而自己所需要做的,就是通过Asset Catalog模板创建xcassets目录,将2x与3x图片放进去。

    无用文件删除简单说:通过find命令与正则表达式找到所有代码中在使用的文件, 那么剩下的就是没有用的文件。关于没用文件的删除和有用文件的寻找,可以借助工具LSUnusedResources

    objc_msgSend通过_objc_selrefs获取selector, __objc_classrefs获取被调用的类,__objc_supperrefs获取调用的父类

    若有部分方法是运行时动态调用就会没执行到则没法收集。比如A类的B方法没有被我直接调用,但是在运行到某一代码块时,我通过runtime的objc_msgSend手动调用了这个方法,则不会被记录。

    元类:每个类都是元类,通过元类调用类方法。通过元类创建实例对象,用实例对象来调用实例方法。可以防止类方法与实例方法重名时,声明和调用失败。而实例对象的isa指针指向的是元类,也就是之前说的:每个对象都会指向一个类,每个类都有一个方法列表,方法列表里的每个方法都是由SEL、IMP和metadata组成。元类的isa指针,指向父类的元类,而根类就是NSObject。

    所以,为什么要设计元类?为了区分实例方法和类方法的声明与调用。但是方法列表保存在元类里,通过元类来找到父类。

    最后问句:有人作业可以借我参考一下吗??
    2019-04-07
    1
  • 邓斌
    元类的存在让类本身也相当于一个返利对象,也就是类方法存在的原理。毕竟万物皆对象不是白说的。
    一种好的设计思想衍生出好的一种使用方法,元类的思路就很典型
    2019-04-04
    1
  • 易若风云
    一切皆对象,类描述了实例,元类描述了类,谁来描述元类呢?感觉都是设计上的哲学
    2019-04-03
    1
  • sacrifice
    请问我的应用一共包含40M图片,ipa包大小196M,我把所有放在assets管理的图片都删了打包为80M左右,assets里全部换成wepb图片,最终打包110多M,我很困惑,这个瘦身过程是不是有问题?不知道最终放在APPstore上会有多大
    2019-11-20
    2
收起评论
56
返回
顶部