adb命令调试(持续记录ing)

查看当前的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内存相关信息:

  1. process 以进程的PSS从大到小依次排序显示,每行显示一个进程;
  2. OOM adjustment 分别显示每类的进程情况
  3. category 以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
  4. 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帧,执行结果如下:

详细计算方法如下:

  1. 首先获取执行一次命令打印出来的结果,重点关注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帧。

  2. 计算总数据的行数 frame_count = row_num, 计算每行渲染时间render_time = Draw + Prepare+Process + Execute, 当渲染时间>16.67ms(1000/60),按照垂直同步机制,该帧已经渲染超时

  3. 一旦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获取应用发送流量信息(设备重启后清零)]

计算流量消耗步骤:

  1. 执行一次这两条命令,获取到应用的开始接收及发送的流量
  2. 然后我们再操作应用,执行一段时间测试
  3. 再次执行上述 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 .
后面空格+. 代表拷贝到当前目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值