`
maoxy
  • 浏览: 141612 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Android* 应用性能调试(转载)

阅读更多

概述

创造愉快用户体验的关键是开发响应快捷的应用。借助Android* 软件开发套件(SDK)提供的组件,性能问题调试任务因为简单易用的性能分析工具而变得更简单了。在这篇文章中,我们将认识一些不同的工具,它们可排除故障和调试性能问题或小幅度提升已完成应用的性能。我们不会说得太细,只会概括介绍如何针对您的应用使用这些工具。

我们将在Eclipse 中展示这些工具;您可以根据“ADT Plugin for Eclipse* (面向 Eclipse 的 ADT 插件)”一文中的说明来安装ADT插件。 

DDMS

DDMS是一款Google* 提供的应用,可作为独立的工具运行,也可通过ADT Eclipse* 插件集成到Eclipse* 中。它提供了强大的特性集合,能帮助您快速了解应用的运行状况。

线程更新

DDMS中的线程监控和评测浏览对于管理大量线程的应用很有用。要启用,点击 Update Threads(更新线程)图标即可开始。



图 1

这使下面的窗口会显示面向选中VM进程的所有线程的名称和其他细节。



图 2

utime和stime代表了线程在瞬间运行用户代码(utime)和系统代码(STIME)所花的总时间。一瞬间的时间是由系统定义的,但通常为10毫秒。星号表示守护线程;native状态表示线程正执行原生代码。仔细观察上述样本数据,很明显,除了应用主线程花了大量时间外,运行GC也花了挺多的时间。仔细观察应用如何处理对象创建可能有助于提高性能。

堆工具

堆查看

点击Update Heap(更新堆)按钮,获得有关选定虚拟机中堆分配的信息。



图 3



图 4

点击"Cause GC"开始.堆的详细信息被显示出来,并附有针对特定分配类型的分配大小图示。如果您有分配泄漏,这可能是一个很好的检查点,通过观看Heap Size(堆大小)的总体趋势,确保在应用运行期间它不会一直变大。

Allocation Tracker(分配跟踪器)

Allocation Tracker(分配跟踪器)视图中显示了有关分配的更深层细节。点击“Start Tracking(开始跟踪)”,在应用中执行某个操作,然后点击“Get Allocations(获得分配)”。



图 5

所示列表按分配排序,首先显示最新的分配。选中它可看到一个关于分配如何创建的堆栈轨迹(stack trace)。

仔细查看分配细节,下面的代码看起来有改进的空间:

dataStr += String.format(" Std. Dev.: %.3f, %.3f, %.3f\n", devX, devY, devZ);

上例可简单重构为下面的代码,节省构造临时char[]的开销。.

dataStrBuilder.append(String.format(" Std. Dev.: %.3f, %.3f, %.3f\n", devX, devY, devZ));

Method Profiling(方法分析)

Method Profiling(方法分析)是DDMS的一款工具,对于快速概览应用中时间的消耗分布非常有用,也可用于时间关键型函数的详细查看。



图 6

在应用运行并执行某个有趣的任务时,如果您想获得更多有关该任务的性能数据,点击“Start Method Profiling(开始方法分析)”。分析器只收集少量数据(没见过超过2或3秒),所以,几分钟后再次单击该图标以停止收集。从DDMS中激活方法分析器可使工具自动使用内部存储来存储分析结果,当捕捉完成后,将它们发送回主机,作进一步分析。

IDE将自动启动Traceview窗口,帮助您在IDE(图7)中分析结果。



图 7

解析结果是最有趣的部分。单击底部窗格中的方法调用可创建一个层级结构,为您显示目前的方法——先是调用该方法的母方法,然后是从选定方法中调用的子方法。

在本例被测应用中,我选中了onSensorChanged方法。当您注册接收来自传感器类型的通知时,这种方法便是通过SensorManager API调用的方法。这里的调用方法是handleMessage,它来自操作系统,所以由此开始我的实现方法是一个不错的选择。子方法根据 “总计”所花的时间百分比排序。这里的“总计”表示在该方法及该方法调用的所有子方法内所花费的时间。因此,对于onSensorChanged调用,超过70%的时间花在了calcStandardDeviation和averageSamples上。我期望该调用多花一些时间来计算标准偏差,而不是仅仅将样本平均。所以利用这则新信息,我能更加深入地查看我的实施并发现代码优化点。

想详细了解Traceview,请参考“利用Traceview与dmtracedump进行分析(Profiling with Traceview and dmtracedump)”。

分析API

为获得有着更高精度的的方法分析细节,调用可在代码中进行以启动和停止分析。您需要在设备中加载一个SD卡来使用此方法。在下面的例子中,我们添加hook(钩子)以更好地了解传感器处理代码:

  1. private static boolean doOnce = true;  
  2.   
  3. @Override  
  4. public void onSensorChanged(SensorEvent event) {  
  5.       
  6.     if ( doOnce ) {  
  7.         android.os.Debug.startMethodTracing();  
  8.     }  
  9.       
  10.     Code under test…  
  11.   
  12.     if ( doOnce ){  
  13.         android.os.Debug.stopMethodTracing();  
  14.         doOnce = false;  
  15.     }  
  16. }  
跟踪文件默认为:/ mnt / sdcard/dmtrace.trace,可通过下面的命令从设备中提取出来:

adb pull /mnt/sdcard/dmtrace.trace.

运行独立的Traceview工具:“traceview C:\dmtrace.trace”,会打开一个用户界面,类似于嵌入到Eclipse中的用户界面。

布局用户界面工具

layoutopt(布局选择)

每当要调用某应用结束时,我就希望在活动的用户界面布局中获得简单的性能增益。 layoutopt这一工具会分析您的布局文件,并指出潜在的性能问题。在这篇博客和参考文件会谈到该问题,让我们快速浏览该如何使用这一工具吧。命令行用法如下:

layoutopt.bat C:\Projects\workspace\DeviceInformation\res

注:我把Android* SDK工具目录放在我的路径中。它看起来也像一款工具,只在您详细说明要分析目录的完整路径时才可用。

输出示例:

C:\Projects\workspace\DeviceInformation\res\drawable\btn_notification_ic_example.xml
C:\Projects\workspace\DeviceInformation\res\drawable\picture_frame.xml
C:\Projects\workspace\DeviceInformation\res\layout\action_bar_custom.xml
23:23 This TextView layout or its LinearLayout parent is useless
C:\Projects\workspace\DeviceInformation\res\layout\content_applicationinfo_main.xml
16:19 This LinearLayout layout or its LinearLayout parent is useless
C:\Projects\workspace\DeviceInformation\res\layout\content_benchmark_main.xml
C:\Projects\workspace\DeviceInformation\res\layout\content_main.xml
C:\Projects\workspace\DeviceInformation\res\layout\content_sensorinfo_main.xml
17:20 This LinearLayout layout or its LinearLayout parent is useless
X:Y是与问题对应的XML标记的开始行和结束行。上面指出的多余布局增加了活动的整体加载时间,可用于方便地提升您的活动加载速度。

Hierarchy Viewer(层级查看器)

性能问题调试中另一款有用工具就是Hierarchy Viewer (层级查看器)工具。此应用只能连接到Android* 操作系统的开发人员版本中,所以在不用开发设备情况下,使用它的最简单的方法就是利用模拟器。通过命令行运行该工具:

hierarchyviewer

结论

希望我已为您的应用性能提升需要提供了一些新的工具与知识。除了使用这些工具来发现您在哪些方面可以获得增益外,很多性能改进可在代码级别实现。您可以在“Designing for Performance”(性能设计)一文中更多了解有关常见性能编码技术。

以下文章提供了更深入介绍和其他技巧:

Designing for Responsiveness(响应性设计)

Windows* Background & UI Speed(Windows背景和用户界面加速)

1 http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/int_eclipse.htm
分享到:
评论

相关推荐

    Android离线webview调试工具,开发H5混合应用必备

    在Android平台上,开发混合应用程序(Hybrid App)时,经常需要用到WebView来加载和展示H5内容。然而,对于H5页面的调试工作,开发者通常依赖于Chrome浏览器的开发者工具(Chrome DevTools),其中的`chrome://...

    Android应用源码之程序调试技术学习.zip

    在Android应用开发中,程序调试是一项至关重要的技能,它能帮助开发者识别并修复代码中的错误,提高应用的质量和性能。本资源"Android应用源码之程序调试技术学习.zip"提供了深入学习这一技术的实例和指南。以下是...

    安卓Android串口调试助手

    6. **应用场景**:Android串口调试助手广泛应用于嵌入式系统开发、智能硬件调试、物联网设备测试等场合。例如,它可以用来控制和读取Arduino、Raspberry Pi等开发板的状态,或者与各类传感器、模块进行通信。 通过...

    Android串口调试助手源码

    10. **测试与调试**:为了确保应用的功能完善和性能稳定,开发者通常会进行单元测试和集成测试。Android Studio内置的JUnit和 Espresso等测试框架可以帮助开发者编写和运行测试用例。 通过深入学习和理解这份源码,...

    Android中的反调试代码

    在Android应用开发中,反调试技术是保护应用安全的重要手段之一。它主要用于防止恶意的逆向工程分析,保护代码不被篡改或盗用。本文将深入探讨Android应用中的反调试策略及其实施方法。 首先,我们需要理解调试的...

    Expo 安卓调试程序apk

    总的来说,Expo为React Native的Android调试提供了极大的便利,无论是通过Expo客户端的实时预览、远程JavaScript调试,还是生成调试Apk在设备上独立运行,都能帮助开发者高效地解决问题和优化应用。掌握这些调试技巧...

    AndroidStudio实战快速高效地构建Android应用 AndroidStudio 高清完整带目录书签 PDF AndroidStudio实战

    5. **调试技巧**:讲解如何使用Android Studio的调试工具进行代码调试,包括断点、步进执行、变量观察以及性能分析。 6. **测试策略**:涵盖单元测试、集成测试、UI测试和性能测试,介绍Espresso和JUnit等测试框架...

    Android Socket调试助手教程及源码

    【Android Socket调试助手教程及源码】 Android Socket调试助手是一个实用工具,用于帮助开发者在Android平台上进行网络通信的调试工作,特别是涉及TCP/IP协议的Socket编程。它通过创建和管理Socket连接,允许...

    Android应用源码之14.程序调试技术学习.zip

    在Android应用开发中,程序调试是一项至关重要的技能,它能帮助开发者识别并修复代码中的错误,提高应用的稳定性和性能。本资料包“Android应用源码之14.程序调试技术学习”聚焦于这一主题,提供了丰富的源码实例,...

    android下的gdb调试

    在Android平台上,GDB(GNU Debugger)是一种强大的调试工具,用于检查和调试应用程序的源代码。这个主题主要涉及两个关键概念:源码调试和使用工具。让我们深入探讨这两个方面。 首先,源码调试是开发过程中的重要...

    androidStudio无线连接真机调试应用

    除了基本的无线调试,Android Studio还支持其他高级功能,如性能分析、内存检测等。这些工具可以帮助开发者更有效地定位和解决问题,提升应用的质量和性能。 总的来说,无线调试是Android Studio提高开发者效率的一...

    《android系统应用开发详解》

    书中将介绍如何使用Profiler工具进行性能分析,以及如何通过优化代码、减少资源消耗来提升应用性能。 7. **最新版本特性**:随着Android系统的迭代更新,新版本会引入许多新的特性和API。本书会涉及最新的Android...

    网页真机调试DEMO(Android)

    网页真机调试DEMO(Android)是一个专门...综上所述,"网页真机调试DEMO(Android)"涵盖了前端开发、网络通信、Android设备特性和调试技术等多个方面的知识,对于提升移动Web应用的开发质量和效率有着重要的实践意义。

    Android移动性能实战试读文章

    试读文章可能包含单元测试、集成测试、压力测试的方法,以及使用Android Profiler进行性能调试的技巧。 虽然试读版只有100多页,但它为Android开发者提供了一个宝贵的起点,引导他们深入学习和实践性能优化技术。...

    在Eclipse上调试Android应用程序

    通过熟练掌握这些调试技巧,开发者可以有效地定位和解决问题,提高Android应用的稳定性和性能。在Eclipse中调试Android应用虽然与VC有所不同,但熟悉了Eclipse的调试工具后,你会发现它同样强大而高效。记得经常实践...

    Android 设备串口调试助手,亲验Android10可用

    这个工具可能提供了查看日志、发送命令、读取设备状态等多种功能,帮助开发者调试底层系统、分析性能或者解决应用程序的问题。 在Android 10中,系统对安全性和隐私保护进行了强化,因此在进行串口调试时,开发者...

    DebugController,Android应用程序调试器.zip

    4. **性能分析**:监控内存使用、CPU占用、帧率等性能指标,辅助优化应用性能。 5. **自定义扩展**:通过插件化机制,开发者可以添加自定义的调试模块,如文件系统浏览、本地存储查看等。 总之,DebugController是...

    Android环境搭建与代码调试

    7. **性能优化**: Android Studio的Profiler工具集提供了CPU、内存、网络等性能监控,帮助优化应用性能。 总结,Android环境搭建与代码调试是Android开发的基础。正确配置开发环境,熟练运用调试工具,能有效提高...

    BeeFramework_Android, 极简化的Android App开发框架和App内调试工具.zip

    **BeeFramework_Android** 是一个专为简化Android应用程序开发设计的开源框架,它强调了高效、简洁的编码方式,并内置了强大的App内调试工具,旨在帮助开发者快速构建功能丰富的移动应用。通过这个框架,开发者可以...

    Android应用源码之14.程序调试技术学习-IT计算机-毕业设计.zip

    在Android应用开发中,程序调试是一项至关重要的技能,它能帮助开发者找到并修复代码中的错误,提高应用的质量和性能。本资源"Android应用源码之14.程序调试技术学习"是一个专门针对这一主题的实践教程,适用于进行...

Global site tag (gtag.js) - Google Analytics