百度MTC、腾讯GT、bita、Bugly、阿里云效、科大讯飞iTest、网易Emmagee、华为DevEco、Testin
地址:https://github.com/NetEase/Emmagee
App的整体性能分析
地址:https://github.com/TencentOpen/GT
官网:https://gt.qq.com/
GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment)。利用GT,仅凭一部手机,无需连接电脑,您即可对APP进行快速的性能测试(CPU、内存、流量、电量、帧率/流畅度等等)、开发日志的查看、Crash日志查看、网络数据包的抓取、APP内部参数的调试、真机代码耗时统计等
常规压力测试、大数据/操作的峰值压力测试、长时间运行的稳定性测试等
//随机操作49000次
adb shell monkey 490000
//启动包名为com.tencent.mobileqq的应用并随机操作49000次
adb shell monkey -p com.tencent.mobileqq 49000
Monkey Demons : 针对性的Monekey https://m.aliyun.com/yunqi/articles/73859
针对:发现性能瓶颈
功能:跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统(如Surfaceflinger、WindowManagerService等Framework关键模块)的运行状况。
Tip:主要用于发现性能瓶颈,可展示每个Frame的情况(Frame),查看有性能问题的点(Alert),不适合做针对性的问题定位和分析。
用法:
方法一:代码跟踪
//Java层 成对出现,并将这段时间内的数据收集到/sdcard/systrace.txt中
Trace.beginSection("systrace.txt");
Trace.endSection();
//framework中Java层
Trace.traceBegin(Trace.TRACE_TAG_VIEW,"systrace.txt");
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
//framework中Naitve层
ATRACE_INIT();
ATRACE_CALL();
方法二:python命令 \sdk\platform-tools\systrace
python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
方法三:Android Device Monitor工具 【sdk\tools\lib\monitor-x86_64】
Android Device Monitor -> Device -> Capture System Wide Trace ;收集一段时间内某进程的信息
Alerts:标记性能有问题的点,点击可查看详情,右边侧边栏可以查看每个类型的Alerts数量
Frame:显示为黄色或红色则表示渲染时间超过16.6ms,使用W键放大查看该帧做了什么
针对:卡顿、OOM、ANR
功能:展示每个方法的用时,调用次数及调用栈
用法:
方法一:代码
//生成/mnt/sdcard/traceview.trace文件
Debug.startMethodTracing("traceview");
Debug.stopMethodTracing();
方法二:Android Device Monitor 工具【sdk\tools\lib\monitor-x86_64】
点击【start method profile】开始 ==> 点击【stop method profile】结束
获取这段时间的trace文件
方法三:Android Studio 【3.1.2】 Profiler
点击【Record a method trace】开始 ==> 点击【stop Recording】结束
Call Chart:水平方向表示方法的执行时间,垂直方向表示方法的调用
Flame Chart:反向的Call Chart ???
Top Down:显示方法调用的列表,扩展方法节点显示其callees
Bottom Up:显示一个方法调用列表,扩展方法的节点显示其调用者
针对:布局优化
功能:查看UI布局信息,优化布局
用法:Android Device Monitor -> Device -> Dump View HierachyViewer for UI automator
PS:工具栏中点击【Obtain layout times for tree rooted at selected node】按钮可查看某View的耗时
针对:内存泄露
功能:内存泄露分析
Tip:个人经验,内存泄露就是无用的对象无法被GC回收,很粗浅的一个判断就是,假设你怀疑一个Activity有内存泄露情况,可以在AndroidStudio中观察内存变化,然后进入Activity做操作,退出再进入再操作如此重复N次,如果内存不断地增加则很有可能发生内存泄露了。而MAT可以帮我们找出泄露的是哪个对象。MAT的用法这里引用大神的一个系列
用法:
方法一:下载eclipse插件工具 Eclipse Memory Analyzer
下载地址:https://eclipse.org/mat/downloads.php
1、获取HPROF文件,点击【Update Heap】按钮,操作应用,点击【Dump HPROF File】按钮,生成HPROF文件
2、文件转换 ./hprof-conv in.hprof out.hprof 然后用MAT打开这个hprof文件
方法二:Android Device Monitor
点击【Update Heap】开始 ==> 点击【Dump HPROF file】结束并获取.hprof文件
数据分析:有Histogram、Dominator Tree、Top Consumers、Leak Suspects几个分析纬度
Histogram:列出内存中的所有实例对象,对象的个数及大小,并支持正则表达式查找
Dominator Tree:列出最大的对象及其依赖存活的Object,分析流程和Histogram大同小异,但Dominator Tree可更方便的看出引用关系
右键选择要跟踪的Java类型,【Merge Shortest Paths to GC Root】-【exclude all phantom/weak/soft etc referrence】显示GC Root并排除虚引用、弱引用、软引用;可以看到该对象被那个对象持有,若是该问题在适当地方置为null即可
Top Consumers:通过图形列出最大的Object,了解应用内存都被哪些类型占用了
但这部分信息包含了系统框架层的信息,用以下方式可以将系统框架的信息隔离,只显示应用层的信息
方法一:转换的时候加入-z参数
hprof-conv [-z] <infile><outfile>
-z: exclude non-app heaps, such as Zygote
方法二:针对转换后的hprof,使用OQL查询来提取信息。
在数据中寻找应用的Application类对象,将对象地址转换为十
进制后输入以下查询语句
select * from instanceof java.lang.Object s where s.@objectAddress > 1107296256
Leak Suspects通过MAT自动分析泄露的原因和泄露的一份总体报告,Leak Suspects列出了内存泄漏点和泄露大小。
Shallow Heap对象自身占用的内存大小
Retained Heap对象自身占用内存大小+其所引用的对象占用内存大小的总和
PS:也可通过制造相同场景下的两个不同的hprof(一个正常无泄漏,一个异常有泄漏)进行对比,查看异常hprof哪个地方持有引用明显多于正常hprof从而定位问题
** MEMINFO in pid 15548 [com.paisheng.pp] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 13573 13508 12 0 29184 20268 8915
Dalvik Heap 29066 29020 12 0 56681 40297 16384
Dalvik Other 3333 3332 0 4
Stack 48 48 0 20
Ashmem 2 0 0 0
Gfx dev 18808 18808 0 0
Other dev 13 0 12 0
.so mmap 1507 212 228 263
.jar mmap 0 0 0 0
.apk mmap 235 20 0 80
.dex mmap 2820 0 2412 8
.oat mmap 2140 0 792 0
.art mmap 2511 2180 0 72
Other mmap 1207 4 1180 0
EGL mtrack 36992 36992 0 0
GL mtrack 4504 4504 0 0
Unknown 2390 2376 8 21633
TOTAL 141229 111004 4656 22080 85865 60565 25299
内存分为Natvie和Dalvik,两者相加超过一定限制就会OOM,Dalvik即Java堆内存,而Bitmap则是在Native上直接分配的。
Native Heap Native代码分配的内存,虚拟机和Android框架本身也会分配
Dalvik Heap Java代码分配的对象
Dalvik Other 类的数据结构和索引
so mmap Native代码和常量
dex mmap Java代码和常量(dex mmap在Android应用中的作用是映射classes.dex文件。Dalvik虚
拟机需要从dex文件中加载类信息、字符串常量等,还需要在调用函数的时候直接从mmap内存中读取函数代码来执行)
Pss:进程实际使用的物理内存
Shared Dirty:zygote加载的Android框架部分
Private Dirty:应用new出来的对象
Heap Size:最大分配空间
Heap Alloc:统计的是由虚拟机分配的所有应用实例的内存,zygote部分也会计算进去,通常比Pss略大。反映Java代码分配的内存
Heap Free:剩余空间
一、am
1.am启动一个activity,可以输出activity启动时间
adb shell am start -W -n com.android.gallery3d/.MainActivity
-n使用包名加类名,还有a动作,c CATEGORY等
2.am发送一个广播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER
3.am发送一个带参数的广播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER –es letter “e”
4.am启动一个服务,不带参数时默认使用包名加类名启动,参数时n,a,c
adb shell am startservice com.android.music/.MediaPlaybackService
5.关闭一个activity或者服务之类,使用包名就行,只是强制退出,相当于Home按键,应用处于后台
adb shell am force-stop com.android.gallery3d
二、pm
1、可以列出手机上安装的apk与对应的软件包,由于使用命令删除apk时,需要知道包名,通过这条命令加上grep或者find就能找到需要的软件的包名
adb shell pm list packages -f
2、找出对应包的安装目录路径,两条指令结合,可以知道要拷贝给别人的软件位于手机什么地方
adb shell pm path com.android.gallery3d
2.可以列了使用的权限
adb shell pm list permission-groups
adb shell pm list permissions
其他