专栏名称: 鸿洋
你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识。点击历史消息,查看所有已推送的文章,喜欢可以置顶本公众号。此外,本公众号支持投稿,如果你有原创的文章,希望通过本公众号发布,欢迎投稿。
目录
今天看啥  ›  专栏  ›  鸿洋

一波深入的Android 性能优化

鸿洋  · 公众号  · android  · 2024-12-26 08:35
    

主要观点总结

本文介绍了卡顿、ANR和死锁监控方案的原理和方法,包括卡顿原理、卡顿监控、ANR触发流程、ANR分析方法和监控方式,以及死锁导致的ANR和死锁监控。文章还提到了如何形成闭环监控流程,并在发生ANR时获取主线程堆栈信息和死锁线程堆栈信息,上报到服务器,并定位到最后修改代码的同学。

关键观点总结

关键观点1: 卡顿原理

卡顿通常是由于主线程有耗时操作导致的,超过阈值会触发ANR。卡顿可能由MessageQueue#next阻塞或Handler的dispatchMessage耗时太久引起。

关键观点2: 卡顿监控

卡顿监控可以通过Looper提供的Printer接口计算Handler处理一个消息的耗时,判断是否出现卡顿。也有使用字节码插桩技术,在编译期插入代码统计方法耗时。

关键观点3: ANR触发流程

ANR触发流程可以比喻为埋炸弹和拆炸弹的过程,如Service、BroadcastQueue、ContentProvider、InputDispatching的超时会导致ANR。

关键观点4: ANR分析方法

ANR的分析通常通过分析/data/anr/traces.txt文件,获取主线程和其他线程的堆栈信息。

关键观点5: ANR监控方式

ANR监控可以通过抓取系统traces.txt文件上传、使用ANRWatchDog库、优化后的ANRMonitor等方式进行。

关键观点6: 死锁导致的ANR和死锁监控

死锁导致的ANR可以通过获取当前blocked状态的线程、目标锁被哪个线程持有、找到一直不释放锁的线程、通过算法找到死锁线程,并输出堆栈信息。

关键观点7: 形成闭环

将卡顿监控、ANR监控和死锁监控连接起来,在发生ANR时,将整个监控流程形成一个闭环,包括获取主线程堆栈信息、检测死锁、获取死锁对应线程堆栈信息、上报到服务器等。


文章预览

本文作者 作者: 蓝师傅 链接: https://juejin.cn/post/6973564044351373326 本文由作者授权发布。 1 前言 最近参加了几轮面试,发现很多5-7年工作经验的候选人在性能优化这一块,基本上只能说出传统的分析方式,例如ANR分析,是通过查看/data/anr/ 下的log,分析主线程堆栈、cpu、锁信息等。 然而,这种方法有一定的局限性,并不是每次都奏效,很多时候是没有堆栈信息给你分析的,例如有些高版本设备需要root权限才能访问/data/anr/ 目录,或者是线上用户的反馈,只有一张ANR的截图加上一句话描述。 假如你的App没有实现ANR监控上报,那么你大概率会把这个问题当成“未复现”处理掉,而没有真正解决问题。 于是我整理了这一篇文章,主要关于卡顿、ANR、死锁监控方案。 2 卡顿原理和监控 2.1 卡顿原理 一般来说,主线程有耗时操作会导致卡顿,卡顿超过阈值 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览