导航:首页 > 操作系统 > android协议分析工具

android协议分析工具

发布时间:2022-05-07 05:45:18

‘壹’ android 手机自动化测试工具有哪几种

Feb 23 2012更新: 还有Sikuli (http://sikuli.org),基于优秀的图像对比库opencv的测试工具,测试脚本使用Python编写,非常强大。如果你的app没有源码,可以选择它;或者你想做系统测试(跨app的测试),也可以选择它。其它的还是用下面说的那些个吧。
我通过其核心包sikuli-script.jar实现了android的sikuli化,暂时不打算开源。其实原理挺简单的,认真看过sikuli源码的应该都能写出来。

看lz的意思应该只是想问应用层的,我来说点应用层的
先说说开源的吧:
Robotium
Monkeyrunner
Robolectric
CTS
还有个新兴的测试工具,以前在GitHub看到,现在找不到了,好像是BDD类型的语法;现在还不成熟。

另外基于web的测试也有基于Selenium Webdriver 的 Android WebDriver:
有两种:
基于Remote Server的:官方提供了java接口的,但是Python版的官方里面却没有。我非常喜欢Python,所以自己实现了并且开源到了GitHub:https://github.com/truebit/AndroidWebDriver4Python 有问题大家可以提到上面

基于Instrumentation的:已经在Android SDK r14里面可以安装了
不开源的就多了,不过我见过的一般是以下几种思路:
1. 基于Android Java Instrumentation框架:
基于Robotium,比如bitbar的产品:http://bitbar.com/procts
基于Instrumentation,那就海了去了,很多公司自家写的工具都基于这个;另外Robotium就是基于这个的
2. 基于Android lib层的各种命令,比如sendevent,getevent, monkey, service这些,然后用各种语言封装

MonkeyRunner还是很有前景的,Google自己弄的。现在最新的dev版本已经有支持UI的id操作的EasyMonkey了。可以git clone git://http://android.kernel.org/platform/sdk.git看看

编辑于 2012-02-23 7 条评论 • 作者保留权利

赞同23反对,不会显示你的姓名
乙醇,打杂的......
落小雪、蒋金龙、Reeta L 等人赞同
appium是最近我关注的一个不错的移动端自动化测试工具,支持android和ios。
放上两段视频。第一段是讲解appium的原理及quick start;第二段讲解了appium的源码结构和具体实现。有兴趣可以看一下,相信应该有收获。

1,appium 原理与quick start

乙醇的appium视频教程之appium入门及原理剖析
http://v.youku.com/v_show/id_XNjQzMjI4NDcy.html?firsttime=2212
2,appium源码解析

乙醇的appium源码解读
http://v.youku.com/v_show/id_XNjQzODIwMzA4.html?firsttime=0

发布于 2013-12-07 5 条评论 • 作者保留权利

赞同25反对,不会显示你的姓名
知乎用户,Coding/Reading/Hiking/Running
知乎用户、曹媛媛、石存沣 等人赞同
1、Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。
2、MonkeyRunner也是Android SDK提供的测试工具。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。缺点是脚本用Python来写,对测试人员来说要求较高,有比较大的学习成本。
3、Instrumentation是早期Google提供的Android自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App。
4、UiAutomator也是Android提供的自动化测试框架,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓去App页面上的控件属性而不看源码)。基于Java,测试代码结构简单、编写容易、学习成本,一次编译,所有设备或模拟器都能运行测试,能跨App(比如:很多App有选择相册、打开相机拍照,这就是跨App测试)。缺点是只支持SDK 16(Android 4.1)及以上,不支持Hybird App、WebApp。
5、Espresso是Google的开源自动化测试框架。相对于Robotium和UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App。配合Android Studio来编写测试的简单例子
6、Selendroid:也是基于Instrumentation的测试框架,可以测试Native App、Hybird App、Web App,但是网上资料较少,社区活跃度也不大。
7、Robotium也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。
8、Athrun是淘宝出的一个移动测试框架/平台,同时支持iOS和Android。Android部分也是基于Instrumentation,在Android原有的类基础上进行了扩展,提供一整套面向对象的API。这里有详细介绍。
9、Appium是最近比较热门的框架,社区也很活跃。这个框架应该是是功能最强大的,
它的优点:
它的哲理是:
它的设计理念:
相关限制:
总结:
在iOS部分是封装了UIAutomation;Android 4.2以上是用UiAutomator,Android 2.3 ~ 4.1用的是 Instrumentation,也就说Appium同时封装了UiAutomator和Instrumentation。所以Appium拥有了以上几大框架的所有优点:跨App,支持Native App、Hybird App、Web App,还支持N种语言来编写你的测试脚本。
如果你在Windows使用Appium,你没法使用预编译专用于OS X的.app文件,因为Appium依赖OS X专用的库来支持iOS测试,所以在Windows平台你不能测试iOS Apps。这意味着你只能通过在Mac上来运行iOS测试。
Client/Server架构,运行的时候Server端会监听Client端发过来的命令,翻译这些命令发送给移动设备或模拟器,然后移动设备或模拟器做出响应的反应。正是因为这种架构,所以Client可以使用Appium client libraries多种语言的测试脚本,而且Server端完全可以部署在服务器上,甚至云服务器
Session,每个Client连接到Server以后都会有一个Session ID,而且Client发送命令到Server端都需要这个Session ID,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。所以你甚至可以打开N个Session,同时测试不同的设备或模拟器。
Desired Capabilities,其实就是一个键值对,设置一些测试的相关信息来告诉Server端,我们需要测试iOS、还是Android,或者换是WebApp等信息。
Appium Server是Node.js写的,所以可以直接用NPM来进行安装。
Appium Clients,Mac OS和Win下提供GUI,不需要装Node.js,方便测试人员操作。
用Appium自动化测试不需要重新编译App;
支持很多语言来编写测试脚本,Java、Javascript、PHP、Python、C#、Ruby等主流语言;
不需要为了自动化测试来重造轮子,因为扩展了WebDriver。(WebDriver是测试WebApps的一种简单、快速的自动化测试框架,所以有Web自动化测试经验的测试人员可以直接上手);
移动端自动化测试应该是开源的;
开源;
支持Native App、Hybird App、Web App;
支持Android、iOS、Firefox OS;
Server也是跨平台的,你可以使用Mac OS X、Windows或者linux
显示全部

