查看当前的FocusWindow:
adb shell dumpsys window d | grep "mCurrentFocus"
查看不同屏幕的FocusWindow:
adb shell dumpsys window d | grep mFocusedWindow
dump activity相关信息:
adb shell dumpsys activity activities
dump window相关信息:
adb shell dumpsys window windows
dump surface相关信息:
adb shell dumpsys SurfaceFlinger
dump内存相关信息:
- process 以进程的PSS从大到小依次排序显示,每行显示一个进程;
- OOM adjustment 分别显示每类的进程情况
- category 以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
- total 总内存、剩余内存、可用内存、其他内存
执行结果如下图,重点取该应用的TOTAL 对应的内存占用大小(KB)
adb shell dumpsys meminfo
dump power相关信息,输出到本地文件中后搜索Wake Locks关键字即可查看持有wakelock的应用:
adb shell dumpsys power
查看进程列表:
adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):
u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。
单个应用的最大内存限制:
adb shell "getprop | grep heapgrowthlimit"
应用启动后分配的初始内存:
adb shell "getprop|grep dalvik.vm.heapstartsize"
单个java虚拟机的最大内存限制:
adb shell "getprop|grep dalvik.vm.heapsize"
adb fps(每秒帧数,计算流畅度)数据采集:
adb shell dumpsys gfxinfo <package | pid>
前提:开发者选项=>GPU呈现模式分析确保打开=>在adb shell dumpsys gfxinfo中or 在屏幕上显示为线型图
方法仅适用于Android原生应用,不适用于游戏
正常情况下帧率应该在16.67ms左右,1秒60帧,执行结果如下:
详细计算方法如下:
-
首先获取执行一次命令打印出来的结果,重点关注Draw Prepare Process Execute 行下面的数据
Draw:是消耗在构建java显示列表DisplayList的时间。说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的DisplayList对象的时间。
Process:表示是消耗在Android的2D渲染器执行显示列表的时间,view越多,要执行的绘图命令就越多,时间就越长
Execute:消耗在排列每个发送过来的帧的顺序的时间.或者说是CPU告诉GPU渲染一帧的时间,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复。所以这个时间,一般都很短。
Draw + Prepare+Process + Execute = 完整显示一帧 ,这个时间要小于16ms才能保存每秒60帧。 -
计算总数据的行数 frame_count = row_num, 计算每行渲染时间render_time = Draw + Prepare+Process + Execute, 当渲染时间>16.67ms(1000/60),按照垂直同步机制,该帧已经渲染超时
-
一旦render_time>16.67 算一次jank(丢帧),一旦jank,需要用掉额外的vsync
vsync_overtime = 向上取整(render_time/16.67) - 1
比如:render_time = 66.68 vsync_overtime = 3
render_time = 67 vsync_overtime = 4
一次命令执行获得的fps = int( frame_count * 60 / (frame_count + vsync_overtime_sum))
还有一个命令是:
adb shell dumpsys SurfaceFlinger --latency LayerName
这个命令能获取游戏/视频应用的fps数据
其中LayerName在各个不同系统中获取的命令是不一样的
在Android 6系统直接就是SurfaceView
在Android 7系统中可以通过 dumpsys window windows | grep mSurface | grep SurfaceView 然后通过数据截取到
在Android 8系统中可以通过 dumpsys SurfaceFlinger | grep android包名获取到
执行命令结果如下:
计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len-2的第一列数据为end_time,取len-128的第一列数据为start_time
fps = 127/((end_time - start_time) / 1000000.0)
至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已
adb CPU占用率数据采集:
adb shell "top -n 5 | grep <package | pid>"
第三列就是实时监控的CPU占用率(-n 指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox 的top命令执行,效率会快很多
adb shell "dumpsys cpuinfo | grep <package | pid>"
两种方法直接区别在于,top是持续监控状态,而dumpsys cpuinfo获取的实时CPU占用率数据
adb 耗电量数据采集:
获取单个应用的耗电量信息:
adb shell "dumpsys batterystats < package | pid>"
adb shell "dumpsys battery"
出现信息解读:
AC powered:false 是否连接AC(电源)充电线
USB powered:true 是否连接USB(PC或笔记本USB插口)充电
Wireless powered:false 是否使用了无线电源
status: 1 电池状态,2为充电状态,其他为非充电状态
level:58 电量(%)
scale: 100. 电量最大数值
voltage: 3977 当前电压(mV)
current now: -335232. 当前电流(mA)
temperature:355 电池温度,单位为0.1摄氏度
technology:Li-poly. 电池种类
adb 采集流量数据:
adb shell "dumpsys< package | pid> | grep UID" [通过ps命令,获取app的UID(安装后唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat为查看命令,读取tcp_rcv获取应用接收流量信息(设备重启后清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat为查看命令,读取tcp_snd获取应用发送流量信息(设备重启后清零)]
计算流量消耗步骤:
- 执行一次这两条命令,获取到应用的开始接收及发送的流量
- 然后我们再操作应用,执行一段时间测试
- 再次执行上述 2 条命令可以获取到应用结束时候的接收及发送的流量,通过相减及得到应用的整体流量消耗
或者还有一种方式获取应用流量消耗:
首先获取应用固定uid:
dumsys package android包名 | grep userId
执行cat /proc/net/xt_qtaguid/stats | grep uid
其中第6列代表rx_bytes接收的字节数,第8列为tx_bytes发送的字节数
一个uid可能对应多个进程,把数据累加就行
两个时间片中间应用流量的消耗,就计算接收字节数的差值就行
adb采集CPU温度、电池温度:
首先判断类型:
cat /sys/class/thermal/thermal_zone*/type
只有红框框出来的是有效的
cat /sys/class/thermal/thermal_zone*/temp
获取CPU温度
adb采集电池温度:
dumpsys battery | grep temperature
单位0.1摄氏度
adb采集整机CPU使用率和分核CPU使用率:
获取/proc/stat文件内容(无权限限制)
总的cpu时间片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌时间为 notidle = user+nice+system +iowait+irq+softirq
cpu使用率计算方法为,先取开始的total值和忙碌时间notidle,隔一段时间片,再取一次计算total2,notidle2, cpuuse = (notidle2 – notidle) * 100 / (total2 - total)%
adb 采集各核cpu频率:
读/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是几核手机,scaling_cur_freq是否存在也不一定,需要判断
至于为啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系统获取的时候,这个文件shell没有读取权限,需要root权限
adb 采集GPU占用率,目前支持高通GPU芯片(Qualcomm Adreno系列):
直接apk内读取文件即可,不需要shell权限(支持到Android8)
Gpu使用率获取:会得到两个值,(前一个/后一个)*100%=使用率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy
Gpu工作频率:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq
Gpu可用频率:
adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies
Gpu可用工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors
Gpu当前工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor
TAG为WM_DEBUG_APP_TRANSITIONS的窗口日志输出到logcat中,其他TAG参见ProtoLogGroup类中定义:
adb shell wm logging enable-text WM_DEBUG_APP_TRANSITIONS
进入指定设备:
adb -s serialNumber shell
查看版本:
adb version
查看日志:
adb logcat
查看设备:
adb devices
连接状态:
adb get-state
启动ADB服务:
adb start-server
停止ADB服务:
adb kill-server
电脑推送到手机:
adb push local remote
手机拉取到电脑:
adb pull remote local
查看当前Activity及其包名:
adb shell "dumpsys window | grep mCurrentFocus"
启动app:
am start -n {packageName}/.{activityName}
杀app的进程:
am kill <packageName>
强制停止一切:
am force-stop <packageName>
启动服务:
am startservice
停止服务:
am stopservice
打开12306网站:
am start -a android.intent.action.VIEW -d http://www.12306.cn/
拨打10086:
am start -a android.intent.action.CALL -d tel:10086
列出手机所有的包名:
pm list packages
安装/卸载:
pm install/uninstall
文本输入:
adb shell input text <string>
例手机端输出demo字符串,相应指令:adb shell input "demo"
键盘事件:
input keyevent <KEYCODE>
点击返回键,相应指令: input keyevent 4
点击事件:
input tap <x> <y>
例点击坐标(500,500),相应指令: input tap 500 500
滑动事件:
input swipe <x1> <y1> <x2> <y2> <time>
例从坐标(300,500)滑动到(100,500),相应指令: input swipe 300 500 100 500
. 例200ms时间从坐标(300,500)滑动到(100,500),相应指令: input swipe 300 500 100 500 200
显示包含的logcat:
logcat \| grep <str>
显示包含,并忽略大小写的logcat:
logcat \| grep -i <str>
显示该标签的log:
logcat -s “ActivityManager”
读完所有log后返回,而不会一直等待:
logcat -d
清空log并退出:
logcat -c
打印最近的count:
logcat -t <count>
格式化输出Log:
logcat -v <format>
其中format
有如下可选值:
- brief — 显示优先级/标记和原始进程的PID (默认格式)
- process — 仅显示进程PID
- tag — 仅显示优先级/标记
- thread — 仅显示进程:线程和优先级/标记
- raw — 显示原始的日志信息,没有其他的元数据字段
- time — 显示日期,调用时间,优先级/标记,PID
- long —显示所有的元数据字段并且用空行分隔消息内容
获取/打印日志到电脑:
打印日志之前可以先执行adb logcat -c 清除之前的日志信息
adb logcat -v time > D:\log.txt
# 仅抓取events log
adb shell logcat -b events > log.txt
# 抓取所有类型log
adb shell logcat -b all > log.txt
# 根据关键字抓取log,-i可以忽略大小,-e可以添加多条关键字,如下:
adb shell logcat -b events | grep -ie "关键log1" -ie "关键log2"> log.txt
常用节点:
查看节点值,例如:cat /sys/class/leds/lcd-backlight/brightness 修改节点值,例如:echo 128 > sys/class/leds/lcd-backlight/brightness
-
LPM: echo N > /sys/modue/lpm_levels/parameters/sleep_disabled
-
亮度: /sys/class/leds/lcd-backlight/brightness
-
CPU: /sys/devices/system/cpu/cpu0/cpufreq
-
GPU: /sys/class/ kgsl/kgsl-3d0/gpuclk
-
限频: cat /data/pmlist.config
-
电流: cat /sys/class/power_supply/battery/current_now
-
查看Power: dumpsys power
-
WIFI data/misc/wifi/wpa_supplicant.conf
-
持有wake_lock: echo a> sys/power/wake_lock 释放wake_lock: echo a> sys/power/wake_unlock
-
查看Wakeup_source: cat sys/kernel/debug/wakeup_sources
-
SurfaceFlinger dumpsys SurfaceFlinger
-
Display(关闭AD): mv /data/misc/display/calib.cfg /data/misc/display/calib.cfg.bak 重启
-
关闭cabc: echo 0 > /sys/device/virtual/graphics/fb0/cabc_onoff 打开cabc:echo 3 > /sys/device/virtual/graphics/fb0/cabc_onoff
-
systrace: sdk/tools/monitor
-
限频: echo /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 1497600
-
当出现read-only 且 remount命令不管用时: adb shell mount -o rw,remount /
-
进入9008模式: adb reboot edl
-
查看高通gpio:sys/class/private/tlmm 或者 sys/private/tlmm
-
查看gpio占用情况:sys/kernle/debug/gpio
Keycode表
0 --> "KEYCODE_UNKNOWN"
1 --> "KEYCODE_MENU"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME" //Home键
4 --> "KEYCODE_BACK" //返回键
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0" //数字键0
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP" //音量键+
25 --> "KEYCODE_VOLUME_DOWN" //音量键-
26 --> "KEYCODE_POWER" //Power键
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A" //字母键A
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 -> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER" //回车键
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
关闭硬件合成:
adb shell service call SurfaceFlinger 1008 i32 1
查看进程:
adb shell
ps -A | grep settings
切换白天黑夜模式(先adb shell进去):
黑夜:
cmd uimode night yes
白天:
cmd uimode night no
杀掉进程:
kill -9 com.xx.xx
杀进程:
pidof com.xx.xx| xargs kill -9
打印某进程堆栈:
pidof com.xx.xx | xargs debuggerd -j
查看顶层Activity信息:
dumpsys activity top
其他命令
scp跨服务器拷贝文件:
scp -r 用户名@服务器地址:文件路径 .
比如:scp -r daha.ma@103.89.76:/user/file/aa.txt .
后面空格+. 代表拷贝到当前目录