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开发高手课
登录|注册

08 | 启动优化(下):优化启动速度的进阶方法

张绍文 2018-12-22
专栏上一期,我们一起梳理了应用启动的整个过程和问题,也讲了一些启动优化方法,可以说是完成了启动优化工作最难的一部分。还可以通过删掉或延后一些不必要的业务,来实现相关具体业务的优化。你学会了这些工具和方法,是不是觉得效果非常不错,然后美滋滋地向老大汇报工作成果:“启动速度提升 30%,秒杀所有竞品好几条街”。
“还有什么方法可以做进一步优化吗?怎么证明你秒杀所有的竞品?如何在线上衡量启动优化的效果?怎么保障和监控启动速度是否变慢?”,老大一口气问了四个问题。
面对这四个问题,你可不能一脸懵。我们的应用启动是不是真的已经做到了极致?如何保证启动优化成果是长期有效的?让我们通过今天的学习,一起来回答老大这些问题吧。

启动进阶方法

除了上期讲的常规的优化方法,我还有一些与业务无关的“压箱底”方法可以帮助加快应用的启动速度。当然有些方法会用到一些黑科技,它就像一把双刃剑,需要你做深入的评估和测试。
1. I/O 优化
在负载过高的时候,I/O 性能下降得会比较快。特别是对于低端机,同样的 I/O 操作耗时可能是高端机器的几十倍。启动过程不建议出现网络 I/O,相比之下,磁盘 I/O 是启动优化一定要抠的点。首先我们要清楚启动过程读了什么文件、多少个字节、Buffer 是多大、使用了多长时间、在什么线程等一系列信息。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • 志伟
    今天介绍的 “数据重排”相关的优化压榨了系统和硬件的时间,令我想起以前做存储驱动的相关工作。
    手机存储的Nand Flash,emmc 等flash存储硬件有其读写的特点或者限制
    * 最小读取单位sector ,512byte或其他
    * 最小擦出单位为block(如128个sector64k)或其他
    * 一个存储单元寿命因芯片质量不同,大概2-3k次
    通常做法是增大缓存,做一层逻辑的映射,减少实际读写外部Flash的时间,因为每一次硬件操作成本较大,除了实际的数据传输还有开始握手和结束等待的时间。另外会结合磨损均衡和坏块管理算法,提升读写性能和延长存储的使用寿命。
    调整Apk的文件顺序,使其更加紧凑,那内核I/O读取从flash读取回内存的数据在后续读取中更容易命中,减少了I/O时间。
    最怕的是随机小文件的读写,因为这样破坏了存储驱动和内核的缓存,要增加很多实际I/O操作,性能很低。
    在对比I/O性能时候设备也有差异:
    * 新设备比旧设备性能好
    * 存储剩余大的设备比存储几乎满的设备性能要好
    因为旧设备坏块多,存储将满的设备剩余完整好块少,在I/O时候驱动需要调整腾挪数据,找到好的块去写,读时候没有连续读回更多块,降低了缓存的命中,增加了时间。
    2018-12-25
    9
  • 廖凡
    请教一个问题,一定要回答啊,困扰了很久。
    我们在使用tinker过程中,线上运行性能下降。
    不光是app启动性能,整个app的运行生命周期都会下降,
    tinker不应该只影响启动性能吗,为什么整个app的生命周期都有影响呢。
    tinker也没有做全局插桩,是和您本文所说的,黑科技导致Android runtime的性能优化无法生效到有关系吗?
    2019-09-02
    1
    1
  • 万里大鹏飞
    您上面说,Buffer不小心写成了 1 byte,总共要读取 1000次,这样会命中Page Cache中不会导致真正的IO。可是实际测试的时候,read同一个文件,buffer大小1byte和1k的read速度还有有差异的,这个是为什么呢?

    作者回复: 后面io会讲到。主要差别是系统调用跟数据拷贝的时间

    2018-12-23
    1
  • 朱蓝天
    感谢分享,启动这块的线上监控似乎没有崩溃卡顿内存这几个完整,实验室环境居多。我们最近也在尝试做一些线上启动完整过程的函数级微损监控,另外还有启动这块的代码框架似乎也可以写一些。
    2018-12-22
    1
  • gmm
    请问下怎么样去复写 ClassLoader,获取类的加载
    2019-12-01
  • 海贼凯
    那个实验室监控在哪里
    2019-09-29
  • MIAN-勉
    重排顺序的依据是什么,是按照文件大小从小到大以此排序,这样一次磁盘读取可以尽可能多的读文件;还是要综合文件大小、文件读取次数、启动过程是否加载这些因素(这几个因素中哪个权重会大一些),进行文件排序。看过文章后觉得应该是第二种,因为老师有讲到统计、度量这些措施。另外,觉得老师应该就010 Editor查看效果简单介绍一下
    2019-07-26
  • 思而学
    给了大厂优化的思路,继续理论高大
    2019-05-24
  • Geek_28d7fe
    感谢精彩分享,请问app在android5.0以下由于multidex导致启动速度慢如何破,谢谢!

    作者回复: 1. 对于dex,不要先解压,然后再压缩
    2. dex解压和编译只在单独的进程处理,防止多进程同步
    3. 增加loading界面

    2019-03-26
  • Swing
    感觉又迂回到文件系统了。。。基础不好,心塞

    作者回复: 一步一步来

    2019-01-31
  • 小洁
    优化Dex上文件的重排,是只会在首次安装或者覆盖安装上涉及到吗,其他情况呢?

    作者回复: Dex重排是任何时候都有效果的

    2019-01-04
  • 功夫熊猫
    对于dex中的class按文件大小重排没有明白为什么为优化i/o速度,class的加载和在dex的位置有什么关系?

    作者回复: Classdef在dex是连续存放的,所以可以一次读取一大段,mmap中断缺页就会少一些

    2018-12-25
  • 许圣明
    你好,请问数据重排指的是根据代码中读取各种资源文件的顺序来调整这些文件在目录中的顺序吗?邻近读取的文件存放的位置也要邻近是吗?

    作者回复: 对的,对于大量连续读取,文件又比较小的,会比较有用

    2018-12-22
收起评论
13
返回
顶部