android性能分析之常用命令

https://blog.csdn.net/zhzhangnews/article/details/92383355

性能分析:
从AS3.0,android使用Profile来进行分析,关于Profile的使用,请参考文章:
Android Profiler分析(一)概述
Android Profiler分析(二) Memory Profiler
Android Profiler分析(三) CPU Profiler

-Android studio的工具-Memory Monitor
Memory Monitor工具主要是用来监测APP的内存分配情况,判断是否存在内存泄漏
Dump Java Heap定位内存泄漏, 生成.hprof
Eclipse: ddms->update heap->cause gc生成总内存信息,然后会有data object

-运行时错误分析
/data/tombstones
全志平台:/mnt/extsd/tombstones
addr2line 工具和 objdump 工具来定位backtrace错误
工具位置:windows: ndk\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin

arm-linux-androideabi-addr2line -C -f -e libss.so 00026cb3
-e 选项来指定可执行libss.so。
-f 选项,可以告诉工具输出函数名

arm-eabi-objdump -S libss.so > dvb_map.txt
-查看CPU占用空间
adb shell dumpsys cpuinfo <package_name>/pid
CPU Sched status

adb shell catproc/sched_debug

CPU interrupts

adb shell catproc/interrupts
adb shell catproc/irq/irq_id/spurious

-查看内存占用空间
adb shell procrank (pid)
adb shell dumpsys meminfo/cpuinfo <package_name>/pid内查看本地层程序
top -t -m 5 -n 2 查询Cpu/内存的基本使用
adb shell cat /proc/buddyinfo
adb shell cat /proc/meminfo
adb shell cat /proc/pid/maps

-查看磁盘占用空间
du -sH * 查看当前目录下文件空间
df 查看分区占用空间

对进程打开的所有文件进行监控: lsof -p 7005

-dumpsys命令
dumpsys activity | grep mFocusedActivity 查看当天焦点activity

按键事件:
adb shell getevent –t 查看当前按下按键的值

事件类型(0001),事件代码(0074)以及事件的值(00000001)
adb shell getevent /dev/input/event2 获取event2设备的事件
adb shell input keyevent 4 返回按键

卡顿内容等性能分析:
-traceview
TraceView可视化工具可以看出代码在运行时的一些具体信息,方法调用时长,次数,时间比率,了解代码运行过程的效率问题,从而针对性改善代码。它主要用于分析Android中应用程序的hotspot。Traceview本身只是一个数据分析工具,而数据的采集则需要使用Android SDK中的Debug类或者利用DDMS工具。

TraceView用法

Ddms打开, Start Method Profiling->操作界面->stop, 操作最好不要超过5s

android.os.Debug.startMethodTracing();和android.os.Debug.stopMethodTracing();然后在sdcard目录下生产trace文件
打开tools目录下monitor.bat或者eclipse,脚本如下
@echo off
rem color 0A :设置cmd背景颜色和字体颜色 color 0A
rem title:设置cmd标题
title Start Android Studio Mointor
rem echo 请按任意键打开 Android Studio Mointor …
rem pause>nul call
D:\tools\adt-bundle-windows-x86_64-20140702\sdk\tools\monitor.bat

Profile Panel各列作用说明

名 描述
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类似,只不过统计单位换成了真实时间
一般而言,hotspot包括两种类型的函数: 一类是调用次数不多,但每次调用却需要花费很长时间的函数。先按降序对时间项进行排列(可以是时间百分比、真实时间或CPU时间),然后查找耗费时间最多的函数
一类是那些自身占用时间不长,但调用却非常频繁的函数。

-Systrace
Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况(如surfaceflinger、WindowManagerService等Framework部分关键模块、服务)等,。
在Android平台中,它主要由3部分组成:

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

从本质上说,Systrace是对Linux Kernel中ftrace的封装。应用进程需要利用Android提供的Trace类来使用Systrace。Android 4.1为系统中的几个关键进程和模块都添加了Systrace功能
添加代码的跟踪方式native和java
native层用法

头文件:<utils/Trace.h>
定义ATRACE_TAG:如使用了ATRACE_TAG_GRAPHICS,表示它和Graphics相关。
ATRACE_INIT:用于统计某个变量使用的情况。ATRACE_INIT(“变量TAG”, 变量名)
ATRACE_CALL:用于统计函数的调用情况ATRACE_CALL()

app层

Trace.beginSection(“Fragement_onCreateView”);
// … 其他代码
// …
// … 结束处
Trace.endSection()
然后通过指令:python systrace.py --app=sectionName 指定APK,或者通过DDMS选择指定APK,抓取systrace分析

Java framework层

Trace.traceBegin(long traceTag, String methodName)
Trace.traceEnd(long traceTag)

打开方式:
进入Android/Sdk/platform-tools/systrace目录下
python systrace.py [options] [category1] [category2] … [categoryN]