编辑于 2015-03-20 1 条评论 • 作者保留权利

赞同4反对,不会显示你的姓名
知乎用户,hello rabbit
郝思远、man Nor、徐佳琦 等人赞同
当前有很大的趋势是转向移动应用平台,Android 是最广泛使用的移动操作系统,2014 年大约占 80% 以上的市场。在开发 Android 应用的时候要进行测试,现在市场上有大量的测试工具。

本文提到的开源 Android 软件测试工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。

Android Test Kit

Android Test Kit 是一组 Google 开源测试工具,用于 Android 平台,包含 Espresso API 可用于编写简洁可靠的 Android UI 测试。

OSChina URL: Android Test Kit首页、文档和下载

相关资源

* Android application testing with the Android test framework – Tutorial
* Espresso for Android is here!

AndroidJUnit4

AndroidJUnit4 是一个让 JUnit 4 可以直接运行在 Android 设备上的开源命令行工具。

OSChina URL: AndroidJUnit4首页、文档和下载

Appium

Appium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驱动苹果的 UIAutomation 库和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 协议。

Appinm 的 iOS 支持是基于 Dan Cuellar's 的 iOS Auto. Appium 同时绑定了 Selendroid 用于老的 Android 平台测试。

OSChina URL: Appium首页、文档和下载

相关资源

* Appium Tutorial
* Android UI testing with Appium

Calabash-android

calabash-android 是一个基于 Cucumber 的 Android 的功能自动化测试框架。Calabash 允许你写和执行,是开源的自动化移动应用测试工具,支持 Android 和 iOS 原生应用。Calabash 的库允许原生和混合应用的交互测试,交互包括大量的终端用户活动。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 应用和桌面环境的交互跟触摸屏应用的交互是不同的。Calabash 专为触摸屏设备的原生应用提供 APIs。

OSChina URL: calabash-android首页、文档和下载

相关资源

* A better way to test Android applications using Calabash
* Calabash Android: query language basics

Monkey

Monkey 是 Google 开发的 UI/应用测试工具,也是命令行工具,主要针对压力测试。你可以在任意的模拟器示例或者设备上运行。Monkey 发送一个用户事件的 pseudo-random 流给系统,作为你开发应用的压力测试。

OSChina URL: UI/Application Exerciser Monkey

MonkeyTalk

MonkeyTalk 是世界上最强大的移动应用测试工具。MonkeyTalk 自动为 iOS 和 Android 应用进行真实的,功能性交互测试。MonkeyTalk 提供简单的 "smoke tests",复杂数据驱动的测试套件。

MonkeyTalk 支持原生,移动和混合应用,真实设备或者模拟器。MonkeyTalk 使得场景捕获非常容易,可以记录高级别,可读的测试脚本。同样的命令可以用在 iOS 和 Android 应用上。你可以记录一个平台的一个测试,并且可以在另外一个平台回放。MonkeyTalk 支持移动触摸和基于手势交互为主的移动体验。点击,拖拽,移动,甚至是手指绘制也可以被记录和回放。

OSChina URL: MonkeyTalk首页、文档和下载

相关资源

* Using MonkeyTalk in AndroidStudio

NativeDriver

NativeDriver 是 WebDriver API 的实现,是原生应用 UI 驱动,而不是 web 应用。

OSChina URL: NativeDriver首页、文档和下载

Robolectric

Robolectric 是一款Android单元测试框架,使用 Android SDK jar,所以你可以使用测试驱动开发 Android 应用。测试只需几秒就可以在工作站的 JVM 运行。Robolectric 处理视图缩放,资源加载和大量 Android 设备原生的 C 代码实现。

Robolectric 允许你做大部分真实设备上可以做的事情,可以在工作站中运行,也可以在常规的 JVM 持续集成环境运行,不需要通过模拟器。

OSChina URL: Robolectric首页、文档和下载

Additional resources

* Better Android Testing with Robolectric 2.0
Using Robolectric for Android testing – Tutorial

RoboSpock

RoboSpock 是一个开源的 Android 测试框架。提供简单的编写 BDD 行为驱动开发规范的方法,使用Groovy 语音,支持 Google Guice 库。RoboSpock 合并了 Robolectric 和 Spock 的功能。

OSChina URL: RoboSpock首页、文档和下载

相关资源

* RoboSpock – Behavior Driven Development (BDD) for Android

Robotium

Robotium 是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长 按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。

Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测 试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。

OSChina URL: Robotium首页、文档和下载

相关资源

* Robotium – Testing Android User Interface
* Android user interface testing with Robotium – Tutorial

UIAutomator

uiautomator 测试框架提高用户界面(UI)的测试效率,通过自动创建功能 UI 测试示例,可以在一个或者多个设备上运行你的应用。

OSChina URL: uiautomator首页、文档和下载

相关资源

* Automatic Android Testing with UiAutomator

Selendroid

Selendroid 是一个 Android 原生应用的 UI 自动化测试框架。测试使用 Selenium 2 客户端 API 编写。Selendroid 可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。

OSChina URL: Selendroid首页、文档和下载

相关资源

