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

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

课后练习
课后作业
总结
其他监控
卡顿监控
卡顿优化

该思维导图由 AI 生成,仅供参考

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

卡顿监控

前面我讲过监控 ANR 的方法,不过也提到两个问题:一个是高版本的系统没有权限读取系统的 ANR 日志;另一个是 ANR 太依赖系统实现,我们无法灵活控制参数,例如我觉得主线程卡顿 3 秒用户已经不太能忍受,而默认参数只能监控至少 5 秒以上的卡顿。
所以现实情况就要求我们需要采用其他的方式来监控是否出现卡顿问题,并且针对特定场景还要监控其他特定的指标。
1. 消息队列
我设计的第一套监控卡顿的方案是基于消息队列实现,通过替换 Looper 的 Printer 实现。在 2013 年的时候,我写过一个名为 WxPerformanceTool 的性能监控工具,其中耗时监控就使用了这个方法。后面这个工具在腾讯公共组件做了内部开源,还获得了 2013 年的年度十佳组件。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了卡顿优化的监控方法,包括消息队列监控、插桩和Profilo三种监控方法。消息队列监控通过向主线程消息队列插入空消息来监控主线程的卡顿情况,但存在一定的误差。插桩监控方法通过在函数入口和出口插入耗时监控代码,实现了对应用内自身函数耗时的监控,但无法监控系统函数调用。最后,介绍了Facebook开源的Profilo库,集成了atrace功能和快速获取Java堆栈的特点,实现了全面的性能监控,但兼容性仍需注意。文章还提到了Android Vitals的性能监控服务,涉及卡顿相关的监控有ANR、启动、帧率三个,以及帧率、生命周期和线程监控的重要性。总结指出,无论采用何种监控方法,最终都能获取到卡顿时的堆栈和CPU运行信息,有助于定位卡顿问题,提高应用性能。文章还强调了对底层技术的深入了解对于技术人员的成长有重要帮助。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(47)

  • 最新
  • 精选
  • 希夷
    如果给完全没有卡顿的APP打分100的话,对于大厂的APP本来就有90分,追求的是如何将分数提到95,98,99,甚至100,邵文老师所讲主要也是针对这块;但对于很多想我这样的小公司开发者来说,受人力物力时间所限,想做到的其实是先达到90分,而这块专栏涉及的有限,对于跟我类似的受众不够友好。

    作者回复: 其实不是,这个专栏我更关注的是人的成长,而不是具体应用到哪里。 当然可以把知识转化应用到工作中效果会更加好

    2018-12-15
    2
    9
  • 雪人
    老师,看了您这些内容,对我的第一感觉是要对源码很熟悉,那您对学习源码有什么建议吗,(看的晚了,不知道现在评论还会不会回)

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

    2019-03-05
    8
  • 小洁
    请问下,目前有个需求是对卡顿和启动耗时做性能指标线上预警,对于 activity、fragment的生命周期启动耗时的监控数据,还有主线程卡顿堆栈的数据,应该按什么的维度去统计比较合理呢

    作者回复: 初期的时候我们不建议一下子铺的太开,一步一步来并且要真正的发现现实的问题。 可以先从卡顿和ANR的捕获先开始做,对卡顿堆栈做聚合排序。启动的话一般只是一个统计指标,或者我们也可以把启动拆成多个步骤作为监控

    2019-04-18
    3
  • 斑马线
    老师你好,最学习了你的专栏,准备优化一下项目,用一个第三方开源工具检测了一下,发现项目有大量的“主线程阻塞超过70ms”,请问主线程执行耗时操作,多久才算耗时,该如何定义?

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

    2019-02-25
    3
  • eyeandroid
    请教下老师,hook抓到的systrace里面有其它进程的信息吗,跟python systrace.py抓到的内容有什么差别

    作者回复: 其实信息都是一样的,hook的作用是可以用到线上。但是一般会过滤掉一些信息,只上报最感兴趣的部分

    2019-04-24
    2
  • 蚂蚁内推+v
    Nanoscope 是什么 方便老师说下吗

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

    2018-12-13
    2
  • VK
    绍文老师,想问下卡顿信息监控上报,有什么策略判断吗,哪些方法函数需要监控,哪些不需要监控?

    作者回复: 一般都是全局监控的吧,类似ANR一样

    2019-05-18
    1
  • 有个问题请教 用empty message 去检查卡顿 ,比如1s 没消费 ,就能说message 卡顿1s 吗 ? 如果空消息前边有几个消息 比如3个 ,现在正在执行第三个 我觉得也正常啊 不能说明卡顿啊

    作者回复: 我们会把监控消息插入到message的头部,当然也是有可能会出现误报,但是从大数据来说问题不大

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

    作者回复: 事件是最近匹配 线程hook那个很简单的,我下次放到sample里面

    2018-12-13
    1
  • EchoSomeTH
    adb shell objdump /system/lib/libutils.so 提示objdump not found,咋导出来?

    作者回复: objdump命令在ndk里面

    2019-07-22
收起评论
显示
设置
留言
47
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部