背景
这两天在排查自动化测试平台中,adb.exe 开启过多的问题。(200个)
这是一个很糟糕的表现,当客户端的连接数过多时,会对 Android 的 adbd 带来过多的 socket 连接,进而影响系统性能。
开始排查
仅仅通过在开启 adb 的位置加 log,并不能取得什么效果。程序里用的是 Runtime.exec 去执行 adb 命令,通过单独执行这样的代码,测试半个小时,未见 adb.exe 增多的情况。从测试平台的代码上,已经没有什么大的突破口了
找到突破口
于是从 windows 侧寻找突破点,毕竟进程是在 windows 上处于未关闭的状态,那么是否有相关的 windows 工具能够检查某个进程的?是的,使用 windows 命令 tasklist 查看当前的 adb 进程
C:\>tasklist |findstr adb.exe
adb.exe 19136 Console 1 13,572 K
adb.exe 16380 Console 1 9,308 K
adb.exe 6868 Console 1 9,316 K
虽然能够看到个数,但是它究竟是谁启动的,怎么启动的,一无所获。这给排查带来了阻碍。
再尝试有没有别的指令,能够获取更详细的信息?没错,就是 wmic,它简直比 tasklist 强大 100倍。
C:\>wmic process where name="adb.exe" get /format:value
Caption=adb.exe
CommandLine=adb logcat
CreationClassName=Win32_Process
CreationDate=20190724151227.904509+480
CSCreationClassName=Win32_ComputerSystem
CSName=CHJ-THINKPAD-HW
Description=adb.exe
ExecutablePath=D:\android-sdk\platform-tools\adb.exe
ExecutionState=
Handle=14980
HandleCount=218
InstallDate=
KernelModeTime=389062500
MaximumWorkingSetSize=1380
MinimumWorkingSetSize=200
Name=adb.exe
OSCreationClassName=Win32_OperatingSystem
OSName=Microsoft Windows 10 专业版|C:\WINDOWS|\Device\Harddisk1\Partition1
OtherOperationCount=584392
OtherTransferCount=63483134
PageFaults=218485
PageFileUsage=9300
ParentProcessId=1700
PeakPageFileUsage=15612
PeakVirtualSize=175087616
PeakWorkingSetSize=12400
Priority=8
PrivatePageCount=9523200
ProcessId=14980
QuotaNonPagedPoolUsage=24
QuotaPagedPoolUsage=215
QuotaPeakNonPagedPoolUsage=286
QuotaPeakPagedPoolUsage=216
ReadOperationCount=1
ReadTransferCount=1732
SessionId=1
Status=
TerminationDate=
ThreadCount=6
UserModeTime=103906250
VirtualSize=161447936
WindowsVersion=10.0.16299
WorkingSetSize=11182080
WriteOperationCount=764
WriteTransferCount=775
以上命令输出了关于 adb.exe 这个进程比较详细的信息,发现有两行非常管用
CommandLine=adb logcat 和 ExecutablePath=D:\android-sdk\platform-tools\adb.exe
记录了此进程是通过什么命令执行以及它的启动路径。于是我们据此就可以排查,是什么命令未正常关闭,从而更有针对性的去解决 adb 开启过多的问题。
该命令可以进一步简化我们只需要的两条关键信息
C:\>wmic process where name="adb.exe" get CommandLine,ExecutablePath
CommandLine ExecutablePath
adb -L tcp:5037 fork-server server --reply-fd 596 D:\asset\android-sdk\platform-tools\adb.exe
adb logcat D:\Tools\android-sdk-windows\platform-tools\adb.exe
第一条是 asset 目录下开启的 adb server,第二条 Tools 目录下 adb client 执行的 adb logcat 命令,定位得非常清晰了。