* Mobile Test Automation with Selendroid
* Road to setup Selendroid and create first test script of android application
* Up and running with: Selendroid

一些停止维护的 Android 测试工具

一些几乎没有继续维护的开源 Android 测试工具项目(至少是最近几个月都没有更新的项目)。

Emmagee

Emmagee 是监控指定被测应用在使用过程中占用机器的CPU、内存、流量资源的性能测试小工具。Emmagee 同时还提供非常酷的一些特性,比如定制间隔来收集数据,使用浮动窗口呈现实时进程状态等。

OSChina URL: Emmagee首页、文档和下载

Sirocco

Scirocco(scirocco-webdriver) 是开源的应用自动化测试工具,可以从 Eclipse 访问必要的测试设备。Scirocco 提供自动化的 Android 应用测试功能,代替手工测试。Scirocco 支持谷歌的 NativeDriver,把 AndroidDriver 作为主要的测试库。Scirocco 包括三个部分:NativeDriver,AndroidDriver,scirocco 插件(一个 Eclipse 插件;可以自动执行 scenario 测试和制作测试报告截图)。

OSChina URL: Scirocco首页、文档和下载

via softwaretestingmagazine

内容来源:开源中国社区显示全部

发布于 2015-03-27 添加评论 • 作者保留权利

赞同11反对,不会显示你的姓名
知乎用户,拥抱移动互联网

‘贰’ 如何在Android平台上使用IO分析工具

