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

07 | 启动优化(上):从启动过程看启动速度优化

张绍文 2018-12-20
在超市排队结账,扫码支付启动十几秒都还没完成,只能换一个工具支付?
想买本书充实一下,页面刷出来时候十几秒都不能操作,那就换一个应用购买?
用户如果想打开一个应用,就一定要经过“启动”这个步骤。启动时间的长短,不只是用户体验的问题,对于淘宝、京东这些应用来说,会直接影响留存和转化等核心数据。对研发人员来说,启动速度是我们的“门面”,它清清楚楚可以被所有人看到,我们都希望自己应用的启动速度可以秒杀所有竞争对手。
那启动过程究竟会出现哪些问题?我们应该怎么去优化和监控应用的启动速度呢?今天我们一起来看看这些问题该如何解决。

启动分析

在真正动手开始优化之前,我们应该先搞清楚从用户点击图标开始,整个启动过程经过哪几个关键阶段,又会给用户带来哪些体验问题。
1. 启动过程分析
我以微信为例,用户从桌面点击图标开始,会经过 4 个关键阶段。
T1 预览窗口显示。系统在拉起微信进程之前,会先根据微信的 Theme 属性创建预览窗口。当然如果我们禁用预览窗口或者将预览窗口指定为透明,用户在这段时间依然看到的是桌面。
T2 闪屏显示。在微信进程和闪屏窗口页面创建完毕,并且完成一系列 inflate view、onmeasure、onlayout 等准备工作后,用户终于可以看到熟悉的“小地球”。
T3 主页显示。在完成主窗口创建和页面显示的准备工作后,用户可以看到微信的主界面。
T4 界面可操作。在启动完成后,微信会有比较多的工作需要继续执行,例如聊天和朋友圈界面的预加载、小程序框架和进程的准备等。在这些工作完成后,用户才可以真正开始愉快地聊天。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(36)

  • 山鬼
    老师,示例的tranfrom注册方法和直接调用registerTransform有什么区别吗?这块不是太懂
    2018-12-28
    4
  • 天蓝若空
    请问下张老师,延迟拉起进程要怎么处理,在清单文件中四大组件有多进程,默认就初始化了所有的进程,这个有点不明白
    2018-12-21
    4
  • Kenny
    张老师,你好,我们在做了启动优化跟张老师所说90%相同,目前情况来看也取得了50%
    以上的启动速度提升,但是我们想做更加极致,现在发现有些手机有jit线程,这个在启动过程中占了大量的cpu时间片,我也翻看了源码,发现这个线程是在activitythread里面初始化的,是一个jvm线程,请问张老师,这个有方案关闭吗?
    2018-12-20
    1
    4
  • PP
    Unable to select a master clock domain because no path can be found from "SYSTRACE" to "LINUX_FTRACE_GLOBAL".解决方法

    在chrome浏览器的地址栏中输入:chrome://tracing
    之后点击左上角的load加载你生成的test.log.html文件就可以正常查看。
    2019-04-23
    2
  • 马志峰
    王老师,请问线程的优先级是否需要考虑?

    作者回复: 需要,特别是后台线程优先级过高,导致系统真繁忙时的主线程卡顿。可以去看每个线程的utime stime

    2019-02-26
    1
  • 信仰年轻
    Unable to select a master clock domain because no path can be found from "SYSTRACE" to "LINUX_FTRACE_GLOBAL 老师,我查看生成的test.log.html报这个错误啊

    作者回复: 可以看看其他人的答案

    2019-01-20
    1
  • 奚岩
    sample 跑在真机出现下面错误:
    Unable to select a master clock domain because no path can be found from "SYSTRACE" to "LINUX_FTRACE_GLOBAL".

    换模拟器好了,有遇见类似的么😂
    2018-12-28
    1
  • 朱蓝天
    没有闪屏页面的APP情何以堪,老板还要求用户在没有闪屏过渡的情况下做到无感知启动。。
    2018-12-22
    1
  • this is it
    请问Sample如何移植到自己的项目中去,我尝试移植一直不成功,还请能给出详细的移植操作步骤,感谢!
    2019-12-03
  • 希夷
    apk release包可以使用systrace么?我在项目里边,使用debug版本的apk生成的html有每个方法的tag,但是release版本没有
    2019-11-13
  • 勇敢地追
    启动优化以前搞过,就是用TraceView将CPU/Call从1000左右降到400左右,缩短app打开时间。看来还有好多东西,值得好好学习
    2019-11-02
  • 海贼凯
    闪屏页需要网络请求怎么进行优化?
    2019-10-12
  • 北纬18°
    运行python $ANDROID_HOME/platform-tools/systrace/systrace.py gfx view wm am pm ss dalvik app sched -b 90960 -a com.sample.systrace -o test.log.html
    提示 Systrace does not support Python 3.7. Please use Python 2.7.
    python 环境问题有什么办法解决吗?
    2019-09-08
  • 未央
    test.log.html会在什么位置生成,也是systrace_output文件夹下面吗
    2019-08-29
  • Geek_6061ea
    运行:python C:\Users\Administrator\AppData\Local\Android\Sdk\platform-tools\systrace\systrace.py gfx view wm am pm ss dalvik app sched -b 90960 -a com.sample.systrace -o test.html 后报错:
    ValueError: invalid literal for int() with base 10: ''
    2019-06-03
  • hi 老师,代码如何计算启动耗时啊?ad shell am start -W 计算规则怎么看的?

    作者回复: 每个应用的启动结束点都不一样,基本不会是闪屏的时候。所以一般都是应用内部自己的启动统计框架

    2019-03-20
  • Egos
    张老师,你好!我们app 统计耗时和文章说的差不多,在主页onWindowFocusChanged 时计算最终时长。分析的时候发现在主页onResume 和onWindowFocusChanged 之间的时间差很大,看了源代码以后发现onResume 和onWindowFocusChanged 之间会执行ViewRootImpl#performMeasure,但是performMeasure 也远小于他们的时间差(大概小了1倍)。这种情况该怎么去分析呢,有办法dump 这段时间有什么耗时操作?

    作者回复: Systrace和traceview都可以把

    2019-03-18
  • 66
    请问对于生成的trace文件,分析的重点应该是在哪几个指标?界面上指标参数有点多

    作者回复: 主要还是以主线程的耗时为主,看它会不会因为锁,空转,被抢占,或者本身慢,导致界面刷出来慢了

    2019-03-15
  • menty
    python systrace.py --list-cate...
    请问这种命令在什么环境运行,试了在adb shell中运行不了

    作者回复: 这个是在pc的shell环境下执行的,不是在手机的shell里执行的,然后这个脚本的地址在AndroidSdk\platform-tools\systrace 下

    2019-03-14
  • Neil
    Unable to select a master clock domain because no path can be found from "SYSTRACE" to "LINUX_FTRACE_GLOBAL".
     这个是什么意思
    2019-03-11
收起评论
36
返回
顶部