正文大纲
- DDMS
- systrace
- TraceView
- 关于过度绘制
##正文
##DDMS
DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik[虚拟机]调试监控服务
以前用eclipse
的时候,有个直接的入口可以打开DDMS,但是自从用了AndroidStudio,入口没了…但是其实在SDK目录内部还是有的.
打开DDMS之后:
具体有啥用,稍后再说。
##systrace
systrace是sdk的一个命令,它是用python语言写的,当时用的是python2.7,但是后来python更新了3.0 谷歌却没有更新这个命令,导致我们现在要使用systrace命令,只能用python的2.7版本,正常情况下,用2.7的最新版2.7.16就行了,官网有下载的。
那么systrace命令在哪里?
前提
要使用它,首先我们要安装好python2.7.16,然后配置环境变量,直到我们能够正常使用python命令(这个没必要详述吧,囧- -!,但是我还是给出本人验证过的攻略地址:https://www.jianshu.com/p/e73768e66b8d).
正戏
systrace是我们用来抓取一段时间之内的android设备上的数据指标的工具,我理解为: 设备运行日志,只不过这不是文本日志,而是一个html文件,需要使用谷歌浏览器的 chrome://tracing/插件打开。具体步骤如下:
1、打开CMD,进入systrace目录:
2、输入 python systrace.py -b 32768 -t 5 -o mytrace.html wm gfx input view sched freq
,然后回车
解释一下这一串命令(本文不做systrace命令的详解,这些东西都是死命令,百度即可
):
python
将要执行python脚本systrace.py
脚本名称-b
设置缓存区大小-t
抓取5秒日志-o
mytrace.html 输出到这个文件内wm
WindowManager 日志内包含windowManager信息gfx
Graphics 日志中包含图形绘制的信息input
Input 日志中包含设备输入的信息view
View System 日志中包含View系统的信息sched
CPU Scheduling 日志中包含CPU调度信息freq
日志中包含CPU频率信息
这里有个坑:
在某些真机上,比如
vivo X7
,它会生成html
文件失败,莫名其妙,我换成模拟器,就好了,尚未试验其它真机机型。
我使用网易mumu模拟器做实验的时候,得到如下结果:
3、得到文件之后,打开谷歌浏览器:在地址栏输入 chrome://tracing/
然后load刚才的文件:( 或者你双击该html文件)
4、这里我们得到了非常多的性能指标,包括上图中红色字体标记的CPU用量,多核CPU调度情况,UI主线程,渲染线程等,但是我们应用层开发,解决的主要是app卡顿问题,一般只需要 去关注 **UI主线程的掉帧情况
**即可. 按照下图:
详解一下这个带圈的F
:
- 整个坐标,横轴为时间,从左到右时间刻度增加,代表各项指标随着时间的变化
带圈的F
: 有绿色,黄色和红色。其中绿色表示绘制正常,无需我们去关心,需要关注的是 黄色和红色,特别是红色。- 鼠标点击其中一个红色的F,然后按键盘
G
键,就会出现红色的竖线
,每两根红线之间代表一帧的时长(大部分手机的屏幕刷新频率还是60帧,所以每次绘制大概是16.67MS
),这个F之所以是红色,是因为这一次的UI绘制时长远远超过了1帧,如果UI在1帧时间之内无法完成,便会造成掉帧,一旦掉帧,在用户的感知下,就是卡顿.- 看下图:
使用鼠标拖拽,可以通过图形界面看到这一次绘制所花费的时长:为116.868ms
- 在下面的Alert栏中发现了疑似
掉帧
元凶
这里反映出,是我们的bitmap
图上传导致了掉帧。
我们继续把下面两个箭头展开,能够看到:
这里的英文描述,则是 谷歌工程师给我们的建议.我来大概翻译一下这段话:
第一段的
description
意思是:修改/新绘制的位图必须上传到GPU。因为如果上传的总像素量很大,这是很昂贵的,所以每帧减少这个动画/上下文中位图的波动量。
第二段
description
的意思是:生成这个帧的工作被重新调度了几毫秒,这是jank的功劳。确保UI线程上的代码不会阻塞其他线程上的工作,并且后台线程(例如网络或位图加载)在android.os上运行。进程#THREAD_PRIORITY_BACKGROUND或更低,因此它们不太可能中断UI线程。这些后台线程应该在内核进程的调度部分以130或更高的优先级出现。
总的来说,就是
Bitmap的使用不当导致掉帧
,解决方法大概是:bitmap太大了 要裁剪成合适的大小 或者在背景线程去加载
至于更加具体的其他掉帧情况的解决方法,就要根据具体遇到的情况去查资料了。
关于Trace.beginSection 和 Trace.endSection
这两个api是androidSdk自带的,作用是给systrace加上tag,加了tag,就会在systrace图形上反映出我们这两个api之间囊括的一段代码的执行情况。
简单来说,就是你在 一段代码的前后,加上 Trace.beginSection 和 Trace.endSection ,像这样:
那么,你在 systrace图形上就会发现这个。
可见,我们代码的执行耗时等情况可以 反映在systrace
图形上,点击上面红框的区域,就会在systrace
界面底部发现:
如果加了tag的代码的执行耗时超过了一帧时长(16.67MS),则说明这一段代码造成了UI主线程掉帧,用户就有可能感觉到卡顿。
这里有个坑
如果你上面加了trace.beginSection和endSection,你在图形中还是没有看到 你自己设置的tag,那么检查一下你的 systrace命令,是不是没有加 -a [app包名]
做个结论
上述例子,我使用的是app冷启动时抓的systrace,所以这里的掉帧,就是反映出冷启动过程中代码写的有问题。注意,抓systrace的时间不要太长,必须在systrace开始执行之后再操作app。
在发现掉帧的情况之后,看alert就能看出谷歌给我们的app优化方向建议,虽然还没有完全解决问题,但是至少确定了一个大方向,知道了大概哪一段代码出了问题。
TraceView
在app代码中加入 Debug.startMethodTracing("/sdCard/zhouzhou");
和Debug.stopMethodTracing();
然后运行app,确保能够执行上面两个代码包含的代码片段 。比如像这样:
坑坑
上面的代码,如果你加了之后运行直接抛了异常,检查一下你有没有加这个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
作者2013年从java开发,转做Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。
参与过不少面试,也当面试官 面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
我整理了一份阿里P7级别的最系统的Android开发主流技术,特别适合有3-5年以上经验的小伙伴深入学习提升。
主要包括阿里,以及字节跳动,腾讯,华为,小米,等一线互联网公司主流架构技术。如果你想深入系统学习Android开发,成为一名合格的高级工程师,可以收藏一下这些Android进阶技术选型
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言
高级UI与自定义view;
自定义view,Android开发的基本功。
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
NDK开发;
未来的方向,高薪必会。
前沿技术;
组件化,热升级,热修复,框架设计
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多,CodeChina上可见;
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多,CodeChina上可见;
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!