你好,提问者: js脚本语言中可以post请求: 给你个例子: 123456789101112$.post( _path + "/mobile/cardManager/transactionRecords", //方法的路径 { //下面是参数 "cardno" : cardno, "startDate" : startDate, "endDate" : endDate, "currentPage" : currentPage, },function(data) { //返回的参数 if(data.length!=0){ //存在数据 成功 }else{ //失败 } });}或者用ajax 异步请求: 12345678910 $.ajax({ type:"POST", url:_path + "/mobile/cardManager/transactionRecords?cardno="+cardno+"&startDate="+startDate+"&endDate="+endDate+"¤tPage="+$("#currentPage").val(), dataType:'json', cache : false, beforeSend:function(){ }, success:function(data){ } })如果对你有帮助,望采纳!

‘叁’ 有什么apk分析工具

GDA 呀,不需要安装Java环境就可以用,直接拖拉就可以快速分析,绝对是最快速的apk分析工具,可以直接扫描恶意行为,反编译,修改编辑Android apk文件,还可以mp apk内存。
android-apktool可以把你apk里面的classes.dex转换为jar格式,然后可以使用Java Decompiler 打开这个jar文件,直接可以看到里面class文件反编译的内容。
不过如果之前的jar被混淆过得话,反编译之后的内容可能看起来会比较郁闷。
另外,apk里面也可能包含有NDK开发的.so文件,这个就只能用一个支持arm格式的反汇编器来看反汇编之后的汇编代码了。
以上是网上找的资料,希望能帮助到你。

‘肆’ android studio有哪些性能分析工具

导言:
Android应用在CPU占用,内存消耗方面的性能指标是影响产品质量的重要因素,由于QQ管家,360手机助手等应用都提供直观的内存消耗,流量监控功能,致使用户比以往更加关注软件的性能,并以此进行软件选用的决策。
目前,已经有很多可以监控android app 性能的工具可以供开发人员使用,如:基于Eclipse插件体系的MAT,其通过生成.hprof文件对内存泄露情况进行排查;内存检测工具APT:提供CPU利用率实时曲线图,方便对比测试内存泄露问题[图0-1]

‘伍’ APP的安全漏洞怎么检测,有什么工具可以进行检测

目前我经常用的漏洞检测工具主要就是爱内测,因为爱内测会根据应用特性,对程序机密性会采取不同程度不同方式的检测,检测项目包括代码是否混淆,DEX、so库文件是否保护,程序签名、权限管理是否完整等;组件安全检测主要针对Activity、Broadcast Receiver、Service、WebView、Intent等是否存在漏洞,并给出针对性建议;数据安全会全面检测APP存在的数据泄漏漏洞和输出层、协议层等所有涉及数据安全的漏洞,确保APP里那些可能导致帐号泄露的漏洞被全部检测出。

‘陆’ 做Android手机软件测试需要掌握哪些工具

请注意测试本身不是靠工具的而是靠设计,这是我的理念,所以我一向觉得,很多人认为做测试做的好就是靠掌握一门好的工具,这个观点是不正确的,所以我可以负责任的告诉你,做Android手机需要掌握的不是工具、而是理念、思维、以及框架,总的来说是本质,而工具只是辅助,那么现在我来介绍一些我了解的工具(仅仅是了解,很多没用过)
开源 Android 软件测试工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。
Android Test Kit
Android Test Kit 是一组 Google 开源测试工具,用于 Android 平台,包含 Espresso API 可用于编写简洁可靠的 Android UI 测试。
AndroidJUnit4
AndroidJUnit4 是一个让 JUnit 4 可以直接运行在 Android 设备上的开源命令行工具。
Appium
Appium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驱动苹果的 UIAutomation 库和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 协议。Appinm 的 iOS 支持是基于 Dan Cuellar's 的 iOS Auto. Appium 同时绑定了 Selendroid 用于老的 Android 平台测试。
Calabash-android
calabash-android 是一个基于 Cucumber 的 Android 的功能自动化测试框架。Calabash 允许你写和执行,是开源的自动化移动应用测试工具,支持 Android 和 iOS 原生应用。Calabash 的库允许原生和混合应用的交互测试,交互包括大量的终端用户活动。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 应用和桌面环境的交互跟触摸屏应用的交互是不同的。Calabash 专为触摸屏设备的原生应用提供 APIs。
Monkey
Monkey 是 Google 开发的 UI/应用测试工具,也是命令行工具,主要针对压力测试。你可以在任意的模拟器示例或者设备上运行。Monkey 发送一个用户事件的 pseudo-random 流给系统,作为你开发应用的压力测试。
MonkeyTalk
MonkeyTalk 是世界上最强大的移动应用测试工具。MonkeyTalk 自动为 iOS 和 Android 应用进行真实的,功能性交互测试。MonkeyTalk 提供简单的 "smoke tests",复杂数据驱动的测试套件。MonkeyTalk 支持原生,移动和混合应用,真实设备或者模拟器。MonkeyTalk 使得场景捕获非常容易,可以记录高级别,可读的测试脚本。同样的命令可以用在 iOS 和 Android 应用上。你可以记录一个平台的一个测试,并且可以在另外一个平台回放。MonkeyTalk 支持移动触摸和基于手势交互为主的移动体验。点击,拖拽,移动,甚至是手指绘制也可以被记录和回放。
NativeDriver
NativeDriver 是 WebDriver API 的实现,是原生应用 UI 驱动,而不是 web 应用。
Robolectric
Robolectric 是一款Android单元测试框架,使用 Android SDK jar,所以你可以使用测试驱动开发 Android 应用。测试只需几秒就可以在工作站的 JVM 运行。Robolectric 处理视图缩放,资源加载和大量 Android 设备原生的 C 代码实现。Robolectric 允许你做大部分真实设备上可以做的事情,可以在工作站中运行,也可以在常规的 JVM 持续集成环境运行,不需要通过模拟器。
RoboSpock
RoboSpock 是一个开源的 Android 测试框架。提供简单的编写 BDD 行为驱动开发规范的方法,使用Groovy 语音,支持 Google Guice 库。RoboSpock 合并了 Robolectric 和 Spock 的功能。
Robotium
Robotium 是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长 按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测 试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。
UIAutomator
uiautomator 测试框架提高用户界面(UI)的测试效率,通过自动创建功能 UI 测试示例,可以在一个或者多个设备上运行你的应用。
Selendroid
Selendroid 是一个 Android 原生应用的 UI 自动化测试框架。测试使用 Selenium 2 客户端 API 编写。Selendroid 可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。

‘柒’ 如何实现一个android的log自动化分析工具

首先,让我们看一看AndroidLog的格式。下面这段log是以所谓的long格式打印出来的。从前面Logcat的介绍中可以知道,long格式会把时间,标签等作为单独的一行显示。

[ 12-09 21:39:35.510 396: 416 I/ActivityManager ]

Start procnet.coollet.infzmreader:umengService_v1 for service
net.coollet.infzmreader/com.umeng.message.

UmengService:pid=21745 uid=10039 gids={50039, 3003, 1015,1028}

[ 12-09 21:39:35.518 21745:21745I/dalvikvm ]

Turning on JNI app bug workarounds fortarget SDK version 8...

[ 12-09 21:39:35.611 21745:21745D/AgooService ]

onCreate()

我们以第一行为例:12-09 是日期,21:39:35.510是时间396是进程号,416是线程号;I代表log优先级,ActivityManager是log标签。

在应用开发中,这些信息的作用可能不是很大。但是在系统开发中,这些都是很重要的辅助信息。开发工程师分析的log很多都是由测试工程师抓取的,所以可能有些log根本就不是当时出错的log。如果出现这种情况,无论你怎么分析都不太可能得出正确的结论。如何能最大限度的避免这种情况呢?笔者就要求测试工程师报bug时必须填上bug发生的时间。这样结合log里的时间戳信息就能大致判断是否是发生错误时的log。而且根据测试工程师提供的bug发生时间点,开发工程师可以在长长的log信息中快速的定位错误的位置,缩小分析的范围。

同时我们也要注意,时间信息在log分析中可能被错误的使用。例如:在分析多线程相关的问题时,我们有时需要根据两段不同线程中log语句执行的先后顺序来判断错误发生的原因,但是我们不能以两段log在log文件中出现的先后做为判断的条件,这是因为在小段时间内两个线程输出log的先后是随机的,log打印的先后顺序并不完全等同于执行的顺序。那么我们是否能以log的时间戳来判断呢?同样是不可以,因为这个时间戳实际上是系统打印输出log时的时间,并不是调用log函数时的时间。遇到这种情况唯一的办法是在输出log前,调用系统时间函数获取当时时间,然后再通过log信息打印输出。这样虽然麻烦一点,但是只有这样取得的时间才是可靠的,才能做为我们判断的依据。

另外一种误用log中时间戳的情况是用它来分析程序的性能。一个有多年工作经验的工程师拿着他的性能分析结果给笔者看,但是笔者对这份和实际情况相差很远的报告表示怀疑,于是询问这位工程师是如何得出结论的。他的回答让笔者很惊讶,他计算所采用的数据就是log信息前面的时间戳。前面我们已经讲过,log前面时间戳和调用log函数的时间并不相同,这是由于系统缓冲log信息引起的,而且这两个时间的时间差并不固定。所以用log信息前附带的时间戳来计算两段log间代码的性能会有比较大的误差。正确的方法还是上面提到的:在程序中获取系统时间然后打印输出,利用我们打印的时间来计算所花费的时间。

了解了时间,我们再谈谈进程Id和线程Id,它们也是分析log时很重要的依据。我们看到的log文件,不同进程的log信息实际上是混杂在一起输出的,这给我们分析log带来了很大的麻烦。有时即使是一个函数内的两条相邻的log,也会出现不同进程的log交替输出的情况,也就是A进程的第一条log后面跟着的是B进程的第二条log,对于这样的组合如果不细心分析,就很容易得出错误的结论。这时一定要仔细看log前面的进程Id,把相同Id的log放到一起看。

不同进程的log有这样的问题,不同的线程输出的log当然也存在着相同的问题。Logcat加上-vthread就能打印出线程Id。但是有一点也要引起注意,就是Android的线程Id和我们平时所讲的Linux线程Id并不完全等同。首先,在Android系统中,C++层使用的Linux获取线程Id的函数gettid()是不能得到线程Id的,调用gettid()实际上返回的是进程Id。作为替代,我们可以调用pthread_self()得到一个唯一的值来标示当前的native线程。Android也提供了一个函数androidGetThreaId()来获取线程Id,这个函数实际上就是在调用pthread_self函数。但是在Java层线程Id又是另外一个值,Java层的线程Id是通过调用Thread的getId方法得到的,这个方法的返回值实际上来自Android在每个进程的java层中维护的一个全局变量,所以这个值和C++层所获得的值并不相同。这也是我们分析log时要注意的问题,如果是Java层线程Id,一般值会比较小,几百左右;如果是C++层的线程,值会比较大。在前里面的log样本中,就能很容易的看出,第一条log是Jave层输出的log,第二条是native层输出的。明白了这些,我们在分析log时就不要看见两段log前面的线程Id不相同就得出是两个不同线程log的简单结论,还要注意Jave层和native层的区别,这样才能防止被误导。

AndroidLog的优先级在打印输出时会被转换成V,I,D,W,E等简单的字符标记。在做系统log分析时,我们很难把一个log文件从头看到尾,都是利用搜索工具来查找出错的标记。比如搜索“E/”来看看有没有指示错误的log。所以如果参与系统开发的每个工程师都能遵守Android定义的优先级含义来输出log,这会让我们繁重的log分析工作变得相对轻松些。

Android比较常见的严重问题有两大类,一是程序发生崩溃;二是产生了ANR。程序崩溃和ANR既可能发生在java层,也可能发生在native层。如果问题发生在java层,出错的原因一般比较容易定位。如果是native层的问题,在很多情况下,解决问题就不是那么的容易了。我们先看一个java层的崩溃例子:

I/ActivityManager( 396): Start proccom.test.crash for activity com.test.crash/.MainActivity:
pid=1760 uid=10065 gids={50065, 1028}

D/AndroidRuntime( 1760): Shutting downVM

W/dalvikvm( 1760): threadid=1: threadexiting with uncaught exception(group=0x40c38930)

E/AndroidRuntime( 1760): FATALEXCEPTION: main

E/AndroidRuntime( 1760):java.lang.RuntimeException: Unable to start activityComponentInfo
{com.test.crash/com.test.crash.MainActivity}:java.lang.NullPointerException

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.access$600(ActivityThread.java:141)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)

