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

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

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

基础知识

在具体讲卡顿工具前,你需要了解一些基础知识,它们主要都和 CPU 相关。造成卡顿的原因可能有千百种,不过最终都会反映到 CPU 时间上。我们可以把 CPU 时间分为两种:用户时间和系统时间。用户时间就是执行用户态应用程序代码所消耗的时间;系统时间就是执行内核态系统调用所消耗的时间,包括 I/O、锁、中断以及其他系统调用的时间。
1. CPU 性能
我们先来简单讲讲 CPU 的性能,考虑到功耗、体积这些因素,移动设备和 PC 的 CPU 会有不少的差异。但近年来,手机 CPU 的性能也在向 PC 快速靠拢,华为 Mate 20 的“麒麟 980”和 iPhone XS 的“A12”已经率先使用领先 PC 的 7 纳米工艺。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(42)

  • 刘伟
    高级的东西看的越多,越觉得Android高深的东西都是在Andriod之外的~
    2018-12-13
    38
  • 志伟
    8核cpu,平均负载8,idle时间去到72%,说明应用运行中系统CPU性能有很大的盈余。
    sample应用时间分布大头在kernel,细分看线程,SingleThread是主要耗时线程,并且共发生了3094次缺页异常(faults字段)。缺页异常的处理是在内核空间,也解释了kernel 耗时大头的原因,而这里做的操作就是读写磁盘。猜测可能是很多小文件的读写。
    综合分析瓶颈应该是sample将io集中在一个线程中处理,系统的全部cpu没有利用上,一核忙死,其他3核闲死。
    2018-12-11
    34
  • nodlee
    理论是基石,例子是上层建筑。希望作者多结合一些实际案例讲解,理论太多,感觉很空洞。作为付费用户,这个要求不高吧。
    2018-12-14
    20
  • 小雨点
    有点深了,表示看不太懂

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

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

    作者回复: 已经很少很简单但是又可以进阶的内容,可以尝试看看文章中的一些背景知识

    后续也会给出学习路线图出来

    2018-12-12
    7
  • will
    很多没有接触的工具,还是需要去了解一下Linux方面的基础,后面的作业没看太明白
    2018-12-11
    6
  • Dr.strange🐬
    大神,能给Linux的学习路线吗
    2018-12-13
    4
  • 国庆
    太极客了吧,讲的东西感觉像是华山论剑!

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

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

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

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

    作者回复: 这个其实没那么简单,编译的时候也要把Bitmap相关的很多头文件引入。

    调用是通过dlsym来实现的,这块我后续有时间提交到github吧

    2018-12-12
    2
  • snzang
    歪个楼,想请教大神们一个问题,我司的项目打debug签名的包跑在Android8.0以上的机器时会非常卡,换成release签名就很流畅。在8.0以下的手机上运行release和debug的包都很流畅,不知道是不是8.0限制了debug包的运行内存,想在这里问下有遇到相同情况的同学吗?
    2018-12-11
    2
  • Akon Convict
    希望作者能给出个深入学习的路线图

    作者回复: 正在整理中

    2018-12-20
    1
  • 小美
    绍文老师: 我在我虚拟机上查看cpu 频率,可是您文中说的那个文件没有
    root@vbox86p:/sys/devices/system/cpu/cpu0 # cd cpufreq
    /system/bin/sh: cd: /sys/devices/system/cpu/cpu0/cpufreq: No such file or directory
    这和android 系统机器相关吗?
    2018-12-18
    1
  • 李大可
    通过读取文件获取进程cpu,线程cpu等使用状态的一个问题是在不少机型上,没有读取这些文件的权限。如果需要将release版本的这些性能数据采集并上传供数据分析,数据的采集就是一个问题,比如线程cpu使用率,常规的做法是才用两个间隔时间较短的cpu快照,然后计算应用cpu使用时间在系统cpu使用时间所占的比例,但是cpu使用时间是一个一个时间片,上述的统计方法并不够准确

    作者回复: 从我们的应用来看,获得的成功率还是非常高的。

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

    2018-12-13
    1
  • 庐州月
    虽然好多东西不懂或者没听过,但是这么系统的了解下还是比较好的,等以后慢慢会看消化。作为一个当枪匹马干了5年的开发来说,争取以后慢慢把这些一点点应用到开发中,建议绍文大神可以在以后的课程中讲解中结合单干者的开发场景做一些分享,感谢大佬分享,也希望单干着一起交流。
    2018-12-12
    1
  • 两天
    表示很有用,满满的干货
    2018-12-11
    1
  • Sharry
    获取当前进程下的使用率成功了, 不过获取 /proc/stat 和 /proc/loadavg 出现了无权限访问的问题..
    2019-11-22
  • 勇敢地追
    大略分析一下,问题集中在kernal和io上。R表示正在运行,S表示TASK_INTERRUPTIBLE,在等待某件事情发生(多数是IO)。可见很可能是一个线程在执行IO操作,其他线程在等待。kernel faults的解释在这里有:https://blog.csdn.net/vanquishedzxl/article/details/47029805。通常是在内核申请分配物理内存。kernel faults数字大表示申请了好多次。也就是说有大量IO操作
    说点体会吧,分析这个需要查阅好多资料,以及对Linux最好也要熟悉。熟悉以后基本就知道sample大致该怎么写了
    2019-11-02
  • 风炫灬梦想
    最近去补充了一些linux知识,感觉现在看起来比之前轻松了一些。推荐大家可以先把整个系列看完之后,在看一下linux相关的知识,再来复习一下,会有新的收获
    2019-09-15
  • 放个屁臭到了自己
    感觉都看懂,但是自己理解的是皮毛,底层的知识不懂~~

    感觉其实都是假的~~
    2019-07-27
收起评论
42
返回
顶部