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

05 | 卡顿优化(上):你要掌握的卡顿分析方法

自己动手写工具
分享瓶颈所在
解读示例信息
选择合适的工具和展示方式
鼓励团队关注性能问题
底层基础知识的重要性
Flame Chart
Call Chart
Simpleperf
systrace
Nanoscope
Traceview
CPU饱和度
CPU使用率
CPU性能评价指标
系统时间
用户时间
开发者难以排查
用户敏感度
课后作业
总结
可视化方法
Android卡顿排查工具
卡顿问题分析指标
CPU性能
卡顿问题
卡顿优化

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

“我的后羿怎么动不了!”,在玩《王者荣耀》的时候最怕遇到团战时卡得跟幻灯片一样。对于应用也是这样,我们经常会听到用户抱怨:“这个应用启动怎么那么慢?”“滑动的时候怎么那么卡?”。
对用户来说,内存占用高、耗费电量、耗费流量可能不容易被发现,但是用户对卡顿特别敏感,很容易直观感受到。另一方面,对于开发者来说,卡顿问题又非常难以排查定位,产生的原因错综复杂,跟 CPU、内存、磁盘 I/O 都可能有关,跟用户当时的系统环境也有很大关系。
那到底该如何定义卡顿呢?在本地有哪些工具可以帮助我们更好地发现和排查问题呢?这些工具之间的差异又是什么呢?今天我来帮你解决这些困惑。

基础知识

在具体讲卡顿工具前,你需要了解一些基础知识,它们主要都和 CPU 相关。造成卡顿的原因可能有千百种,不过最终都会反映到 CPU 时间上。我们可以把 CPU 时间分为两种:用户时间和系统时间。用户时间就是执行用户态应用程序代码所消耗的时间;系统时间就是执行内核态系统调用所消耗的时间,包括 I/O、锁、中断以及其他系统调用的时间。
1. CPU 性能
我们先来简单讲讲 CPU 的性能,考虑到功耗、体积这些因素,移动设备和 PC 的 CPU 会有不少的差异。但近年来,手机 CPU 的性能也在向 PC 快速靠拢,华为 Mate 20 的“麒麟 980”和 iPhone XS 的“A12”已经率先使用领先 PC 的 7 纳米工艺。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了移动设备和PC的CPU性能差异,以及评价CPU性能的参数和架构设计。重点讨论了卡顿问题分析指标,包括CPU使用率、CPU饱和度和线程优先级等方面。文章还介绍了一些常用的命令和文件,如top命令、vmstat命令、strace命令等,用于帮助开发者更好地排查卡顿问题。此外,还介绍了一些卡顿排查工具,如Traceview、Nanoscope、systrace和Simpleperf,分析了它们的特点和适用场景。总的来说,本文通过对CPU性能和卡顿问题分析指标的介绍,为读者提供了一些基础知识和工具,帮助他们更好地理解和解决应用卡顿问题。 文章还介绍了Android Studio 3.2的Profiler中集成的几种性能分析工具,以及它们的功能和展示方式。其中,Call Chart适合分析整个流程的调用,而Flame Chart则适合直观展示代码路径的CPU时间分布。作者强调了底层基础知识对于理解工具原理和排查性能问题的重要性,同时鼓励开发者关注性能问题并学会思考工具的原理和局限性。 此外,文章提出了课后作业,要求读者解读示例统计信息并分享瓶颈所在,以及动手写一个工具得到相似统计信息。这样的实践性作业有助于读者深入理解文章内容并提升技能。 总的来说,本文内容丰富,涵盖了CPU性能评价、卡顿问题分析工具和Android性能分析工具的使用,同时提出了实践性的课后作业,对读者进行了全方位的引导和激励。

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

全部留言(56)

  • 最新
  • 精选
  • 小雨点
    有点深了,表示看不太懂

    作者回复: 是linux部分还是四个卡顿工具比较难呢?

    2018-12-11
    2
    11
  • memory
    感觉这个课可能更适用于比较深入研究过内存方面知识的人,但是大部分人应该都是开发业务的程序员,想对这方面做个系统的学习,感觉还是有点难了,给出的课后作业,有点一脸懵逼,有点无从下手的感觉

    作者回复: 已经很少很简单但是又可以进阶的内容,可以尝试看看文章中的一些背景知识 后续也会给出学习路线图出来

    2018-12-12
    9
  • 国庆
    太极客了吧,讲的东西感觉像是华山论剑!

    作者回复: 所讲的内容并不是为了炫技,都是我们日常工作中可能会用到的知识

    2018-12-12
    3
  • 石先
    绍文哥,我又来了。我比较感兴趣之前内存优化文章里面提到对 Bitmap 的优化,可以[通过直接调用 libandroid_runtime.so 中 Bitmap 的构造函数]来创建一个空的 nativeBitmap 对象,但这个操作跟平时自己通过 jni 调用自己编译的 so 包里的 native 方法不太一样,网上也找不到例子来说明这个过程,所以能不能把这个过程再描述详细一点,或者最好是能 show me code,我也想自己实操一遍你说的那些点,非常感谢。

    作者回复: 这个其实没那么简单,编译的时候也要把Bitmap相关的很多头文件引入。 调用是通过dlsym来实现的,这块我后续有时间提交到github吧

    2018-12-12
    2
    3
  • Xmilton
    张总,我想问下真机是不是读不到/proc/stat里的信息?该怎么处理呢。

    作者回复: Android 8.0之后的确不让读这个文件了

    2019-01-09
    2
  • 李大可
    通过读取文件获取进程cpu,线程cpu等使用状态的一个问题是在不少机型上,没有读取这些文件的权限。如果需要将release版本的这些性能数据采集并上传供数据分析,数据的采集就是一个问题,比如线程cpu使用率,常规的做法是才用两个间隔时间较短的cpu快照,然后计算应用cpu使用时间在系统cpu使用时间所占的比例,但是cpu使用时间是一个一个时间片,上述的统计方法并不够准确

    作者回复: 从我们的应用来看,获得的成功率还是非常高的。 因为我们应用基本做了线程池收拢,大部分线程都是常驻的。可以从整体上看到各个线程的一些情况,这块数据在一些场景作用不大,一些场景还是可以发现问题。

    2018-12-13
    2
  • 我的心情在荡漾
    各种命令一脸懵逼

    作者回复: 这些都是比较基本linux命令,可以在网上查一下用法

    2018-12-12
    2
  • Geek_sky
    我尝试用uptime查看系统负载,只能看到up time: 06:40:38, idle time: 20:50:31, sleep time: 00:00:00。我是用了cat /proc/loadavg查看到了系统负载。是不是现在的机器不能通过uptime查看了?

    作者回复: Android很多Linux的命令是没有支持的

    2019-12-13
    2
    1
  • Akon Convict
    希望作者能给出个深入学习的路线图

    作者回复: 正在整理中

    2018-12-20
    1
  • 张亚运
    计算机科学太高深了,知道自己渺小的办法是多出去看看走走,在自己圈子里,总以为自己无所不知。

    作者回复: 终生学习

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