E/AndroidRuntime( 1760): atandroid.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime( 1760): atandroid.os.Looper.loop(Looper.java:137)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.main(ActivityThread.java:5050)

E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invokeNative(NativeMethod)

E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invoke(Method.java:511)

E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:793)

E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

E/AndroidRuntime( 1760): atdalvik.system.NativeStart.main(NativeMethod)

E/AndroidRuntime( 1760): Caused by:java.lang.NullPointerException

E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.setViewText(MainActivity.java:29)

E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.onCreate(MainActivity.java:17)

E/AndroidRuntime( 1760): atandroid.app.Activity.performCreate(Activity.java:5104)

E/AndroidRuntime( 1760): atandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)

E/AndroidRuntime( 1760): ... 11more

I/Process ( 1760): Sending signal.PID: 1760 SIG: 9

W/ActivityManager( 396): Force finishing activitycom.test.crash/.MainActivity

Jave层的代码发生crash问题时,系统往往会打印出很详细的出错信息。比如上面这个例子,不但给出了出错的原因,还有出错的文件和行数。根据这些信息,我们会很容易的定位问题所在。native层的crash虽然也有栈log信息输出,但是就不那么容易看懂了。下面我们再看一个native层crash的例子:

F/libc ( 2102): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread2102 (testapp)

D/dalvikvm(26630):GC_FOR_ALLOC freed 604K, 11% free 11980K/13368K, paused 36ms, total36ms

I/dalvikvm-heap(26630):Grow heap (frag case) to 11.831MB for 102416-byteallocation

D/dalvikvm(26630):GC_FOR_ALLOC freed 1K, 11% free 12078K/13472K, paused 34ms, total34ms

I/DEBUG ( 127):*** *** *** *** *** *** *** *** *** *** *** *** *** *** ******

I/DEBUG ( 127):Build fingerprint:
'Android/full_maguro/maguro:4.2.2/JDQ39/eng.liuchao.20130619.201255:userdebug/test-keys'

I/DEBUG ( 127):Revision: '9'

I/DEBUG ( 127):pid: 2102, tid: 2102, name: testapp >>>./testapp <<<
I/DEBUG ( 127):signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr00000000

I/DEBUG ( 127): r0 00000020 r173696874 r2 400ff520 r300000000

I/DEBUG ( 127): r4 400ff469 r5beb4ab24 r6 00000001 r7beb4ab2c

I/DEBUG ( 127): r8 00000000 r900000000 sl 00000000 fpbeb4ab1c

I/DEBUG ( 127): ip 4009b5dc spbeb4aae8 lr 400ff46f pc400ff45e cpsr 60000030

I/DEBUG ( 127): d0 000000004108dae8 d1 4108ced84108cec8

I/DEBUG ( 127): d2 4108cef84108cee8 d3 4108cf184108cf08

I/DEBUG ( 127): d4 4108c5a84108c598 d5 4108ca084108c5b8

I/DEBUG ( 127): d6 4108ce684108ce58 d7 4108ce884108ce78

I/DEBUG ( 127): d8 0000000000000000 d9 0000000000000000

