Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52202 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

22 | 包体积优化(上):如何减少安装包大小?

曾经在 15 年的时候,我在 WeMobileDev 公众号就写过一篇文章《Android 安装包相关知识汇总》,也开源了一个不少同学都使用过的资源混淆工具AndResGuard
现在再看看这篇 4 年前的文章,就像看到了 4 年前的自己,感触颇多啊。几年过去了,网上随意一搜都有大量安装包优化的文章,那还有哪些“高深”的珍藏秘笈值得分享呢?
时至今日,微信包体积也从当年的 30MB 增长到现在的 100MB 了。我们经常会想,现在 WiFi 这么普遍了,而且 5G 都要来了,包体积优化究竟还有没有意义?它对用户和应用的价值在哪里?

安装包的背景知识

还记得在 2G 时代,我们每个月只有 30MB 流量,那个时候安装包体积确实至关重要。当时我在做“搜狗输入法”的时候,我们就严格要求包体积在 5MB 以内。
几年过去了,我们对包体积的看法有什么改变吗?
1. 为什么要优化包体积
在 2018 年的 Google I/O,Google 透露了 Google Play 上安装包体积与下载转化率的关系图。
从这张图上看,大体来说,安装包越小,转化率越高这个结论依然成立。而包体积对应用的影响,主要有下面几点:
下载转化率。一个 100MB 的应用,用户即使点了下载,也可能因为网络速度慢、突然反悔下载失败。对于一个 10MB 的应用,用户点了下载之后,在犹豫要不要下的时候已经下载完了。但是正如上图的数据,安装包大小与转化率的关系是非常微妙的。10MB 跟 15MB 可能差距不大,但是 10MB 跟 40MB 的差距还是非常明显的。
推广成本。一般来说,包体积对渠道推广和厂商预装的单价会有非常大的影响。特别是厂商预装,这主要是因为厂商留给预装应用的总空间是有限的。如果你的包体积非常大,那就会影响厂商预装其他应用。
应用市场。苹果的 App Store 强制超过 150MB 的应用只能使用 WiFi 网络下载,Google Play 要求超过 100MB 的应用只能使用APK 扩展文件方式上传,由此可见应用包体积对应用市场的服务器带宽成本还是会有一点压力的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • Geek_a8c19d
    Sample里的Release包dex重排优化后APK变大 redex --sign -s ReDexSample/keystore/debug.keystore -a androiddebugkey -p android -c redex-test/interdex.config -P ReDexSample/proguard-rules.pro -o redex-test/interdex_output-release.apk ReDexSample/build/outputs/apk/release/ReDexSample-release.apk

    作者回复: 重排并不是为了减少size,不过可以diff一下是哪一块变大了。会不会只是压缩率的问题

    2
  • nb Ack
    老师您好。我想问一下减少 apk 体积是不是可以通过配置 ndk { abiFilters 'armeabi-v7a' } 减少打出的 so 文件。听说微信就是这样的?这会有什么问题吗?

    作者回复: 在国内为了减少安装包体积,一般都是单abi的,不仅仅是微信

    2
    1
  • Allen
    其实更好奇怎样在启动速度快的要求下 减少包体大小 还是这两者必须择一呢

    作者回复: 类似dex分包以及某些手段,是既能减少包体积又能提升启动速度。 如果需要权衡的事情,我们要看自己的应用处于哪个阶段,目前更加严峻的是哪个问题

    1
  • 詹伟
    动态库压缩,动态库拷贝成功后才有戏,如果拷贝失败了怎么破,apk内直接读是不能压缩的

    作者回复: 只能删除一些缓存文件,或者提示用户清理空间了

  • 天空
    项目用了small插件化,ApkChecker不能分析以so库的插件,怎么办?

    作者回复: 可能需要适配一下才行

  • joker°
    mess 还是在维护的~

    作者回复: 抱歉抱歉

  • 小小代码
    还有个问题,Redex重分包的功能,如果我使用通过-printconfiguration "build/outputs/mapping/proguard-rules.pro"生成的合并之后的Proguard文件,会打印 InterDexPass not run because no ProGuard configuration was provided的日志,但我实际上配置了Proguard文件啊

    作者回复: 需要拼到命令行中: redex -P proguard_rule.txt -c interdex.config boot-free-debug.apk -o redex.apk

  • 小小代码
    试了下Redex重分包的功能,发现个问题,如果我使用通过-printconfiguration "build/outputs/mapping/proguard-rules.pro"生成的合并之后的Proguard文件,会打印 InterDexPass not run because no ProGuard configuration was provided的日志,但我实际上配置了Proguard文件啊

    作者回复: 可以拼在命令行中: redex -P proguard_rule.txt -c interdex.config boot-free-debug.apk -o redex-uc.apk

  • elephant
    F家的方案总是让人不可思议,经常想大喊,你们至于么,方案搞得这么黑科技!!!以前看fresco和reactnative实现,请问我跪的标准么。😂

    作者回复: 对的,不过感觉他们玩的太飘了,可以参考但是不好全盘接受

  • CoderAndy
    Facebook把dex放在assets下那么在首次启动解压后,如何执行dexopt?或者会不会执行该操作?

    作者回复: 不执行dexopt,直接通过oatmeal自己生成odex

    2
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部