iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

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

课后小作业
小结
主要内容
目的
包大小瘦身

该思维导图由 AI 生成,仅供参考

你好,我是戴铭。今天我来跟你说下如何对 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何对App包大小进行优化,以节省用户流量,提高用户下载速度。作者分享了在主持滴滴客户端瘦身过程中的经验,将包大小从106MB降至64MB,并稳定在70MB。文章指出包过大会影响用户体验、升级率,甚至导致无法提交App Store和非WiFi环境无法下载。作者介绍了官方App Thinning技术,包括App Slicing、Bitcode、On-Demand Resources,并提供了使用方法。此外,还讨论了删除无用图片资源的方法。 文章内容主要包括两个方面:图片资源压缩和代码瘦身。对于图片资源压缩,作者介绍了使用WebP格式进行高效压缩的方法,并提供了转换图片至WebP格式的具体操作步骤。对于代码瘦身,作者提出了通过LinkMap结合Mach-O文件找出无用代码的方法,并介绍了使用AppCode进行静态分析的方式。同时,作者也指出了在使用AppCode进行静态检查时可能出现的问题和需要人工二次确认的情况。 具体编写运行时无用类检查工具时,我们可以在线下测试环节去检查所有类,先查出哪些类没有初始化,然后上线后针对那些没有初始化的类进行多版本监测观察,看看哪些是在主流程外个别情况下会用到的,判断合理性后进行二次确认,最终得到真正没有用到的类并删掉。 总的来说,本文提供了丰富的技术经验和实用方法,对于需要对App包大小进行优化的开发者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(64)

  • 最新
  • 精选
  • 元元
    老师ios为什么要设计元类?能讲一下吗

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

    2019-04-02
    2
    30
  • Toon
    矢量图呢?也可以减少大小吧

    作者回复: 矢量图片编译时会生成位图

    2019-04-21
    3
    1
  • 开发小能手
    请教老师,我在评论中看到老师有提到“元类的flag中记录了什么?”这里的 “flag” 是指isa是一个共用体中每段 “位域” 的含义么?还是指其它的概念?

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

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

    作者回复: 哪个工具?

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

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

    2019-04-12
    1
  • 付海龙
    相比于2x和3x两套资源,用矢量图一套资源搞定所有,这样会不会更好一点

    作者回复: 是支持矢量图的,矢量图编译后会生成2x、3x 图

    2019-04-02
    1
  • 西北旺车神
    OTA并不是单指蜂窝网络吧,我觉得是指不用连电脑iTunes下载了

    作者回复: 对,也包括不用数据线连 iTunes 的情况

    2019-04-02
    1
  • 李小草
    之前开发遇到过提供三方sdk的公司提供了两个版本,一个版本带模拟器指令集(支持模拟器的),一个版本是不带模拟器的,只支持arm真机,上线时切换下,这样可以减小包得体积,请问老师这样对吗?如果这样真能减小包体积的话,那我是不是可以把所有三方sdk中模拟器指令集都剔除掉?

    作者回复: 可以删掉

    2019-06-03
    2
  • 一纸丶荒年
    你好 我下载了 AppCode 工具. 但是 我选择不了 code->inspectCode 吖

    作者回复: https://www.jetbrains.com/objc/features/code-analysis.html

    2019-04-15
    2
  • 毒手疯波
    framework中的i386和x86_64会打包进release app里么?

    作者回复: App Thinning 会去掉

    2019-04-09
收起评论
显示
设置
留言
64
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部