Android 性能优化工具 TraceView 简单使用
背景
最近产品以及测试大佬反应快搜桌面进入搜索页面跳转较为缓慢,影响体验,为了优化这个问题,特地学习Android 性能优化工具 TraceView的 简单使用,这才有了本文。
正文
如下图打开android device monitor ,打开有点慢,请耐心等待:
可能有些同学会打不开,出现如下的错误:
重装一遍jdk,配好环境变量一般就没有问题了。android device monitor打开之后如图:
可以看到TraceView 集成了很多小工具,图上标红的1是个截取设备当前屏幕的工具,作为和测试后台交(si)流(bi)的神器,能做到有图有真相;图上标红的2由于展示当前页面视图层级结构,如下图:
可以看到右边上半部分可以很清晰看到当前页面视图的结构,下半部分显示的是选择的视图的一些信息,如位置信息等,这个工具的应用场景还是很广泛的,比如产品大佬叫你改一个view的文本,有了这个工具你可以很快定位到要改的是哪个,上图左边还有好多小工具,这些不是本次的重点,有机会再说,不得不说一句,Google 大法好!!
言归正传,选中你要分析的进程,如图:
红色1表示的位置由原来的灰色不可用的状态变为可用状态,敲黑板啦,重点来了。这个按钮叫 start method profiling(开始方法分析),点击之后如图:
点击OK,会对接下来的操作进行跟踪分析,这里我点击了跳转搜索页面的操作,然后在点击刚刚那个按钮,注意到按钮变成了 stop method profiling(停止方法分析),稍等一下就有分析结果视图如下:
先简单介绍下这个视图,红色1主要表示当前选中方法调用的线程信息,红色2表示的的是时间线,当你点击红色3区域的时候,时间线视图会有相应的反馈,出现一个U型闪动,U型宽度就是方法的执行时间,可以将借助鼠标测量耗时,如图先放到起点:
注意红线部分表示当前时间,再把鼠标放到U型的结束位置,如下图:
两者相减就能知道方法耗时,其实这个功能有点鸡肋,一般不用,接下来我会介绍红色3区域的功能,更加方便:
可以看到这是个表格,代表的含义如下:
列名 | 含义 |
---|---|
Name | 该线程运行过程中所调用的函数名 |
Incl Cpu Time | 某函数占用的CPU时间,包含内部调用其它函数的CPU时间 |
Excl Cpu Time | 某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间 |
Incl Real Time | 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间 |
Excl Real Time | 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间 |
Call+Recur Calls/Total | 某函数被调用次数以及递归调用占总调用次数的百分比 |
Cpu Time/Call | 某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间 |
Real Time/Call | 同CPU Time/Call类似,只不过统计单位换成了真实时间 |
随便点击一个函数,Parent表示调用该方法的方法,Children表示该方法调用的方法 ,如下:
可以看到LauncherSearchActvity的oncreate方法耗时1006.735这个很不正常,再找到Children里面耗时最多的setContenView,一步步下去,最后定位到如下的位置:
for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {GonTextView mButton = new GonTextView(getContext());mButton.setFocusable(true);mButton.setGravity(Gravity.CENTER);if (j == 5) {mButton.setOnKeyListener(this);mButton.setTag(RIGHT_ROW_TAG);} else if (j == 0) {mButton.setId(DEFAULT_FOCUS_VIEW_ID);}mButton.getPaint().setFakeBoldText(true);mButton.setText(text_str[i][j]);ImageUtils.setBackground(mButton, R.drawable.sel_search_keyboard_item_solid);mButton.setTextColor(ResUtil.getColorList(isKeyboardNum(text_str[i][j]) ? R.color.sel_color_search_keyboard_item_123 : R.color.sel_color_search_keyboard_item_abc));keyboardAcherView.addView(mButton);//adaptermButton.setGonTextSize(38);mButton.setGonSize(70, 70);mButton.setGonMargin(j * (24 + 70), i * (24 + 70), 0, 0);// gain defualt focus itemif (i == 0 && j == 0) {mButton.requestFocus();}mButton.setOnClickListener(v -> editText.append(((TextView) v).getText().toString()));}
}复制代码
可以看到36次循环,所以出现了上上张图的Call+Recur Calls/Total中的值是36/36,这边可以简单优化下,将键码GonTextView 放到一个集合里面,这步的操作放在子线程,然后在主线程遍历,addView()就好了,代码如下:
Observable.create((ObservableOnSubscribe<ArrayList<ViewWrapper>>) e -> {ArrayList<ViewWrapper> gonTextViews = initKeys();e.onNext(gonTextViews);e.onComplete();}).subscribeOn(RxCompat.getSchedulerOnDb()).observeOn(RxCompat.getSchedulerOnMain()).subscribe(new RxCompatObserver<ArrayList<ViewWrapper>>() {@Overridepublic void onSubscribeCompat(Disposable d) {}@Overridepublic void onNextCompat(ArrayList<ViewWrapper> gonTextViews) {GonRelativeLayout keyboardAcherView = (GonRelativeLayout) findViewById(R.id.ll_keys);keyboardAcherView.removeAllViews();for (ViewWrapper viewWrapper : gonTextViews) {keyboardAcherView.addView(viewWrapper.gonTextView);
// keyboardAcherView.reqLa//adapterviewWrapper.gonTextView.setGonTextSize(38);viewWrapper.gonTextView.setGonSize(70, 70);viewWrapper.gonTextView.setGonMargin(viewWrapper.x * (24 + 70), viewWrapper.y * (24 + 70), 0, 0);if (viewWrapper.x == 0 && viewWrapper.y == 0) {viewWrapper.gonTextView.requestFocus();}}setVisibility(VISIBLE);if (SpUtil.getBoolean(SpUtil.SpKey.IS_INPUT_METHOD, false)) {postDelayed(() -> btnInputMethod.performClick(), 50);}}});
复制代码
private ArrayList<ViewWrapper> initKeys() {ArrayList<ViewWrapper> gonTextViews = new ArrayList<>(36);String[][] text_str = new String[][]{{"A", "B", "C", "D", "E", "F"},{"G", "H", "I", "J", "K", "L"},{"M", "N", "O", "P", "Q", "R"},{"S", "T", "U", "V", "W", "X"},{"Y", "Z", "1", "2", "3", "4"},{"5", "6", "7", "8", "9", "0"}};for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {GonTextView mButton = new GonTextView(getContext());mButton.setFocusable(true);mButton.setGravity(Gravity.CENTER);if (j == 5) {mButton.setOnKeyListener(this);mButton.setTag(RIGHT_ROW_TAG);} else if (j == 0) {mButton.setId(DEFAULT_FOCUS_VIEW_ID);}mButton.getPaint().setFakeBoldText(true);mButton.setText(text_str[i][j]);ImageUtils.setBackground(mButton, R.drawable.sel_search_keyboard_item_solid);mButton.setTextColor(ResUtil.getColorList(isKeyboardNum(text_str[i][j]) ? R.color.sel_color_search_keyboard_item_123 : R.color.sel_color_search_keyboard_item_abc));gonTextViews.add(new ViewWrapper(i,j,mButton));mButton.setOnClickListener(v -> editText.append(((TextView) v).getText().toString()));}}return gonTextViews;
}复制代码
结果如图:
从原来的1000多毫秒到不到300毫秒,提升还是很大的!
码字不易,期待各位的赞赏!!!
Android 性能优化工具 TraceView 简单使用相关推荐
- Android 性能优化工具
Android 性能优化工具 这段时间总结了一些常用的性能优化工具,当然这些并没有包含全部的工具,下面稍微对这些工具做个简单的总结: 1.应用codeReview工具 StrictMode 检测应用主 ...
- 正确使用 Android 性能分析工具——TraceView
前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看不懂T ...
- 正确使用Android性能分析工具——TraceView
原址 前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看 ...
- Android 系统性能优化(28)---Android 性能优化工具集合
磁盘 文件读写:每次打开.关闭或者读写文件,操作系统都需要经过从用户态转换为内核态的切换,这种状态的切换本身是很消耗性能的,所以为了提高文件的读写效率,就需要尽量减少用户态和内核态的切换.使用缓存可以 ...
- Android 性能优化之TraceView的使用
原址 TraceView简介 工欲善其事,必先利其器.要想分析Android的性能问题,比如卡顿了之类的,那么就必需掌握TraceView工具的使用. TraceView 是 Android SDK ...
- Android性能优化工具
Systrace是Android4.1中新增的性能数据采样和分析工具.它可帮助开发者收集Android关键子系统(如surfaceflinger.WindowManagerService等Framew ...
- android核心技术之性能分析工具TraceView
前面的话 有一次,被一个高大上的公司面试问到TraceView是做什么的,不知道,于是被人鄙视了.当时觉得别人好高大上啊,这么牛的东西都知道,而我只是听过这个名字,完全不清楚是个什么东东,果然是好公司 ...
- Android 性能优化(五)ANR 秒变大神
Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...
- 百度App Android启动性能优化-工具篇
一.前言 启动性能是APP的极为重要的一环,启动阶段出现卡顿.黑屏问题,会影响用户体验,导致用户流失.百度APP在一些比较低端的机器上也有类似启动性能问题,为保留存,需要对启动流程做深入优化.现有的性 ...
最新文章
- 互联网协议 — TCP — 重传机制(可靠传输保障)
- react 调用组件方法_React源码分析1 — 组件和对象的创建(createClass,createElement)...
- MySQL——单表查询练习:彩票数据核对
- 混合云数据中心运维的管理
- Atom + Texlive 配置
- 2019.6.18 校内测试 分析+题解
- [渝粤教育] 中国地质大学 C语言程序设计(新) 复习题
- android 服务端 漏洞,安卓漏洞 CVE 2017-13287 复现详解-
- c3p0依赖导入失败问题
- TUN/TAP设备浅析(一) -- 原理浅析
- andorid自定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
- linux系统系统安装,深度linux操作系统安装图文教程
- mysql 表名 字段名_MySQL 查询所有数据库名和表名及字段名
- 【生物信息】影像组学入门实践成长营(14天)
- 打CodeForces时一款好用的vscode插件,如何使用 如何更好地使用
- c语言中汉字编码,【C语言学习】C语言汉字编码。。。C语言中汉字的输入
- Delphi 用IdFtp控件实现ftp的全目录下载
- 创新的边界——记MAD Catz的倒闭
- 模拟SPI进行TF卡操作+Fatfs文件系统移植
- 【NOIP2017】Day1
热门文章
- 差点无缘Offer!java开发和运行环境实验报告
- css光盘转动,CSS 实现加载动画之五-光盘旋转
- mysql 独占查询,MySql历史与架构
- js实现表格的行删除和增加_vue小demo之实现表格的增加和删除
- php模板怎么导入数据类型,smarty模板引擎之分配数据类型,smarty模板数据类型_PHP教程...
- java串口设备中断_利用DMA双缓冲或半完成中断实现串口不定长数据的接收
- 学会java要多久_多长时间可以学会Java?
- c# 溢出抛异常_C#中的int是否没有溢出异常?
- 比特币的服务器作用,比特币白皮书解读-时间戳服务器
- matlab 运行 释放内存,怎么能释放已经使用的内存