热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发——利用Systrace工具优化AndroidApp的运行性能

原文地址:http:www.mobile-open.com201585005.html本文主要讲述了如何利用Systrace工具优化你的AndroidAppÿ

原文地址:http://www.mobile-open.com/2015/85005.html


本文主要讲述了如何利用Systrace工具优化你的Android App,了解你的APP各个子系统的运行状况,从本质上提升移动应用的运行速度。现在把Systrace的使用整理出来分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。本文也是Systrace的使用教程,通过认真的阅读本教程,能够掌握Systrace的基本用法。


###信条

  • 用数据说话:在细微的差别面前大部分人无法感知辨别,在每一次优化代码后使用如下将介绍的工具进行检验。
  • 使用低性能机器测试:低性能的机器会更多地暴露问题。
  • 意识到等价交换的思想:所有优良代码之上的优化都是基于等价交换,而这其中基本上都是以空间换时间。

###Systrace

Systrace是大多数开发者不去使用的工具,因为大家不知道如何使用它提供的数据。Systrace 的功能包括跟踪系统的 I/O 操作、内核工作队列、CPU 负载以及 Android 各个子系统的运行状况等。

它有三部分组成:

  • 内核部分:Systrace 利用了Linux Kernel 中的 ftrace 功能。所以,如果要使用 Systrace 的话,必须开启 kernel 中和 ftrace 相关的模块。
  • 数据采集部分:Android 定义了一个 Trace 类。应用程序可利用该类把统计信息输出给 ftrace。同时,Android 还有一个 atrace 程序,它可以从 ftrace 中读取统计信息然后交给数据分析工具来处理。
  • 数据分析工具:Android 提供一个 systrace.py(python脚本文件,位于Android SDK 目录 /tools/systrace 中,其内部将调用 atrace 程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集 ftrace 统计数据并生成一个结果网页文件供用户查看。

Systrace使用方式 有两种:

  • 1.Device Monitor
  • 2.命令行

    $ cd android-sdk/platform-tools/systrace $ python systrace.py --set-tags=gfx,view,wm $ adb shell stop $ adb shell start

ps:先在设备中打开Settings > Developer options > Monitoring > Enable traces。

抓取的信息使用浏览器打开如下:

让你的App飞起来

我们来选取一个Alert来看一下:

让你的App飞起来

可以看到Alert原因是Long View#draw(),下面还会有相关文档链接。选择Frame这一行,就能看到每一帧的渲染,通过不同的颜色发现一些问题,我们来选择红色的一帧:

让你的App飞起来

在底部,有三个Alert信息,打开“Inflation during ListView recycling”:

让你的App飞起来

看这部分耗费的时间,32ms,超过了保证60fps的16ms。再看下面细分每一步耗费的时间,有5个obtainView都消耗了大约 5ms。Description指出了问题所在,没有使用ListView的复用机制造成inflate单个Item成本过高。再看上面的图形部分,它将 所有的东西都可视化,我们放大来看“inflate”:

让你的App飞起来

在选择一帧之后,可以通过“m”键显示具体耗费的时间。可以看到耗费超过19ms渲染这一帧。展开这一帧唯一的一个Alert,看到“Scheduling delay”。选择最长的DrawFrame来看一下:

让你的App飞起来

Wall duration是从时间片的开始到结束。CPU Duration是CPU的实际运行时间。注意这两个时间的巨大差别,来看一下CPU这段时间做了什么:

让你的App飞起来

四个核心都处于忙碌状态,选择一个Thread看它从哪里发起,一个包名为com.udinic.keepbusyapp。原来是其它app的原 因。这种情况通常是暂时的,因为其它app不太可能在后台长时间占用CPU,这些线程可能来自你的App的其它进程,或者是主进程。由于Systrace 是以系统的角度返回一些信息,要进一步获取CPU满负荷运行的原因,我们来使用另一个工具Traceview。

###TraceviewTraceview是一个很好的性能分析工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method:

让你的App飞起来

使用方式同样有两种,Android Device Monitor或者使用代码,参考 这里 .

我们来看一下不同列代表的含义:

  • Name:method的名称,前面有一个和上图对应的颜色标识。
  • Inclusive CPU Time:此方法和子方法调用占用的CPU时间。
  • Exclusive CPU Time:此方法单独调用占用的CPU时间。
  • Inclusive / Exclusive Real Time:从方法开始到结束的时间,类似于“Wall Duration“。
  • Calls+Recursion:调用次数。
  • CPU/Real time per Call:每次调用平均占用的CPU时间。

我打开了一个不能平滑滚动的App,开始跟踪,滚动以下部分,停止跟踪。找到getView()方法,展开:

让你的App飞起来

这个方法调用了12次,每次CPU时间3ms,但是每次调用的真实时间是162ms,绝对有问题!

查看这个方法下地Children,Thread.join()耗费了约98%的inclusive real time。这个方法是用来等待其他线程结束。另一个children是Thread.start(),由此认定getView()方法启动了一个线程并等 待它结束。

但是这个线程在哪?

我们不知道这个getView()中的线程做了什么,因为getView()中没有直接启动它。为了找到它,我查找了Thread.start()方法。最终发现了它:

让你的App飞起来


本文到此结束,需要的朋友可以参考下。希望通过本文能让兄弟们开发的Android应用运行速度达到质的提升。


推荐阅读
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
author-avatar
乳酪杳杳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有