- 服务端发送请求到客户端的 5037端口。
- 客户端给服务端发送请求前会先检查端口5037是否启动,若没有启动会自动启动5037端口再发送请求。服务端会扫描当前所连接的设备。
- 连接一个设备需要2个端口,如下图5554、5555,其中一个端口和adb建立连接,另外一个端口与控制台console(就是类似CMD的命令提示符窗口)建立连接。
C:\Users\ZHUIAO>java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
C:\Users\ZHUIAO>javac -version
javac 1.8.0_144
java -version:验证 jre 版本
javac -version:验证 jdk 版本
我本地已经装了SDK,但是忘记装哪里了,可以用 软件everything 搜索 SDK的文件夹platform-tools,发现装在C:\Users\ZHUIAO\AppData\Local\Android\Sdk。
可以在真机和模拟上进行实验,模拟器:
Android Studio emulator(官方,不推荐,太大了)
genymotion(信赖网络,国外了,可能访问不了)
mumu,雷电,夜神,逍遥等第三方模拟器
手机插上数据线进行adb的连接,模拟器需要特定命令,如mumu,进入官网->点击常见问题->搜索adb即可查到:https://mumu.163.com/help/20210531/35047_951108.html,例如Windows的CMD输入:
adb_server.exe connect 127.0.0.1:7555
adb_server shell
我用的adb_server.exe就是adb.exe,所以输入:adb connect 127.0.0.1:7555
它就是用127.0.0.1:7555作为设备的名称,其他模拟器去官网找设备名即可:
手机需要找到 关于手机–》连点7次版本号,进入开发者模式–》回到上一级,进入开发者模式,打开USB调试
Windows的电脑还需要安装手机驱动(mac自带有),例如安装个 **手机助手,连接手机,手机助手自动就会装驱动,然后卸载手机助手即可
C:\Users\ZHUIAO>adb devices
List of devices attached
127.0.0.1:7555 device
C:\Users\ZHUIAO>adb kill-server
C:\Users\ZHUIAO>adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
C:\Users\ZHUIAO>
格式:adb [ -d | -e |-s
]
-d:指定当前唯一通过USB连接(因为安卓设备除了通过数据线连接,也可以通过WIFI连接)的Android设备为命令目标
-e:指定当前唯一运行的模拟器为命令目标
-s:指定响应的设备为命令目标
例如:-s指定设备,-s需要在adb后面
C:\Users\ZHUIAO>adb devices
List of devices attached
00000bf50d8e2913 device
127.0.0.1:7555 device
C:\Users\ZHUIAO>adb install C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
error: more than one device/emulator
adb: error: failed to get feature set: more than one device/emulator
- waiting for device -
error: more than one device/emulator
C:\Users\ZHUIAO>adb -s 127.0.0.1:7555 install C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
C:\Users\ZHUIAO\Downloads\weixin8024android2180_a...le pushed. 1.9 MB/s (269923680 bytes in 132.049s)
pkg: /data/local/tmp/weixin8024android2180_arm64.apk
Success
安装
普通安装:adb install
覆盖安装/替换安装:adb install -r
卸载
删除配置文件、数据缓存信息:adb uninstall 包名
不删除配置文件,保存数据缓存信息:adb uninstall -k 包名
(-k参数可能需要用其他命令:adb shell pm uninstall -k,具体根据提示执行)
例如手机没有微信apk时,进行安装微信apk:
C:\Users\ZHUIAO>adb install C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
C:\Users\ZHUIAO\Downloads\weixin8024android21...ushed. 2.5 MB/s (269923680 bytes in 101.027s) pkg: /data/local/tmp/weixin8024android2180_arm64.apk
Success
C:\Users\ZHUIAO>
如果手机已经安装了apk,再安装apk就会报错,可以通过-r参数来覆盖原来的apk:
# 第一次安装成功
C:\Users\ZHUIAO>adb install C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
C:\Users\ZHUIAO\Downloads\weixin8024android21...ushed. 2.5 MB/s (269923680 bytes in 101.027s) pkg: /data/local/tmp/weixin8024android2180_arm64.apk
Success
# 已经安装,再次安装失败
C:\Users\ZHUIAO>adb install C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk: 1 file pushed. 2.2 MB/s (269923680 bytes in 118.694s)
pkg: /data/local/tmp/weixin8024android2180_arm64.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
# 覆盖安装成功
C:\Users\ZHUIAO>adb install -r C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk: 1 file pushed. 2.7 MB/s (269923680 bytes in 95.636s)
pkg: /data/local/tmp/weixin8024android2180_arm64.apk
Success
卸载
# 卸载微信,包括缓存信息,微信的包名为com.tencent.mm
C:\Users\ZHUIAO>adb uninstall com.tencent.mm
Success
# 重新安装
C:\Users\ZHUIAO>adb install C:\Users\ZHUIAO\Downloads\weixin8024android2180_arm64.apk
C:\Users\ZHUIAO\Downloads\weixin8024an... 2.9 MB/s (269923680 bytes in 88.394s)
pkg: /data/local/tmp/weixin8024android2180_arm64.apk
Success
# 卸载微信,不包括缓存信息,可能会提示用用其他命令:adb shell pm uninstall -k
C:\Users\ZHUIAO>adb uninstall -k com.tencent.mm
The -k option uninstalls the application while retaining the data/cache.
At the moment, there is no way to remove the remaining data.
You will have to reinstall the application with the same signature, and fully uninstall it.
If you truly wish to continue, execute 'adb shell pm uninstall -k'
.
C:\Users\ZHUIAO>adb shell pm uninstall -k com.tencent.mm
Success
# 卸载后,保存在目录 /data/data/com.tencent.mm的缓存依旧存在
C:\Users\ZHUIAO>adb shell
root@x86_64:/ # cd data/data/com.tencent.mm
root@x86_64:/data/data/com.tencent.mm # ls
MicroMsg
app_cache
app_dex
app_flutter
app_font
app_lib
app_recover_lib
app_textures
app_webview
app_xwalk_-1
app_xwalkconfig
app_xwalkplugin
appbrand
cache
code_cache
databases
face_detect
files
no_backup
scan_goods
shared_prefs
名词 | 说明 |
---|---|
包package | Android应用的唯一标志 |
活动页 | Android应用的页面标志,一个页面就是一个activity |
例如打开QQ的登录页面,输入命令adb shell “dumpsys window | grep mCurrentFocus”,返回包名/页面名,包名是com.tencent.mobileqq,页面名是com.tencent.mobileqq.activity.LoginActivity
C:\Users\ZHUIAO>adb shell "dumpsys window | grep mCurrentFocus"
mCurrentFocus=Window{c06c3ee u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.LoginActivity}
C:\Users\ZHUIAO>adb shell am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.LoginActivity
Starting: Intent { cmp=com.tencent.mobileqq/.activity.LoginActivity }
注:也可以直接打开后几层的页面(例如“用手机号码注册”而不一定是登录页)
先执行下面命令,系统会连续抓取log,然后在虚拟机中打开QQ(打开QQ前已经有一些log,与QQ启动页无关),分析打印的log就可以找到启动页的信息。
例如下面打开QQ,启动页的名字就出现在打开QQ后第一个输出的cmp后面com.tencent.mobileqq/.activity.SplashActivity。
win:adb logcat ActivityManager:I | findstr “cmp”
mac:adb logcat ActivityManager:I |findstr “cmp”
C:\Users\ZHUIAO>adb logcat ActivityManager:I | findstr "cmp"
07-25 00:21:04.320 687 687 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.mumu.launcher/.Launcher} from uid 0 on display 0
07-25 00:21:04.353 687 687 I ActivityManager: Starting provision Activity: Intent { cmp=com.android.provision/.DefaultActivity }
07-25 00:21:04.353 687 687 I ActivityManager: START u0 {cmp=com.android.provision/.DefaultActivity} from uid 1000 on display 0
07-25 00:21:04.354 687 687 I ActivityManager: Starting com.android.setting.CryptKeeper: Intent { cmp=com.android.settings/.CryptKeeper }
07-25 00:21:04.354 687 687 I ActivityManager: START u0 {cmp=com.android.settings/.CryptKeeper} from uid 1000 on display 0
07-25 00:21:04.354 687 687 I ActivityManager: Starting service: Intent { cmp=com.netease.nemu_vapi_android.nemu/com.netease.nemu_vapi_android.service.ApiService }
07-25 00:21:16.336 687 715 E ActivityManager: Reason: Broadcast of Intent { act=android.media.SCO_AUDIO_STATE_CHANGED flg=0x10000010 cmp=com.tencent.mm/.booter.BluetoothReceiver (has extras) }
07-25 00:21:24.586 1001 1001 D NetConnInfoCenter: receive broadcast Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/emulated/0 flg=0x4000010 cmp=com.tencent.mobileqq/.msf.core.NetConnInfoCenter (has extras) }, init = true
07-25 00:21:24.782 914 914 I boot_progress_receive: broadcast: Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 cmp=com.netease.nemu_vapi_android.nemu/com.netease.nemu_vapi_android.receiver.LaunchReceiver (has extras) }
07-25 00:21:32.476 914 914 I boot_progress_receive: broadcast: Intent { act=android.intent.action.USER_PRESENT flg=0x24000010 cmp=com.netease.nemu_vapi_android.nemu/com.netease.nemu_vapi_android.receiver.LaunchReceiver }
07-25 00:21:32.574 914 914 I boot_progress_receive: broadcast: Intent { act=android.intent.action.BOOT_COMPLETED flg=0x8000010 cmp=com.netease.nemu_vapi_android.nemu/com.netease.nemu_vapi_android.receiver.LaunchReceiver (has extras) }
07-25 00:21:33.869 914 914 I boot_progress_receive: broadcast: Intent { act=android.intent.action.USER_PRESENT flg=0x24000010 cmp=com.netease.nemu_vapi_android.nemu/com.netease.nemu_vapi_android.receiver.LaunchReceiver }
07-25 00:39:59.762 687 707 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.mobileqq/.activity.SplashActivity bnds=[248,186][424,286]} from uid 1000 on display 0
07-25 00:40:03.305 687 726 I ActivityManager: START u0 {flg=0x40000 cmp=com.tencent.mobileqq/.activity.LoginActivity (has extras)} from uid 10034 on display 0
07-25 00:40:03.306 687 726 W ActivityManager: startActivity called from finishing ActivityRecord{dcbe48d u0 com.tencent.mobileqq/.activity.SplashActivity t2 f}; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { flg=0x40000 cmp=com.tencent.mobileqq/.activity.LoginActivity (has extras) }
使用adb shell可以进入手机内环境,进入内环境可以使用各种Linux命令(安卓的内核就是Linux)。
命令 | 说明 |
---|---|
ls | 列出当前目录下的文件和子目录 |
cd | 进入到特定子目录下 |
也可以不进入内环境,使用adb shell执行操作
命令 | 说明 |
---|---|
adb shell date | 查看当前系统时间 |
查看系统CPU使用情况 | adb shell cat /proc/cpuinfo |
查看系统内存使用情况 | adb shell cat /proc/meminfo |
查看所有应用 | adb shell pm list packages |
查看系统自带应用 | adb shell pm list packages -s |
查看第3方应用 | adb shell pm list packages -3 |
查看当前页面名 | adb shell "dumpsys window |
清除应用缓存,缓存存放在/data/data/包名 下面 | adb shell pm clear <包名> |
C:\Users\ZHUIAO>adb shell
root@x86_64:/ # cd vendor
root@x86_64:/vendor # ls
etc
lib
lib64
root@x86_64:/vendor # cd etc
root@x86_64:/vendor/etc # ls
misc
root@x86_64:/vendor/etc # exit
C:\Users\ZHUIAO>adb shell date
Mon Jul 25 22:09:04 CST 2022
C:\Users\ZHUIAO>adb shell
root@x86_64:/ # date
Mon Jul 25 22:09:11 CST 2022
root@x86_64:/ # exit
C:\Users\ZHUIAO>adb shell cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 142
model name : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
stepping : 9
cpu MHz : 2400.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch rdseed clflushopt
bugs :
bogomips : 5423.99
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 142
model name : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
stepping : 9
cpu MHz : 2400.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch rdseed clflushopt
bugs :
bogomips : 5423.99
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
C:\Users\ZHUIAO>adb shell cat /proc/meminfo
MemTotal: 2050448 kB
MemFree: 1245196 kB
MemAvailable: 1438860 kB
Buffers: 1968 kB
Cached: 221096 kB
SwapCached: 0 kB
Active: 627668 kB
Inactive: 110156 kB
Active(anon): 517940 kB
Inactive(anon): 4668 kB
Active(file): 109728 kB
Inactive(file): 105488 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 514860 kB
Mapped: 204400 kB
Shmem: 7848 kB
Slab: 34884 kB
SReclaimable: 13084 kB
SUnreclaim: 21800 kB
KernelStack: 10112 kB
PageTables: 15360 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1025224 kB
Committed_AS: 25924808 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 47484 kB
VmallocChunk: 34359660212 kB
DirectMap4k: 24512 kB
DirectMap2M: 2072576 kB
pm:package manager,包管理器
am:activity manager,页面的管理器
电脑文件推送到手机:adb push 电脑路径 设备路径
手机文件拉取到电脑:adb pull 设备路径 电脑路径
C:\Users\ZHUIAO>adb push C:\Users\ZHUIAO\Desktop\test.txt /sdcard
C:\Users\ZHUIAO\Desktop\test.txt: 1 file pushed.
C:\Users\ZHUIAO>adb pull /sdcard/test.txt C:\Users\ZHUIAO\Desktop\
/sdcard/test.txt: 1 file pulled.
系统自动记录近期的一些日志,如果日志量超过缓存大小,新日志就会覆盖掉旧的日志
日志等级 | 说明 |
---|---|
V | 明细verbose(最低优先级,最全的日志) |
D | 调试debug(一般调试用这个) |
I | 信息info |
W | 警告warn |
E | 错误error |
F | 严重错误fatal |
S | 无记载silent(最高优先级,全部日志都不会输出) |
命令:adb logcat
07-25 21:54:32.371 | 303 | 676 | D | NativeLibraryHelper: compilePackagePattern pattern = com.tencent.tmgp.bh3 abi = x86 |
---|---|---|---|---|
时间 | 进程号 | 子进程号 | 日志等级 | NativeLibraryHelper是这条日志的tag,方便开发用来做各种区分过滤,后面就是日志具体信息 |
C:\Users\ZHUIAO>adb logcat
--------- beginning of system
07-25 21:54:28.241 242 242 I vold : Vold 3.0 (the awakening) firing up
07-25 21:54:28.241 242 242 V vold : Detected support for: exfat ext4 iso9660 ntfs vfat
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.tencent\.tmgp\.bh3 abi = x86
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.(tencent\.tmgp\.)?bilibili\.snake.* abi = armeabi-v7a
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.yinhan\.skzh\.uc abi = armeabi-v7a
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.braygame\.GunDam abi = armeabi-v7a
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.braygame\.bc\.aligames abi = armeabi-v7a
adb logcat 打印默认日志数据
adb logcat -v time 打印时包含时间(默认是打印时间的)
adb logcat -v color 使用不同的颜色来显示每个优先级
adb logcat -f将日志输出到手机里面的文件
adb logcat > filename 保存日志到电脑,filename就是文件在电脑的路径
adb logcat -c 清除已存在的日志
adb logcat [TAG:LEVEL ] [TAG:LEVEL ] …根据Tag标签和log等级过滤log
使用adb logcat --help可以参考logcat命令详细用法
C:\Users\ZHUIAO>adb logcat --help
Usage: logcat [options] [filterspecs]
options include:
-s Set default filter to silent.
Like specifying filterspec '*:S'
-f <filename> Log to file. Default is stdout
-r <kbytes> Rotate log every kbytes. Requires -f
-n <count> Sets max number of rotated logs to <count>, default 4
-v <format> Sets the log print format, where <format> is:
brief color long printable process raw tag thread
threadtime time usec
-D print dividers between each log buffer
-c clear (flush) the entire log and exit
-d dump the log and then exit (don't block)
-t <count> print only the most recent <count> lines (implies -d)
-t ' print most recent lines since specified time (implies -d)
-T <count> print only the most recent <count> lines (does not imply -d)
-T ' print most recent lines since specified time (not imply -d)
count is pure numerical, time is 'MM-DD hh:mm:ss.mmm'
-g get the size of the log's ring buffer and exit
-L dump logs from prior to last reboot
-b <buffer> Request alternate ring buffer, 'main', 'system', 'radio',
'events', 'crash' or 'all'. Multiple -b parameters are
allowed and results are interleaved. The default is
-b main -b system -b crash.
-B output the log in binary.
-S output statistics.
-G <size> set size of log ring buffer, may suffix with K or M.
-p print prune white and ~black list. Service is specified as
UID, UID/PID or /PID. Weighed for quicker pruning if prefix
with ~, otherwise weighed for longevity if unadorned. All
other pruning activity is oldest first. Special case ~!
represents an automatic quicker pruning for the noisiest
UID as determined by the current statistics.
-P ' ...'
set prune white and ~black list, using same format as
printed above. Must be quoted.
filterspecs are a series of
<tag>[:priority]
where <tag> is a log component tag (or * for all) and priority is:
V Verbose (default for <tag>)
D Debug (default for '*')
I Info
W Warn
E Error
F Fatal
S Silent (suppress all output)
'*' by itself means '*:D' and <tag> by itself means <tag>:V.
If no '*' filterspec or -s on command line, all filter defaults to '*:V'.
eg: '*:S ' prints only <tag>, ':S' suppresses all <tag> log messages.
If not specified on the command line, filterspec is set from ANDROID_LOG_TAGS.
If not specified with -v on command line, format is set from ANDROID_PRINTF_LOG
or defaults to "threadtime"
“adb logcat -f /<文件>”的文件是放在手机端的,注意test.txt的路径是要有写入权限的,而且执行命令会一直写入test.txt,需要手动按Ctrl+C停止:
C:\Users\ZHUIAO\Desktop>adb logcat -f /sdcard/test.txt
^C
C:\Users\ZHUIAO\Desktop>adb shell
root@x86_64:/ # cd sdcard
root@x86_64:/sdcard # cat test.txt
--------- beginning of system
07-25 21:54:28.241 242 242 I vold : Vold 3.0 (the awakening) firing up
07-25 21:54:28.241 242 242 V vold : Detected support for: exfat ext4 iso9660 ntfs vfat
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.tencent\.tmgp\.bh3 abi = x86
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.(tencent\.tmgp\.)?bilibili\.snake.* abi = armeabi-v7a
07-25 21:54:32.371 303 676 D NativeLibraryHelper: compilePackagePattern pattern = com\.yinhan\.skzh\.uc abi = armeabi-v7a
adb logcat "*:W" 打印Warning及以上级别的日志,双引号可以省略
adb logcat ActivityManager:D "*:S" 过滤tag为ActivityManager,level在Debug及以上级别的日志
注意上面第2条:这里ActivityManager:D和":S" 是2个过滤,且必须要有’:S’,表示其他标签都使用LEVEL=S等级(就是不打印出来),否则会将其他标签其他等级都打印出来。另外,ActivityManager是管理所有页面的标签,也是一个系统级别的标签
C:\Users\ZHUIAO\Desktop>adb logcat "*:W"
--------- beginning of system
07-25 21:54:33.101 696 696 E PmsDeserialize: mSerializeEnable:true
07-25 21:54:33.162 696 696 W SystemConfig: No directory /system/etc/sysconfig, skipping
07-25 21:54:33.266 696 696 W PackageManager: Library not found: /system/framework/org.apache.http.legacy.jar
07-25 21:54:33.280 696 696 W PackageManager: Library not found: /system/framework/org.apache.http.legacy.jar
C:\Users\ZHUIAO\Desktop>adb logcat ActivityManager:D "*:S"
--------- beginning of system
07-25 21:54:32.913 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = ^com\.bilibili\.priconne.*
07-25 21:54:32.913 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = ^com\.miHoYo\.Yuanshen.*
07-25 21:54:32.913 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = ^com\.tencent\.tmgp\.wuxia
07-25 21:54:32.913 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = ^com\.hermes\.br\..*
07-25 21:54:32.913 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = com\.longtugame\.yjfb.*
07-25 21:54:32.914 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = com\.ss\.android\.ugc\.aweme
07-25 21:54:32.914 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = com\.tencent\.jkchess
07-25 21:54:32.914 696 696 D ActivityManager: readPageCacheLimitWhitelistPattern pattern = .*sy\.dldlhsdj.*
可以参考(需要连接外网):https://developer.android.com/topic/performance/vitals/crash
例如:奔溃(crash)的信息
在开发者选项中找到“输入”下的“指针位置”,就可以看到屏幕上方有显示触摸位置的坐标值信息
命令 | 说明 |
---|---|
text (Default: touchscreen) | 文本输入,不支持中文输入,例如: adb shell input text abcdefg |
keyevent [–longpress] … (Default: keyboard) | 按键 |
tap |
屏幕点击坐标,例如点击(67,316)位置: adb shell input tap 67 316 |
swipe |
滑动 adb shell swipe <起点x1> /<起点y1> <终点x1> <终点y1> /<滑动时长,单位毫秒> 例如从(235,623)滑动到(235,210),滑动时长2秒:adb shell input swipe 235 623 235 210 2000 注意滑动时间过短,滑动距离可能不太准确 |
press (Default: trackball) | 按压 |
roll |
滚动 |
上面的x和y坐标的值可以通过上述 打开 指针位置,查看对应位置的坐标。
可通过 命令adb shell input 查看输入命令帮助文档:
C:\Users\ZHUIAO>adb shell input
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
按键 | 命令 |
---|---|
返回键 | adb shell input keyevent 4 |
Home键 | adb shell input keyevent 3(置应用于后台运行) |
音量放大 | adb shell input keyevent 24 |
音量缩小 | adb shell input keyevent 25 |
其他按键可以在这里找到(需要外网):https://developer.android.com/reference/android/view/KeyEvent
下面是64974ms 到 4972ms,Load的最小值、均值和最大值,com.tencent.mm那行表示QQ的占用率为0.4%,其中0.1%是用户占用,0.2%是内核占用
C:\Users\ZHUIAO>adb shell dumpsys cpuinfo
Load: 0.29 / 0.29 / 0.31
CPU usage from 64974ms to 4972ms ago:
6.5% 282/surfaceflinger: 0.2% user + 6.3% kernel
0.4% 2118/com.tencent.mm: 0.1% user + 0.2% kernel / faults: 3087 minor
0.1% 285/local_gps: 0% user + 0% kernel
0% 1717/com.android.browser: 0% user + 0% kernel / faults: 22 minor
0% 1862/com.tencent.mm:push: 0% user + 0% kernel / faults: 2986 minor
0% 801/com.tencent.mobileqq:MSF: 0% user + 0% kernel / faults: 45 minor
0% 32/kpclimitd: 0% user + 0% kernel
0% 782/com.android.systemui: 0% user + 0% kernel / faults: 8 minor
0% 313/opengl-gc: 0% user + 0% kernel
8.9% TOTAL: 2.6% user + 6.3% kernel + 0% iowait + 0% softirq
查看当前系统的内存:adb shell dumpsys meminfo
查看某个应用的内存:adb shell dumpsys meminfo <应用名>
C:\Users\ZHUIAO>adb shell dumpsys meminfo
Applications Memory Usage (kB):
Uptime: 3768091 Realtime: 3768091
Total PSS by process:
141276 kB: com.tencent.mm (pid 2118)
119165 kB: com.tencent.mm:push (pid 1862)
80793 kB: com.tencent.mobileqq:MSF (pid 801)
60509 kB: system (pid 698)
53432 kB: com.mumu.launcher (pid 950 / activities)
上面显示的是程序占用的内存,这里省略n行
Total PSS by OOM adjustment:
42878 kB: Native
10121 kB: zygote (pid 309)
5833 kB: mediaserver (pid 300)
3428 kB: zygote64 (pid 308)
2751 kB: logd (pid 133)
2094 kB: surfaceflinger (pid 282)
省略n行
60509 kB: System
60509 kB: system (pid 698)
74603 kB: Persistent
40742 kB: com.android.systemui (pid 782)
20533 kB: com.netease.nemu_vapi_android.nemu (pid 943)
8358 kB: com.netease.nemu_vinput.nemu (pid 898)
4970 kB: com.mumu.audio (pid 922)
53432 kB: Foreground
53432 kB: com.mumu.launcher (pid 950 / activities)
341234 kB: B Services
141276 kB: com.tencent.mm (pid 2118)
119165 kB: com.tencent.mm:push (pid 1862)
80793 kB: com.tencent.mobileqq:MSF (pid 801)
93100 kB: Cached
29339 kB: com.mumu.acc (pid 1137)
26737 kB: com.mumu.store (pid 1588)
省略n行
Total PSS by category:
229151 kB: Unknown
168328 kB: Dalvik
81026 kB: .so mmap
68324 kB: .dex mmap
省略n行
Total RAM: 2050448 kB (status normal)
Free RAM: 1406208 kB (93100 cached pss + 43472 cached kernel + 1269636 free)
Used RAM: 667312 kB (572656 used pss + 94656 kernel)
Lost RAM: -23072 kB
Tuning: 128 (large 256), oom 322560 kB, restore limit 107520 kB (high-end-gfx)
例如获取QQ占用内存:
C:\Users\ZHUIAO>adb shell dumpsys meminfo com.tencent.mm
Applications Memory Usage (kB):
Uptime: 4221423 Realtime: 4221423
** MEMINFO in pid 2118 [com.tencent.mm] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 0 0 0 0 48448 43600 4847
Dalvik Heap 40415 40356 0 0 44272 42148 2124
Dalvik Other 9692 9688 0 0
Stack 56 56 0 0
Other dev 8 0 8 0
.so mmap 21296 8520 7556 0
.apk mmap 64 0 64 0
.dex mmap 17666 4 5172 0
.oat mmap 1653 0 64 0
.art mmap 1836 1176 0 0
Other mmap 238 8 212 0
Unknown 49357 49144 0 0
TOTAL 142281 108952 13076 0 92720 85748 6971
App Summary
Pss(KB)
------
Java Heap: 41532
Native Heap: 0
Code: 21380
Stack: 56
Graphics: 0
Private Other: 59060
System: 20253
TOTAL: 142281 TOTAL SWAP (KB): 0
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 3 Activities: 0
Assets: 2 AssetManagers: 2
Local Binders: 59 Proxy Binders: 26
Parcel memory: 17 Parcel count: 68
Death Recipients: 2 OpenSSL Sockets: 0
SQL
MEMORY_USED: 557
PAGECACHE_OVERFLOW: 123 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 96 120 4/29/6 /data/user/0/com.tencent.mm/no_backup/androidx.work.workdb
1 2 0/0/0 (attached) temp
4 96 30 4/20/5 /data/user/0/com.tencent.mm/no_backup/androidx.work.workdb (1)
4 28 20 2/17/3 /data/user/0/com.tencent.mm/databases/Scheduler.db
4 108 260 31/30/16 /data/user/0/com.tencent.mm/databases/google_app_measurement.db
Linux是用top命令获取性能指标的,Android也可以用top命令获取进程的占用情况。这是一个实时显示的命令(adb shell dumpsys cpuinfo是获取一段时间内CPU的情况),会不断输出当前系统的一些数据。
查看某个包的一些性能指标(注意Linux用grep,Windows用findstr):adb shell top | grep “包名”
设定每隔1秒打印一次:adb shell top -d 1 | grep “包名”
进程号PID | USER | PR | NI | VIRT | RES | SHR | S[%CUP] | %MEM | TIME+ARGS |
---|---|---|---|---|---|---|---|---|---|
282 | root | 12 | -8 | 36M | 2.3M | 1.0M | S 8.0 | 0.1 | 5:33.35 surfaceflinger |
C:\Users\ZHUIAO>adb shell top
[?25l[0m[H[JTasks: 78 total, 1 running, 77 sleeping, 0 stopped, 0 zombie
Mem: 2050448k total, 774200k used, 1276248k free, 5612k buffers
Swap: 0k total, 0k used, 0k free, 214504k cached
200%cpu 4%user 4%nice 12%sys 180%idle 0%iow 0%irq 0%sirq 0%host
[7m PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS [0m
282 root 12 -8 36M 2.3M 1.0M S 8.0 0.1 5:33.35 surfaceflinger
4432 root 20 0 5.9M 2.5M 2.0M R 4.0 0.1 0:00.00 top
2118 u0_a36 20 0 2.3G 185M 72M S 0.0 9.2 0:34.74 com.tencent.mm
2070 u0_a1 20 0 1.4G 32M 16M S 0.0 1.5 0:00.23 com.android.providers.calendar
2060 system 20 0 1.4G 28M 13M S 0.0 1.3 0:00.18 com.android.keychain
1975 u0_a3 20 0 1.4G 28M 13M S 0.0 1.4 0:00.19 com.android.defcontainer
1862 u0_a36 20 0 2.2G 161M 68M S 0.0 8.0 0:16.83 com.tencent.mm:push
1847 u0_a30 20 0 1.4G 29M 14M S 0.0 1.4 0:00.24 com.android.quicksearchbox
C:\Users\ZHUIAO>adb shell top| findstr com.tencent.mm
2118 u0_a36 20 0 2.3G 187M 73M S 0.0 9.3 0:35.89 com.tencent.mm
1862 u0_a36 20 0 2.2G 162M 69M S 0.0 8.0 0:17.00 com.tencent.mm:push
2118 u0_a36 20 0 2.3G 187M 73M S 0.3 9.3 0:35.89 com.tencent.mm
C:\Users\ZHUIAO>adb shell dumpsys battery
Current Battery Service state:
AC powered: true
USB powered: false
Wireless powered: false
Max charging current: 2000000 # 最大充电电流:mA
status: 2 # 电池状态:2:充电状态,其他数字为非充电状态
health: 2 # 电池健康状态:只有数字2表示good
present: true # 电池是否安装在机身
level: 68 # 电量:百分比
scale: 100
voltage: 4004 # 电池电压
temperature: 314 # 电池温度,单位是0.1摄氏度
technology: Li-poly # 电池种类
性能相关的具体用法可以在官网找到:https://developer.android.com/
C:\Users\ZHUIAO>adb shell monkey 100
Events injected: 100
// activityResuming(com.nemu.backgrounddownload)
## Network stats: elapsed time=2243ms (0ms mobile, 0ms wifi, 2243ms not connected)
参数 | 说明 | 示例 |
---|---|---|
-v | 打印详细的日志:(总共3个级别,vvv最详细) adb shell monkey -v <事件数> adb shell monkey -vv <事件数> adb shell monkey -vvv <事件数> |
adb shell monkey -v 10 |
-p | 运行某个包 指定一个包:adb shell monkey -p 包名 [时间数] 指定多个包:adb shell monkey -p 包名 -p 包名 [事件数] |
adb shell monkey -p com.tencent.mobileqq 10 |
–throttle |
每个事件结束后的间隔时间 | adb shell monkey -p com.tencent.mobileqq --throttle 300 -vvv 100 |
-s | 指定随机事件的种子数,如下面每个monkey都有种子数(:Monkey: seed=1660977938170 count=20),使用-s指定种子数可以复现该种子数的随机事件 | adb shell monkey -p com.tencent.mobileqq --throttle 300 -s 1660977938170 -vvv 100 |
如下,ACTION_MOVE移动、ACTION_DOWN按下、ACTION_UP抬起(按下抬起就是点击)
C:\Users\ZHUIAO>adb shell monkey -v 20
:Monkey: seed=1660977938170 count=20
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.gallery3d/.app.GalleryActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.gallery3d/.app.GalleryActivity } in package com.android.gallery3d
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-5.0)
:Sending Touch (ACTION_DOWN): 0:(120.0,102.0)
:Sending Touch (ACTION_UP): 0:(142.98206,80.942245)
:Sending Touch (ACTION_DOWN): 0:(363.0,87.0)
:Sending Touch (ACTION_UP): 0:(344.12848,86.39064)
Events injected: 20
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=3155ms (0ms mobile, 0ms wifi, 3155ms not connected)
// Monkey finished
C:\Users\ZHUIAO>adb shell monkey 1000
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
^C
C:\Users\ZHUIAO>adb shell
root@VIVO X20:/ # ps | grep monkey
root 2557 279 1373464 41460 0 7f8d41747d77 S com.android.commands.monkey
root@VIVO X20:/ # kill -9 2557
root@VIVO X20:/ # ps | grep monkey
1|root@VIVO X20:/ #
1|root@VIVO X20:/ #