Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12609 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

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

张绍文 2019-02-09
曾经在 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • 代码猩球
    文章内容丰富,里面各种链接都值得研读一下,👍
    2019-02-11
    4
  • wizrdev
    在mac上搞了两天redex,执行autoreconf -ivf && ./configure && make -j4一直编译不同过,在linux上编译就很顺利,在mac上一直报下面的错误
    autoreconf: Entering directory `.'
    autoreconf: configure.ac: not using Gettext
    autoreconf: running: aclocal --force -I m4
    autoreconf: configure.ac: tracing
    autoreconf: running: glibtoolize --copy --force
    glibtoolize: putting auxiliary files in '.'.
    glibtoolize: copying file './ltmain.sh'
    glibtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
    glibtoolize: copying file 'm4/libtool.m4'
    glibtoolize: copying file 'm4/ltoptions.m4'
    glibtoolize: copying file 'm4/ltsugar.m4'
    glibtoolize: copying file 'm4/ltversion.m4'
    glibtoolize: copying file 'm4/lt~obsolete.m4'
    autoreconf: running: /usr/local/Cellar/autoconf/2.69/bin/autoconf --force
    autoreconf: configure.ac: not using Autoheader
    autoreconf: running: automake --add-missing --copy --force-missing
    configure.ac:6: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated. For more info, see:
    configure.ac:6: https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
    configure.ac:14: installing './compile'
    configure.ac:6: installing './missing'
    Makefile.am: installing './depcomp'
    autoreconf: Leaving directory `.'
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... ./install-sh -c -d
    checking for gawk... no
    checking for mawk... no
    checking for nawk... no
    checking for awk... awk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking for g++... g++
    checking whether the C++ compiler works... no
    configure: error: in `/Users/funaihui/AndroidStudioProjects/redex':
    configure: error: C++ compiler cannot create executables
    See `config.log' for more details
    有什么解决的方法吗?
    2019-10-07
    1
    1
  • 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
    2019-09-23
    1
  • Dimple
    FaceBook之所以这么强大,不仅仅是因为社交的地位,还有对开源世界的影响,对软件发展的贡献
    2019-05-11
    1
  • 詹伟
    动态库压缩,动态库拷贝成功后才有戏,如果拷贝失败了怎么破,apk内直接读是不能压缩的
    2019-09-04
  • nb Ack
    老师您好。我想问一下减少 apk 体积是不是可以通过配置
     ndk {
                abiFilters 'armeabi-v7a'
            }
    减少打出的 so 文件。听说微信就是这样的?这会有什么问题吗?
    2019-08-02
    1
  • 坚持远方
    去除debugInfo一直报错。
    Traceback (most recent call last):
      File "/tmp/redex.Nv400q/redex.py", line 785, in <module>
        run_redex(args)
      File "/tmp/redex.Nv400q/redex.py", line 762, in run_redex
        run_redex_binary(state)
      File "/tmp/redex.Nv400q/redex.py", line 224, in run_redex_binary
        'by running %(lldb_script_name)s') % script_filenames)
    RuntimeError: redex-all crashed with exit code -6! You can re-run it under gdb by running /tmp/redex.Nv400q/redex-gdb-1t87rU.sh or under lldb by running /tmp/redex.Nv400q/redex-lldb-xphU77.sh
    2019-06-06
    1
  • 阿糗
    项目用了small插件化,ApkChecker不能分析以so库的插件,怎么办?
    2019-06-02
  • joker°
    mess 还是在维护的~
    2019-05-07
  • 快乐奔跑
    还有个问题,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

    2019-04-13
  • 快乐奔跑
    试了下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

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

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

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

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

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

    作者回复: 类似dex分包以及某些手段,是既能减少包体积又能提升启动速度。

    如果需要权衡的事情,我们要看自己的应用处于哪个阶段,目前更加严峻的是哪个问题

    2019-02-09
收起评论
14
返回
顶部