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

06 | 卡顿优化(下):如何监控应用卡顿?

张绍文 2018-12-13
“我在秒杀 iPhone XS 的支付页面卡了 3 秒,最后没抢到”,用户嘶声力竭地反馈了一个卡顿问题。
“莫慌莫慌”,等我打开 Android Studio, 用上一讲学到的几个工具分析一下就知道原因了。
“咦,在我这里整个支付过程丝滑般流畅”。这个经历让我明白,卡顿跟崩溃一样需要“现场信息”。因为卡顿的产生也是依赖很多因素,比如用户的系统版本、CPU 负载、网络环境、应用数据等。
脱离这个现场,我们本地难以复现,也就很难去解决问题。但是卡顿又非常影响用户体验的,特别是发生在启动、聊天、支付这些关键场景,那我们应该如何去监控线上的卡顿问题,并且保留足够多的现场信息协助我们排查解决问题呢?

卡顿监控

前面我讲过监控 ANR 的方法,不过也提到两个问题:一个是高版本的系统没有权限读取系统的 ANR 日志;另一个是 ANR 太依赖系统实现,我们无法灵活控制参数,例如我觉得主线程卡顿 3 秒用户已经不太能忍受,而默认参数只能监控至少 5 秒以上的卡顿。
所以现实情况就要求我们需要采用其他的方式来监控是否出现卡顿问题,并且针对特定场景还要监控其他特定的指标。
1. 消息队列
我设计的第一套监控卡顿的方案是基于消息队列实现,通过替换 Looper 的 Printer 实现。在 2013 年的时候,我写过一个名为 WxPerformanceTool 的性能监控工具,其中耗时监控就使用了这个方法。后面这个工具在腾讯公共组件做了内部开源,还获得了 2013 年的年度十佳组件。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(33)

  • Seven
    明明是Android开发课,但是绍文老师在很多文章中都会提到Linux,JVM相关的知识,深入优化就是深入底层啊,目前的能力不足以消化这篇文章,同时希望绍文老师和鹏飞老师推荐相关书籍
    2018-12-13
    33
  • George吴逸云
    已经掉队了,底层基础太差了😭
    2018-12-13
    14
  • catkin
    张老师,看完这篇文章我已经开始怀疑人生了,掌握这么多知识您是怎么办到的,而且对那些黑科技了如指掌,还能举一反三,感觉就跟玩一样!能不能赐教一下怎么做到的?
    2018-12-13
    1
    7
  • 黄庭洗凡浊
    就开篇前两章看懂了 之后看到现在一脸懵逼 我还是早点转行吧
    2019-05-29
    6
  • 希夷
    如果给完全没有卡顿的APP打分100的话,对于大厂的APP本来就有90分,追求的是如何将分数提到95,98,99,甚至100,邵文老师所讲主要也是针对这块;但对于很多想我这样的小公司开发者来说,受人力物力时间所限,想做到的其实是先达到90分,而这块专栏涉及的有限,对于跟我类似的受众不够友好。

    作者回复: 其实不是,这个专栏我更关注的是人的成长,而不是具体应用到哪里。

    当然可以把知识转化应用到工作中效果会更加好

    2018-12-15
    4
  • x-ray
    作者您好,我们应用的很多用户,android系统都是4.4版本的,因为分包dex优化的原因,导致第一次安装或者版本升级时启动的时间非常的长,想问问您有什么好的优化措施,谢谢
    2018-12-13
    1
    4
  • 雪人
    老师,看了您这些内容,对我的第一感觉是要对源码很熟悉,那您对学习源码有什么建议吗,(看的晚了,不知道现在评论还会不会回)

    作者回复: 看源码还是需要带着目的去看,例如渲染相关,类加载流程,不要漫无目的的去看

    2019-03-05
    3
  • eyeandroid
    请教下老师,hook抓到的systrace里面有其它进程的信息吗,跟python systrace.py抓到的内容有什么差别
    2019-04-24
    1
  • 东方
    给大家推荐一个方法,解析Traceview生成的trace文件,即可知道这个阶段所有运行的函数,序列化一下,就能生成需要插桩的白名单列表。
    2018-12-14
    1
  • 小美
    Nanoscope 是什么 方便老师说下吗

    作者回复: nanoscope 是 uber 开发的一套 Low overhead trace 工具 https://github.com/uber/nanoscope

    2018-12-13
    1
  • Kenny
    张老师,刚试了你给的Sample,plthook实现的自定义ftrace,B与E事件日志不成对?这个怎么看每一个事件的耗时?每个B找最近的E作为截止算时间吗?还是按照一个B对应一个E去算?还有一个问题就是课程提到通过hook thread_create去监控线程,这个是指监控应用的线程吗?如果是的话,那系统的线程比如binder,jit等如何去监控?话说这个张老师能把hook 线程创建的实现也放Sample?

    作者回复: 事件是最近匹配

    线程hook那个很简单的,我下次放到sample里面

    2018-12-13
    1
  • 薯条
    卡顿监控:1.帧率 2.Activity,Fragment 这些类的onCreate等相关的启动完成结束时间 3.线程数目。
    卡顿优化 线程数目遇到过:一个项目中启动了几百个线程,大多数睡眠。少数运行的thread 可以通过profile找出来。用线程池代替传统的线程运行。。今天主要是学习到了 ,帧率,没想到大厂还可以这样玩。。。难怪我开发的app 总是没得微信流畅,平滑,原来问题在这,哈哈哈哈
    2019-09-22
  • 一片羽毛
    请问一下,github的那个日志应该怎么分析
    2019-08-31
  • 放个屁臭到了自己
    整个课程我学习的感受是分为两大部分,优化和监控,两个内容是穿插在一起的,需要自己把它们找出来归类。
    而且设计的知识点很多,Linux 虚拟机,运行时……累觉不爱,我想去种菜……
    2019-08-13
  • EchoSomeTH
    adb shell objdump /system/lib/libutils.so 提示objdump not found,咋导出来?
    2019-07-22
  • VK
    绍文老师,想问下卡顿信息监控上报,有什么策略判断吗,哪些方法函数需要监控,哪些不需要监控?
    2019-05-18
  • YI🎐
    profilo是怎么用起来的?创建profilo时候都要报错
    2019-05-02
  • 小洁
    请问下,目前有个需求是对卡顿和启动耗时做性能指标线上预警,对于 activity、fragment的生命周期启动耗时的监控数据,还有主线程卡顿堆栈的数据,应该按什么的维度去统计比较合理呢
    2019-04-18
  • 朔野西骑
    牛逼!
    2019-03-16
  • 斑马线
    老师你好,最学习了你的专栏,准备优化一下项目,用一个第三方开源工具检测了一下,发现项目有大量的“主线程阻塞超过70ms”,请问主线程执行耗时操作,多久才算耗时,该如何定义?

    作者回复: 每一帧的时间是16.6ms,看你们的忍耐程度。不过前期可以把这个时间放大一些,例如两秒,三秒。因为如果间隔太小,前期会有非常多报出来,还是先解决比较严重的问题

    2019-02-25
收起评论
33
返回
顶部