I/DEBUG ( 127): d10 0000000000000000 d110000000000000000

I/DEBUG ( 127): d120000000000000000 d130000000000000000

I/DEBUG ( 127): d14 0000000000000000 d150000000000000000

I/DEBUG ( 127): d16 c1dcf7c087fec8b4 d173f50624dd2f1a9fc

I/DEBUG ( 127): d18 41c7b1ac89800000 d190000000000000000

I/DEBUG ( 127): d20 0000000000000000 d210000000000000000

I/DEBUG ( 127): d22 0000000000000000 d230000000000000000

I/DEBUG ( 127): d24 0000000000000000 d250000000000000000

I/DEBUG ( 127): d26 0000000000000000 d270000000000000000

I/DEBUG ( 127): d28 0000000000000000 d290000000000000000

I/DEBUG ( 127): d30 0000000000000000 d310000000000000000

I/DEBUG ( 127): scr 00000010

I/DEBUG ( 127):

I/DEBUG ( 127):backtrace:

I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp

I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp

I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)

I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp

I/DEBUG ( 127):

I/DEBUG ( 127):stack:

I/DEBUG ( 127): beb4aaa8 000000c8
I/DEBUG ( 127): beb4aaac 00000000
I/DEBUG ( 127): beb4aab0 00000000
I/DEBUG ( 127): beb4aab4 401cbee0 /system/bin/linker

I/DEBUG ( 127): beb4aab8 00001000
I/DEBUG ( 127): beb4aabc 4020191d /system/lib/libc.so (__libc_fini)

I/DEBUG ( 127): beb4aac0 4020191d /system/lib/libc.so (__libc_fini)

I/DEBUG ( 127): beb4aac4 40100eac /system/bin/testapp

I/DEBUG ( 127): beb4aac8 00000000
I/DEBUG ( 127): beb4aacc 400ff469 /system/bin/testapp

I/DEBUG ( 127): beb4aad0 beb4ab24 [stack]

I/DEBUG ( 127): beb4aad4 00000001
I/DEBUG ( 127): beb4aad8 beb4ab2c [stack]

I/DEBUG ( 127): beb4aadc 00000000
I/DEBUG ( 127): beb4aae0 df0027ad
I/DEBUG ( 127): beb4aae4 00000000
I/DEBUG ( 127): #00 beb4aae8 00000000
I/DEBUG ( 127): ........ ........

I/DEBUG ( 127): #01 beb4aae8 00000000
I/DEBUG ( 127): beb4aaec 401e9721 /system/lib/libc.so (__libc_init+40)

I/DEBUG ( 127): #02 beb4aaf0 beb4ab08 [stack]

I/DEBUG ( 127): beb4aaf4 00000000
I/DEBUG ( 127): beb4aaf8 00000000
I/DEBUG ( 127): beb4aafc 00000000
I/DEBUG ( 127): beb4ab00 00000000
I/DEBUG ( 127): beb4ab04 400ff404 /system/bin/testapp

I/DEBUG ( 127):

这个log就不那么容易懂了,但是还是能从中看出很多信息,让我们一起来学习如何分析这种log。首先看下面这行:

pid: 2102, tid: 2102,name: testapp >>>./testapp <<<
从这一行我们可以知道crash进程的pid和tid,前文我们已经提到过,Android调用gettid函数得到的实际是进程Id号,所以这里的pid和tid相同。知道进程号后我们可以往前翻翻log,看看该进程最后一次打印的log是什么,这样能缩小一点范围。

接下来内容是进程名和启动参数。再接下来的一行比较重要了,它告诉了我们从系统角度看,出错的原因:

signal 11 (SIGSEGV), code 1(SEGV_MAPERR), fault addr 00000000

signal11是Linux定义的信号之一,含义是Invalidmemory reference,无效的内存引用。加上后面的“faultaddr 00000000”我们基本可以判定这是一个空指针导致的crash。当然这是笔者为了讲解而特地制造的一个Crash的例子,比较容易判断,大部分实际的例子可能就没有那么容易了。

再接下来的log打印出了cpu的所有寄存器的信息和堆栈的信息,这里面最重要的是从堆栈中得到的backtrace信息:

I/DEBUG ( 127):backtrace:

I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp

I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp

I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)

I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp

因为实际的运行系统里没有符号信息,所以打印出的log里看不出文件名和行数。这就需要我们借助编译时留下的符号信息表来翻译了。Android提供了一个工具可以来做这种翻译工作:arm-eabi-addr2line,位于prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目录下。用法很简单:

#./arm-eabi-addr2line -f -eout/target/proct/hammerhead/symbols/system/bin/testapp0x0000045e

参数-f表示打印函数名;参数-e表示带符号表的模块路径;最后是要转换的地址。这条命令在笔者的编译环境中得到的结果是:

memcpy /home/rd/compile/android-4.4_r1.2/bionic/libc/include/string.h:108

剩余三个地址翻译如下:

main /home/rd/compile/android-4.4_r1.2/packages/apps/testapp/app_main.cpp:38

out_vformat /home/rd/compile/android-4.4_r1.2/bionic/libc/bionic/libc_logging.cpp:361

_start libgcc2.c:0

利用这些信息我们很快就能定位问题了。不过这样手动一条一条的翻译比较麻烦,笔者使用的是从网上找到的一个脚本,可以一次翻译所有的行,有需要的读者可以在网上找一找。

了解了如何分析普通的Log文件,下面让我们再看看如何分析ANR的Log文件。

‘捌’ 如何读懂和分析Android的logcat以及stack traces

