背景

最近产品以及测试大佬反应快搜桌面进入搜索页面跳转较为缓慢,影响体验,为了优化这个问题,特地学习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,一步步下去,最后定位到如下的位置:

可以看到是KeybordLayout中initView()方法,继续如图:
可以看到有些函数被重复调用了多次,接下来就是分析优化这个方法了,先看下LauncherSearchActvity的界面:
左边的区域是KeybordLayout在initView()进行键码的初始化如下:
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 简单使用相关推荐

  1. Android 性能优化工具

    Android 性能优化工具 这段时间总结了一些常用的性能优化工具,当然这些并没有包含全部的工具,下面稍微对这些工具做个简单的总结: 1.应用codeReview工具 StrictMode 检测应用主 ...

  2. 正确使用 Android 性能分析工具——TraceView

    前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看不懂T ...

  3. 正确使用Android性能分析工具——TraceView

    原址 前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看 ...

  4. Android 系统性能优化(28)---Android 性能优化工具集合

    磁盘 文件读写:每次打开.关闭或者读写文件,操作系统都需要经过从用户态转换为内核态的切换,这种状态的切换本身是很消耗性能的,所以为了提高文件的读写效率,就需要尽量减少用户态和内核态的切换.使用缓存可以 ...

  5. Android 性能优化之TraceView的使用

    原址 TraceView简介 工欲善其事,必先利其器.要想分析Android的性能问题,比如卡顿了之类的,那么就必需掌握TraceView工具的使用. TraceView 是 Android SDK ...

  6. Android性能优化工具

    Systrace是Android4.1中新增的性能数据采样和分析工具.它可帮助开发者收集Android关键子系统(如surfaceflinger.WindowManagerService等Framew ...

  7. android核心技术之性能分析工具TraceView

    前面的话 有一次,被一个高大上的公司面试问到TraceView是做什么的,不知道,于是被人鄙视了.当时觉得别人好高大上啊,这么牛的东西都知道,而我只是听过这个名字,完全不清楚是个什么东东,果然是好公司 ...

  8. Android 性能优化(五)ANR 秒变大神

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

  9. 百度App Android启动性能优化-工具篇

    一.前言 启动性能是APP的极为重要的一环,启动阶段出现卡顿.黑屏问题,会影响用户体验,导致用户流失.百度APP在一些比较低端的机器上也有类似启动性能问题,为保留存,需要对启动流程做深入优化.现有的性 ...

最新文章

  1. 互联网协议 — TCP — 重传机制(可靠传输保障)
  2. react 调用组件方法_React源码分析1 — 组件和对象的创建(createClass,createElement)...
  3. MySQL——单表查询练习:彩票数据核对
  4. 混合云数据中心运维的管理
  5. Atom + Texlive 配置
  6. 2019.6.18 校内测试 分析+题解
  7. [渝粤教育] 中国地质大学 C语言程序设计(新) 复习题
  8. android 服务端 漏洞,安卓漏洞 CVE 2017-13287 复现详解-
  9. c3p0依赖导入失败问题
  10. TUN/TAP设备浅析(一) -- 原理浅析
  11. andorid自定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
  12. linux系统系统安装,深度linux操作系统安装图文教程
  13. mysql 表名 字段名_MySQL 查询所有数据库名和表名及字段名
  14. 【生物信息】影像组学入门实践成长营(14天)
  15. 打CodeForces时一款好用的vscode插件,如何使用 如何更好地使用
  16. c语言中汉字编码,【C语言学习】C语言汉字编码。。。C语言中汉字的输入
  17. Delphi 用IdFtp控件实现ftp的全目录下载
  18. 创新的边界——记MAD Catz的倒闭
  19. 模拟SPI进行TF卡操作+Fatfs文件系统移植
  20. 【NOIP2017】Day1

热门文章

  1. 差点无缘Offer!java开发和运行环境实验报告
  2. css光盘转动,CSS 实现加载动画之五-光盘旋转
  3. mysql 独占查询,MySql历史与架构
  4. js实现表格的行删除和增加_vue小demo之实现表格的增加和删除
  5. php模板怎么导入数据类型,smarty模板引擎之分配数据类型,smarty模板数据类型_PHP教程...
  6. java串口设备中断_利用DMA双缓冲或半完成中断实现串口不定长数据的接收
  7. 学会java要多久_多长时间可以学会Java?
  8. c# 溢出抛异常_C#中的int是否没有溢出异常?
  9. 比特币的服务器作用,比特币白皮书解读-时间戳服务器
  10. matlab 运行 释放内存,怎么能释放已经使用的内存