[options]”是一些命令参数;“[category]”等是你感兴趣的系统模块,比如view代表View系统(包含绘制流程),am代表ActivityManager(包含Activity的创建过程等
如:python systrace.py --time=10 -o mynewtrace.html sched gfx view wm

options:

options 描述
-o < FILE > 输出的目标文件
-t N, –time=N 执行时间,默认5s
-b N, –buf-size=N buffer大小(单位kB),用于限制trace总大小,默认无上限
-k < KFUNCS >,–ktrace=< KFUNCS > 追踪kernel函数,用逗号分隔
-a < APP_NAME >,–app=< APP_NAME > 追踪应用包名,用逗号分隔
–from-file=< FROM_FILE > 从文件中创建互动的systrace
-e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > 指定设备
-l, –list-categories 列举可用的tags
category常用取值

sched:CPU调度的信息,非常重要;你能看到CPU在每个时间段在运行什么线程;线程调度情况,比如锁信息。
gfx:Graphic系统的相关信息,包括SurfaceFlinger,VSYNC消息,Texture,RenderThread等;分析卡顿非常依赖这个。
view:View绘制系统的相关信息,比如onMeasure,onLayout等;对分析卡顿比较有帮助。
am:ActivityManager调用的相关信息;用来分析Activity的启动过程比较有效。
dalvik: 虚拟机相关信息,比如GC停顿等。
binder_driver:Binder驱动的相关信息,如果你怀疑是Binder IPC的问题,不妨打开这个。
core_services:SystemServer中系统核心Service的相关信息,分析特定问题用。

利用anr日志:

  • java层:
    默认trace位置: /data/anr/trace.txt
    可以通过修改系统属性dalvik.vm.stack-trace-file改变trace文件路径

Zygote fork出来的process,如APP以及system_server,都会进行Java运行环境分析。其关键是分析Java Heap,以便快速知道某个Java变量的值,以及Java对象的分布和引用情况。
通常Java Heap的分析方式则是抓取Java Hprof,然后使用MAT等工具进行分析
抓取Hprof日志方法:

方式一:使用am 命令
db shell am dumpheap {Process} file adb shell am dumpheap
com.android.phone /data/anr/phone.hprof adb pull
/data/anr/phone.hprof

方式二:使用DDMS 命令
在DDMS中选择对应的process,然后在Devices按钮栏中选择Dump Hprof file,保存即可

方式三:通过代码的方式
在android.os.Debug这个class 中有定义相关的抓取hprof 的method。 如: public static
void dumpHprofData(String fileName) throwsIOException;
这样即可在代码中直接将这个process的hprof 保存到相对应的文件中,注意这个只能抓取当时的process。

快速分析

DVM的Hprof 和标准的Java Hprof 有一些差别,需要使用hprof-conv进行一次转换,将DVM格式的hprof转换成标准的java 命令 hprof-conv in.hprof out.hprof
使用如MAT Tool,打开转换后的hprof文件

  • Native层:
    添加代码直接抓取
    Google 默认提供了CallStack API,请参考
    system/core/include/libutils/CallStack.h
    system/core/libutils/CallStack.cpp
    可快速打印单个线程的backtrace

自动抓取
Natice层的进程发生异常后一般都在/data/tombstones目录下生成文件
arm-linux-androideabi -addr2line-f -C -e symbols address

MTK工具
利用debuggerd抓取Native backtrace的tool RTT(Runtime Trace),对应的执行命令是:

USAGE : rtt[-h] -f function -p pid [-t tid]
-ffuncion : current support functions: bt (Backtrace function)
-ppid : pid to trace
-ttid : tid to trace
nname : process name to trace
-h : help menu

-Kernel层

AEE/RTT 工具
cat proc/pid/task/tid/stack
proc/kmsg
adbshell cat proc/kmsg > kmsg.txt
adbshell "echo 8 > proc/sys/kernel/printk“ //修改printk loglevel
adbshell "echo t > /proc/sysrq-trigger“ //打印所有的backtrace
adbshell "echo w > /proc/sysrq-trigger“//打印’-D’ status’D’的 process
日志抓取
使用下面脚本抓取全部日志:

@echo “Pull important informationfrom hang phone, written by Yanghui Li”
adb devices
@echo “attach sdcard/mtklog”
adb pull /sdcard/mtklog mtklog/
@echo “attach sdcard2/mtklog”
adb pull /sdcard2/mtklog mtklog/sdcard2
@echo “attach trace”
adb pull /data/anr mtklog/anr
@echo “attach rtt dump forsurfaceflinger”
adb pull /data/rtt_dump* mtklog/sf_dump
adb pull /data/anr/sf_rtt mtklog/sf_rtt_1
@echo “attach data aee db”
adb pull /data/aee_exp mtklog/data_aee_exp
@echo “attach data mobilelog”
adb pull /data/mobilelog mtklog/data_mobilelog
@echo “attach NE core”
adb pull /data/core mtklog/data_core
@echo “attach tombstones”
adb pull /data/tombstones mtklog/tombstones
@echo “attach phone state”
adb shell ps -t> mtklog/ps.txt
adb shell top -t -m 5 -n 3 > mtklog/top.txt
adb shell service list > mtklog/serviceList.txt
adb shell cat /proc/meminfo >mtklog/meminfo
adb shell cat /proc/buddyinfo >mtklog/buddyinfo
adb shell procrank > mtklog/procrank.txt
adb shell cat proc/sched_debug >mtklog/sched_debug.txt
adb shell cat proc/interrupts >mtklog/interrupts.txt
adb shell dumpstate > mtklog/dumpstate.txt
@echo “finish.”
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值