一般在平时工作中,基本上很多代码可以在eclipse+ndk进行调试,但如果需要用到具体的硬件设备,如媒体播放设备无法模拟的情况下,只能上硬件(盒子或手机)上进行调试。此时唯一的调试手段就是logcat产生log信息进行分析问题了。
什么时候会有Log文件的产生 ?一般在如下几种情况会产生log文件 。
1、程序异常退出 uncaused exception
2、程序强制关闭 Force Closed (简称FC)
3、程序无响应 Application No Response(简称ANR),一般主线程超过5秒么有处理就会ANR
4、手动生成
进入控制台输入:logcat命令即可进行输出
第一部分
1、分析工具介绍
a、cat /proc/meminfo 显示基本的内存信息
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 285184 kB
MemFree: 106360 kB
Buffers: 0 kB
Cached: 60036 kB
SwapCached: 0 kB
Active: 98160 kB
Inactive: 49100 kB
Active(anon): 87260 kB
Inactive(anon): 288 kB
Active(file): 10900 kB
Inactive(file): 48812 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 87240 kB
Mapped: 26500 kB
Shmem: 324 kB
Slab: 13340 kB
SReclaimable: 1672 kB
SUnreclaim: 11668 kB
KernelStack: 2160 kB
PageTables: 5600 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 142592 kB
Committed_AS: 1065600 kB
VmallocTotal: 417792 kB
VmallocUsed: 137700 kB
VmallocChunk: 254980 kB
重点关注这下面几个值:
MemTotal: 285184 kB //总计物理内存的大小
MemFree: 106360 kB //可用内存有多少
Buffers: 0 kB //磁盘缓存内存的大小
Cached: 60036 kB
# free
free
total used free shared buffers
Mem: 285184 178884 106300 0 0
Swap: 0 0 0
Total: 285184 178884 106300
在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。
但实际上这些内存也是可以立刻拿来使用的。
所以空闲内存=free+buffers+cached=total-used
还有几个命令可使用:
/proc/meminfo 机器的内存使用信息
/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。
/proc/pid/statm 进程所占用的内存
b、查看进程信息
------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器
c、android提供的一些操作工具
------ PROCRANK (procrank) ------
------ PROCMEM (procmem) ------
------ SHOWMAP (showmap) ------
... 就不一一列举了,有兴趣的朋友可以去看看
这此工具的代码位于android的 /system/extras
d、虚拟内存的查看工具
------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
------ VMALLOC INFO (/proc/vmallocinfo) ------
2、时间信息,也是我们主要分析的信息
格式如下:
------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
$:logcat -b system -v time -d *:v
01-02 08:00:02.570 I/SystemServer( 957): Notification Manager
01-02 08:00:02.570 I/SystemServer( 957): Device Storage Monitor
01-02 08:00:02.580 I/SystemServer( 957): Location Manager
01-02 08:00:02.580 I/SystemServer( 957): Search Service
01-02 08:00:02.590 I/SystemServer( 957): DropBox Service
01-02 08:00:02.590 I/SystemServer( 957): Wallpaper Service
3、虚拟机信息,包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。
------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
格式如下 :
----- pid 1516 at 1970-01-02 08:03:07 -----
Cmd line: com.ipanel.join.appstore
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x4001f188 self=0xd028
| sysTid=1516 nice=0 sched=3/0 cgrp=[fopen-error:2] handle=-1345017744
第二部分
如何分析log信息
1、查找错误信息的关键字眼
"error" "failxx" "E/" 等的错误信息
将这些问题先行解决掉
2、动态库死机
查看类似的“Build fingerprint:”这些关键字
I/DEBUG ( 692): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 692): Build fingerprint: 'generic/generic/generic:2.3.1/GRH78/eng.userdev-rd6-input.20120221.113348:eng/test-keys'
I/DEBUG ( 692): pid: 694, tid: 694 >>> /system/bin/mediaserver <<<
I/DEBUG ( 692): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000input mole init -->
010
对于这此信息,可以查看动态库的分析:
http://blog.csdn.net/andyhuabing/article/details/7074979
3、解决java抛异常的问题解决
E/UsbObserver( 957): java.lang.NullPointerException
E/UsbObserver( 957): at com.android.server.UsbObserver.init(UsbObserver.java:131)
E/UsbObserver( 957): at com.android.server.UsbObserver.<init>(UsbObserver.java:65)
E/UsbObserver( 957): at com.android.server.ServerThread.run(SystemServer.java:419)
I/SystemServer( 957): UI Mode Manager Service
这个直接找到java代码,分析其实现即可解决
4、ANR问题
搜索“ANR”关键词,快速定位到关键事件信息 。
定位到关键的事件信息如下:
I/dalvikvm( 1014): Wrote stack traces to '/data/anr/traces.txt'
I/Process ( 957): Sending signal. PID: 1124 SIG: 9

指定哪个java包出问题
E/ActivityManager( 957): ANR in com.ipanel.join.appstore
进程号为957发生了如下错误:com.ipanel.join.appstore 包下面 Broadcast问题
ANR原因:
E/ActivityManager( 957): Reason: Broadcast of Intent { act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.ipanel.join.appstore/.widget.SmallWidget1 (has extras) }
这是ANR的堆栈调用文件
I/dalvikvm( 1014): Wrote stack traces to '/data/anr/traces.txt'
通过上面的log信息分析,应该是接收一个广播消息时超时了
我们再分析虚拟机信息 ,打开/data/anr/traces.txt,可有通过adb pull /data/anr/traces.txt .
这里每一段都是一个线程 ,当然我们还是看线程号为1的主线程了。通过分析发现关键问题是这样:
搜索“DALVIK THREADS”关键词,快速定位到本应用程序的虚拟机信息日志
----- pid 1516 at 1970-01-02 08:03:07 -----
Cmd line: com.ipanel.join.appstore
DALVIK THREADS:
。。。
at com.ipanel.join.appstore.widget.AbsSmallWidget.getRemoteViews(AbsSmallWidget.java:56)
其实从这句话:
at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
基本上确认是 socket ->connect 连接超时了,导致主线程5s内没有响应从而产生ANR错误。默认的connect连接timeout时间是75s
其实解决办法就是利用非阻塞方式进行连接即可。
从CPU占用率上也可以看出是在kernel中执行堵塞住了
E/ActivityManager( 957): 75% TOTAL: 4.7% user + 70% kernel
5、执行DexOpt错误
W/dalvikvm( 1803): DexOpt: --- END 'SettingsProvider.apk' --- status=0x000a, process failed
E/dalvikvm( 1803): Unable to extract+optimize DEX from '/system/app/SettingsProvider.apk'
。。。。android.app.ActivityThread.installProvider(ActivityThread.java:3557)

E/SystemServer( 1803): at android.app.ActivityThread.getProvider(ActivityThread.java:3356)
从上面的打印看,是在解压或优化extract+optimize DEX的apk文件时出错了
1、没有出现magic number错误,这个原因与原子操作无关(这是一快速的加锁和解锁的轻量级操作函数)
2、执行dexopt出错
查明是服务器硬盘没空间了,导致引导文件系统的时候没有空间进行解压而失败
6、系统启动后默认其妙或随机死机情况
出现这种错误:
12-01 08:11:56.027: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:11:57.315: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:11:59.318: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:12:03.332: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:12:05.329: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:12:07.216: WARN/KeyCharacterMap(312): No keyboard for id 0
12-01 08:12:07.216: WARN/KeyCharacterMap(312): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

‘玖’ android数据分析工具有哪些详细的有吗

微信公众号数据分析工具有不少,介绍你微问数据,可以从下面5点分析: 1、图文内容分析:优化内容提升消费者信任 2、用户分析:用户增长和流失一目了然, 3、自定义菜单点击分析:全面记录用户轨迹,优化自定义菜单排序 4、关键词分析:快速提升关键词命中率 5、渠道分析:发现流量,发现好渠道

‘拾’ android性能测试工具有哪些

大概有如下几个工具:
android针对上面这些会影响到应用性能的情况提供了一些列的工具:
1 布局复杂度:
hierarchyviewer:检测布局复杂度,各视图的布局耗时情况:

Android开发者模式—GPU过渡绘制:

2 耗电量:Android开发者模式中的电量统计;
3 内存:
应用运行时内存使用情况查看:Android Studio—Memory/CPU/GPU;

内存泄露检测工具:DDMS—MAT;
4 网络:Android Studio—NetWork;
5 程序执行效率:
静态代码检查工具:Android studio—Analyze—Inspect Code.../Code cleanup... ,用于检测代码中潜在的问题、存在效率问题的代码段并提供改善方案;
DDMS—TraceView,用于查找程序运行时具体耗时在哪;
StrictMode:用于查找程序运行时具体耗时在哪,需要集成到代码中;
Andorid开发者模式—GPU呈现模式分析。
6 程序稳定性:monkey,通过monkey对程序在提交测试前做自测,可以检测出明显的导致程序不稳定的问题,执行monkey只需要一行命令,提交测试前跑一次可以避免应用刚提交就被打回的问题。
说明:
上面提到的这些工具可以进Android开发者官网性能工具介绍查看每个工具的介绍和使用说明;

Android开发者选项中有很多测试应用性能的工具,对应用性能的检测非常有帮助,具体可以查看:All about your phone's developer options和15个必知的Android开发者选项对Android开发者选项中每一项的介绍;

针对Android应用性能的优化,Google官方提供了一系列的性能优化视频教程,对应用性能优化具有非常好的指导作用,具体可以查看:优酷Google Developers或者Android Performance Patterns。

二 第三方性能优化工具介绍
除了android官方提供的一系列性能检测工具,还有很多优秀的第三方性能检测工具使用起来更方便,比如对内存泄露的检测,使用leakcanry比MAT更人性化,能够快速查到具体是哪存在内存泄露。
leakcanary:square/leakcanary · GitHub,通过集成到程序中的方式,在程序运行时检测应用中存在的内存泄露,并在页面中显示,在应用中集成leancanry后,程序运行时会存在卡顿的情况,这个是正常的,因为leancanry就是通过gc操作来检测内存泄露的,gc会知道应用卡顿,说明文档:LeakCanary 中文使用说明、LeakCanary: 让内存泄露无所遁形。
GT:GT Home,GT是腾讯开发的一款APP的随身调测平台,利用GT,可以对CPU、内存、流量、点亮、帧率/流畅度进行测试,还可以查看开发日志、crash日志、抓取网络数据包、APP内部参数调试、真机代码耗时统计等等,需要说明的是,应用需要集成GT的sdk后,GT这个apk才能在应用运行时对各个性能进行检测。

阅读全文

与android协议分析工具相关的资料

热点内容
单片机的原理概述 浏览:506
火控pdf 浏览:267
如何复制云服务器centos环境 浏览:984
债权pdf 浏览:299
红色番字的app怎么下载 浏览:876
云服务器流程教课 浏览:702
中国农业银行app怎么没有网 浏览:997
几率表算法 浏览:902
程序员理工科 浏览:708
企业邮箱登录收件服务器地址 浏览:558
计算机思维与算法设计的重要性 浏览:664
linux刷新磁盘命令 浏览:76
我的世界如何查看服务器种子pc 浏览:284
linuxlamp编译安装 浏览:609
枚举算法ppt 浏览:184
cmd查看进程命令 浏览:956
手机内怎么删除APP 浏览:834
鱼群和鸟群算法区别 浏览:93
pdf尺寸设置 浏览:211
android访问本地服务器 浏览:512