Android Debug Bridge (adb)安卓调试桥,用来管理模拟器或设备。它采用的是C/S模式,主要包括三个部分:

  • Client 客户端:Client 运行在 PC 上,用于发送命令给服务器。Client 可以是命令行,也可能是 DDMS 等工具。
  • Daemon 守护程序 (adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
  • Server 服务器:Server作为后台程序运行在自己的电脑上。它有两个作用:1)检测 USB 端口感知设备的连接和拔除,以及模拟器实例的启动或停止;2)将 adb client 的请求通过 usb 或者 tcp 的方式发送到对应的 adbd 上。

ADB 通信

当 adb client 启动时,会先检查是否有 adb server 进程正在运行,如果没有,它会先启动 server 进程。(当我们执行一些常用的adb命令时,譬如adb devices、adb shell,server就自动启动了,也可以通过adb start-server来启动;如果想要停止 server 的运行,可以通过adb kill-server来杀掉server进程。)

  1. Server 启动的时候,会将自己绑定到本地的5037端口,当 Client 有请求到来时,便通过 TCP 连接 Server 的 5037 端口。
  2. Server 会与所有正在运行的设备建立连接,它通过扫描5555-5585之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接,请注意,每个模拟器都使用一对按顺序排列的端口(用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口)
  3. Server 与所有设备均建立连接后,便可以使用 adb 命令访问这些设备。

adb_architecture

1、 在PC HOST端,adb会fork出一个守护进程(不是adbd),即ADB Server,而父进程(ADB Client)继续处理Client请求,所有的Client通过TCP端口号5037进行与Server通信,而Server创建 local socket 与 remote socket,前者用于和Client通信,后者用与远端进行通信,emulator通过TCP,real device则通过usb。

2、在emulator/device端,adbd也创建 local socket 和 remote socket,前者与通过 jdwp 与Java虚拟机进程通信,后者通过 TCP/USB 与 PC HOST通信。

adb_communication

Client 和 Server 通信

Client 和 Server 通信的数据通道是一个本地 TCP 连接,ADB Server 启动以后,在本地的5037端口侦听。ADB Client 通过本地的随机端口与5037端口建立连接。

Client向Server发送的命令都遵循如下格式:

  1. 命令的长度(Length),由四位的十六进制表示
  2. 实际的命令(Payload),通过ASCII编码
1
2
3
4
5
6
7
8
9
# 示例:
## 查询adb版本命令
adb version

## client 发送的数据
000Chost:version
## 000C:表示”host:version”这条命令的长度为12个字节;
## host:命令类型(其他如 shell、pull等)
## version:命令字

Server收到Client的请求后,返回的数据遵循如下格式:

  1. 如果成功,则返回四个字节的字符串”OKAY“
  2. 如果失败,则返回四个字节的字符串”FAIL“和出错原因
  3. 如果异常,则返回错误码

当Client收到Server返回的”OKAY“后,就可以发继续发起其他操作命令了。

Client 和 Server 间传输的命令定义源码在 /system/core/adb/SERVICES.TXT 文件中。

Daemon 和 Server 通信

Daemon 和 Server 通信的 transport 协议的源码定义在 system/core/adb/protocol.txt 文件中。

ADB 调试手机

USB 调试

  1. 手机开启开发者选项和 USB 调试模式(通常开启方式:在关于手机连续点击7次版本号);
  2. USB 连接线和各种接口正常(个别三方数据线仅支持充电,不支持调试);
  3. 驱动状态正常(Linux 和 Mac 通常没有问题,Windows 可能需要安装);

WLAN 调试(Android 10 及更低版本,需要借助 USB)

Android 10以及更低的版本,必须通过 USB 连接后,才可实现同一 WLAN 下无线调试。

  1. 手机和电脑需连接在同一 WiFi 下;
  2. 手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices -l可以查看到手机);
  3. 设置手机的监听 adb tcpip 5555;
  4. 拔掉 USB 线,找到手机的 IP 地址;
  5. 通过 IP 连接到手机 adb connect ip(端口默认:5555);

Wi-Fi 调试(Android 11 及更高版本,无需借助 USB)

从 Android 11 开始支持 ADB 以无线方式连接手机调试,可以彻底摆脱 USB 线。

  1. 手机和电脑需连接在同一 WiFi 下;
  2. 保证 SDK 为最新版本(adb –version ≥ 30.0.0);
  3. 手机启用开发者选项和无线调试模式(会提示确认);
  4. 允许无线调试后,选择使用配对码配对。记下显示的配对码、IP 地址和端口号;
  5. 运行adb pair ip:port,使用第 4 步中的 IP 地址和端口号;
  6. 根据提示,输入第 3 步中的配对码,系统会显示一条消息,表明您的设备已成功配对;
  7. 运行 adb connect ip:port。(仅适用于 Linux 或 Windows)

ADB 常用命令行

设备情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看adb版本
$ adb version

# 查看adb帮助
$ adb --help

# 显示当前运行的全部设备
$ adb devices -l

# 发送命令到指定的设备
# 多个设备/模拟器,可使用 -s 选项将命令发送至指定设备。
# 只有一个模拟器,可使用 -e 选项将命令发送至该模拟器。
# 只有一个硬件设备,可使用 -d 选项将命令发送至该硬件设备。
$ adb -s [设备序列号] [命令]

启动与停止

1
2
3
4
5
# 启动ADB    
$ adb start-server

# 停止ADB   
$ adb kill-server

文件拷贝

1
2
3
4
5
# 将手机设备中的文件copy到本地计算机     
$ adb pull 设备目录 本地目录例

# 将本地计算机的文件copy到手机设备中   
$ adb push 本地目录 手机设备目录

日志 logcat

1
2
3
4
5
6
# 查看日志输出
# -c, --clear :清除(清空)所选的缓冲区并退出。
# -e <expr>, --regex=<expr> :只输出日志消息与正则表达式匹配的行。
# -f <filename> 将日志消息输出写入 <filename>。默认值为 stdout。
# --pid=<pid> ... 仅输出来自给定 PID 的日志。
adb logcat

应用安装与卸载

1
2
3
4
5
6
7
8
9
# 安装应用程序
# -r 重新安装该程序,保存数据
# -s 安装在SD卡内,而不是设备内部存储
# -t 安装测试 APK  
$ adb install -r [apk文件]

# 卸载应用程序
# -k 不删除程序运行所产生的数据和缓存目录(如软件的数据库文件)
$ adb uninstall [packagename]

shell

1
2
3
4
5
6
7
8
9
10
11
# 启动交互式 shell    
$ adb shell

# 使用超级用户 (需要 root 权限)
$ su

# 退出 shell/su (Ctrl + D)
$ exit

# 获取 shell 帮助
$ adb shell [命令] --help

已安装应用

1
2
3
4
5
6
7
8
# 查看所有已安装应用 
$ adb shell pm list package

# 查看系统应用
$ adb shell pm list packages -s

# 查看第三方应用
$ adb shell pm list packages -3

应用权限管理

1
2
3
4
5
# 向应用授予权限。
$ adb shell grant [package_name] [permission]

# 从应用撤消权限。
$ adb shell revoke [package_name] [permission]

截图录屏

1
2
3
4
5
6
7
# 屏幕截图
$ adb shell screencap [filename]

# 录屏
# 手动停止:Ctrl + C 键
# 自动停止:到三分钟或 --time-limit 设置的时间限制。
$ adb shell screenrecord [options] [filename]

配置读写

1
2
3
4
5
6
7
8
# 查看所有配置信息(以 ro 开头的为只读信息)
$ adb shell getprop

# 查看某一配置 (brand、model等)
$ adb shell getprop [key]

# 设置某一配置
$ adb shell setprop [key] [value]

进程信息

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
32
33
34
35
36
37
38
# 帮助 
$ adb shell ps --help

# 查看系统进程信息
$ adb shell ps -Af

# 示例结果
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:27:22 ? 00:00:11 init second_stage
shell 1020 1018 0 16:19:51 pts/2 00:00:02 installer -version 8a4580ab -daemon
logd 4708 1 0 03:27:26 ? 00:21:44 logd
system 4709 1 0 03:27:26 ? 00:00:32 servicemanager
system 4710 1 0 03:27:26 ? 00:00:49 hwservicemanager
root 4712 1 0 03:27:26 ? 00:01:36 watchdogd 10 20
root 4888 1 0 03:27:27 ? 00:00:57 zygote64
root 4889 1 0 03:27:27 ? 00:00:13 zygote
audioserver 4894 1 0 03:27:27 ? 00:00:54 android.hardware.audio@2.0-service
bluetooth 4895 1 0 03:27:27 ? 00:00:03 android.hardware.bluetooth@1.0-service
cameraserver 4896 1 0 03:27:27 ? 00:01:05 android.hardware.camera.provider@2.4-service_64
media 4900 1 0 03:27:27 ? 00:00:00 android.hardware.drm@1.0-service
wifi 4924 1 0 03:27:27 ? 00:00:13 android.hardware.wifi@1.0-service
gps 4926 1 0 03:27:27 ? 00:00:02 vendor.samsung.hardware.gnss@1.0-service
cameraserver 4935 1 0 03:27:27 ? 00:00:00 vendor.samsung_slsi.hardware.ofi@2.0-service
nobody 4958 1 0 03:27:27 ? 00:01:25 ashmemd
audioserver 4959 1 0 03:27:27 ? 00:01:09 audioserver
gpu_service 4960 1 0 03:27:27 ? 00:00:00 gpuservice
lmkd 4961 1 0 03:27:27 ? 00:02:48 lmkd
statsd 5035 1 0 03:27:27 ? 00:01:57 statsd
root 5036 1 0 03:27:27 ? 00:01:27 storaged
u0_a54 8380 4889 0 03:27:44 ? 00:00:31 com.vivo.magazine
u0_a105 8526 4888 0 15:42:49 ? 00:00:00 com.bbk.appstore:assist
graphics 8592 1 0 03:27:45 ? 00:00:00 roundphone
u0_a13 8607 4888 0 03:27:45 ? 00:04:58 android.process.media
shell 8642 1 0 03:27:46 ? 00:00:49 adbd --root_seclabel=u:r:su:s0
u0_a239 17551 4888 0 11:59:28 ? 00:00:00 com.gcloud.service:remote
u0_a239 17831 4888 0 19:34:30 ? 00:00:01 com.gcloud.service
u0_a205 29711 4888 0 22:31:23 ? 00:01:27 com.tencent.tmgp.sgame
u0_a205 30970 4888 0 23:01:49 ? 00:00:34 com.tencent.tmgp.sgame:xg_vip_service

CPU 信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看 CPU 信息
$ adb shell cat /proc/cpuinfo

# 查看 CPU 算力(CPU核在最大频点上对应的算力,大核为 1024)
$ adb shell cat sys/devices/system/cpu/{cpu?}/cpu_capacity

# 查看 CPU 最高频率
$ adb shell cat sys/devices/system/cpu/{cpu?}/cpufreq/cpuinfo_max_freq
$ adb shell cat sys/devices/system/cpu/{cpu?}/cpufreq/scaling_max_freq

# 查看 CPU 实时频率(需要root权限)
$ adb shell cat sys/devices/system/cpu/{cpu?}/cpufreq/cpuinfo_cur_freq
$ adb shell cat sys/devices/system/cpu/{cpu?}/cpufreq/scaling_cur_freq

# 示例结果
$ adb shell cat sys/devices/system/cpu/cpu5/cpufreq/cpuinfo_max_freq
1794000

$ adb shell cat sys/devices/system/cpu/cpu6/cpufreq/cpuinfo_max_freq
2210000

说明:部分机型无 cpu_capacity,如 Kirin960、三星 Exynos 980。

句柄信息

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 查看 Android 系统的最大线程数量(需要root权限)
$ cat /proc/sys/kernel/threads-max

# 查看 Android 系统的最大文件描述符数量(需要root权限)
$ cat /proc/sys/fs/file-max

# 查看 Android 进程的最大文件描述符数量 (nofiles/max open files)
$ adb shell cat /proc/{pid}/limit
$ adb shell ulimit -n
$ adb shell ulimit -a

# 查看 Android 特定进程的文件描述符使用信息(需要root权限)
$ ls -la /proc/{pid}/fd

# 查看 Android 特定进程的文件描述符使用总数(需要root权限)
$ ls -la /proc/{pid}/fd | wc -l

# 查看 Android 特定进程的打开文件信息(需要root权限)
$ lsof -p {pid}

# 查看 Android 特定进程的打开文件总数(需要root权限)
$ lsof -p {pid} | wc -l

# 示例结果
$ adb shell ls -la /proc/23143/fd
total 0
dr-x------ 2 root root 0 2022-01-20 10:37 .
dr-xr-xr-x 9 u0_a265 u0_a265 0 2022-01-20 10:37 ..
lrwx------ 1 root root 64 2022-01-20 11:46 0 -> /dev/null
lrwx------ 1 root root 64 2022-01-20 11:46 1 -> /dev/null
lr-x------ 1 root root 64 2022-01-20 11:46 10 -> /system/framework/com.meizu.camera.jar
lrwx------ 1 root root 64 2022-01-20 11:46 100 -> /dev/ashmem
lrwx------ 1 root root 64 2022-01-20 11:57 101 -> socket:[5929013]
lr-x------ 1 root root 64 2022-01-20 11:46 103 -> /proc/meminfo
lrwx------ 1 root root 64 2022-01-20 11:46 11 -> /dev/binder
lrwx------ 1 root root 64 2022-01-20 11:46 48 -> /storage/emulated/0/Android/data/com.tencent.itop.example/cache/GCloudSDKLog/GCloudCore/GCloudCore_2022012011.log
l-wx------ 1 root root 64 2022-01-20 11:46 52 -> /data/data/com.tencent.itop.example/app_bugly/sys_log_1642646225457.txt
lrwx------ 1 root root 64 2022-01-20 11:46 53 -> /data/data/com.tencent.itop.example/databases/bugly_db_
l-wx------ 1 root root 64 2022-01-20 11:46 63 -> /storage/emulated/0/Android/data/com.tencent.itop.example/cache/GameJoyRecorder/logs/2022-01-20/1.com.tencent.itop.example.log
lrwx------ 1 root root 64 2022-01-20 11:46 66 -> /storage/emulated/0/Android/data/com.tencent.itop.example/cache/GCloudSDKLog/GCloud/GCloud_2022012011.log
lr-x------ 1 root root 64 2022-01-20 11:46 77 -> /system/app/webview/webview.apk
lr-x------ 1 root root 64 2022-01-20 10:37 78 -> /data/app/com.tencent.itop.example-xzxryVolXCW3fxEYvEdsLA==/base.apk
lrwx------ 1 root root 64 2022-01-20 11:46 79 -> /data/data/com.tencent.itop.example/app_webview/webview_data.lock
lrwx------ 1 root root 64 2022-01-20 11:46 90 -> socket:[5777228]
lrwx------ 1 root root 64 2022-01-20 11:46 91 -> socket:[5777229]
lrwx------ 1 root root 64 2022-01-20 11:46 95 -> anon_inode:[eventpoll]
<省略...>
lrwx------ 1 root root 64 2022-01-20 11:46 96 -> socket:[5779061]
lrwx------ 1 root root 64 2022-01-20 11:46 97 -> socket:[5779062]
l-wx------ 1 root root 64 2022-01-20 11:46 99 -> pipe:[5779063]

进程的最大文件描述符数量,Linux 默认是1024,最新的 Android 设备大部分已经是大于1024的,例如:32768。

shell-dumpsys

查看 app 基础信息(AndroidManifest)

1
$ adb shell dumpsys package [包名]

查看 app Activity 信息( 任务栈、taskAffinity、进程id等)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 命令行
$ adb shell dumpsys activity activities

# 示例结果:
Stack #42: type=standard mAboveHome=false mode=fullscreen
isSleeping=false
mBounds=Rect(0, 0 - 0, 0)
Task id #63
mBounds=Rect(0, 0 - 0, 0)
mMinWidth=-1
mMinHeight=-1
mLastNonFullscreenBounds=null
* TaskRecord{5558e7a #63 A=com.gcloud.service U=0 DislayId=0 StackId=42 sz=1}
userId=0 effectiveUid=u0a239 mCallingUid=u0a101 mUserSetupComplete=true mCallingPackage=com.bbk.launcher2
affinity=com.gcloud.service
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.gcloud.service/.MainActivity}
mActivityComponent=com.gcloud.service/.MainActivity
autoRemoveRecents=false isPersistable=true numFullscreen=1 activityType=1
rootWasReset=true mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
Activities=[ActivityRecord{14337a8 u0 com.gcloud.service/.MainActivity d0 s42 t63}]
askedCompatMode=false inRecents=true isAvailable=true
mRootProcess=ProcessRecord{a26b54d 17831:com.gcloud.service/u0a239}
stackId=42
hasBeenVisible=true mResizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION mSupportsPictureInPicture=false isResizeable=true lastActiveTime=472305242 (inactive for 471s)
* Hist #0: ActivityRecord{14337a8 u0 com.gcloud.service/.MainActivity d0 s42 t63}
packageName=com.gcloud.service processName=com.gcloud.service
launchedFromUid=10101 launchedFromPackage=com.bbk.launcher2 userId=0
app=ProcessRecord{a26b54d 17831:com.gcloud.service/u0a239}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.gcloud.service/.MainActivity bnds=[47,1053][293,1323] }
frontOfTask=true task=TaskRecord{5558e7a #63 A=com.gcloud.service U=0 DislayId=0 StackId=42 sz=1}
taskAffinity=com.gcloud.service
mActivityComponent=com.gcloud.service/.MainActivity
baseDir=/data/app/com.gcloud.service-sg4jXwq7qBtNiUJLx6nqrg==/base.apk
dataDir=/data/user/0/com.gcloud.service
stateNotNeeded=false componentSpecified=true mActivityType=standard
compat={480dpi} labelRes=0x7f0b001f icon=0x7f0a0000 theme=0x7f0c0005
mLastReportedConfigurations:
mGlobalConfig={1.0 ?mcc?mnc [zh_CN] ldltr sw360dp w360dp h722dp 480dpi nrml long port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 90 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.1123 themeId=2 nightModeLevel = -1}
mOverrideConfig={1.0 ?mcc?mnc [zh_CN] ldltr sw360dp w360dp h722dp 480dpi nrml long port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 90 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.1 themeId=2 nightModeLevel = -1}
CurrentConfiguration={1.0 ?mcc?mnc [zh_CN] ldltr sw360dp w360dp h722dp 480dpi nrml long port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 90 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.1 themeId=2 nightModeLevel = -1}
taskDescription: label="null" icon=null iconResource=0 iconFilename=null primaryColor=ff6200ee
backgroundColor=fffafafa
statusBarColor=ff3700b3
navigationBarColor=ff000001
launchFailed=false launchCount=0 lastLaunchTime=-2h47m30s258ms
haveState=false icicle=null
state=RESUMED stopped=false delayedResume=false finishing=false
keysPaused=false inHistory=true visible=true sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_SHOWN
fullscreen=true noDisplay=false immersive=false launchMode=0
frozenBeforeDestroy=false forceNewConfig=false
mActivityType=standard
nowVisible=true lastVisibleTime=-7m51s683ms
connections=com.android.server.wm.ActivityServiceConnectionsHolder@8dcea88
resizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION
mLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=false

Running activities (most recent first):
TaskRecord{5558e7a #63 A=com.gcloud.service U=0 DislayId=0 StackId=42 sz=1}
Run #0: ActivityRecord{14337a8 u0 com.gcloud.service/.MainActivity d0 s42 t63}

mResumedActivity: ActivityRecord{14337a8 u0 com.gcloud.service/.MainActivity d0 s42 t63}
mLastPausedActivity: ActivityRecord{14337a8 u0 com.gcloud.service/.MainActivity d0 s42 t63}

查看 app Service 信息( 任务栈、taskAffinity、进程id等)

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
# 命令行
$ adb shell dumpsys activity services

# 示例结果:
* ServiceRecord{60f8e14 u0 com.vivo.doubleinstance/.WhitelistQureyService}
intent={act=com.vivo.doubleinstance.WhitelistQureyService cmp=com.vivo.doubleinstance/.WhitelistQureyService}
packageName=com.vivo.doubleinstance
processName=com.vivo.doubleinstance
baseDir=/system/app/DoubleInstance/DoubleInstance.apk
dataDir=/data/user_de/0/com.vivo.doubleinstance
app=ProcessRecord{2e22b71 7441:com.vivo.doubleinstance/1000}
createTime=-3d10h34m3s709ms startingBgTimeout=--
lastActivity=-2d19h30m48s638ms restartTime=-3d10h33m58s55ms createdFromFg=true
Bindings:
* IntentBindRecord{77dc8c9 CREATE}:
intent={act=com.vivo.doubleinstance.WhitelistQureyService cmp=com.vivo.doubleinstance/.WhitelistQureyService}
binder=android.os.BinderProxy@831ebce
requested=true received=true hasBound=true doRebind=false
* Client AppBindRecord{26e5aef ProcessRecord{63fc96 26882:com.bbk.launcher2/u0a101}}
Per-process Connections:
ConnectionRecord{3a5c59a u0 CR com.vivo.doubleinstance/.WhitelistQureyService:@d82ac26}
ConnectionRecord{c7b1067 u0 CR com.vivo.doubleinstance/.WhitelistQureyService:@d82ac26}
* Client AppBindRecord{c8bb9fc ProcessRecord{541bd07 21602:com.vivo.globalsearch/u0a74}}
Per-process Connections:
ConnectionRecord{a43da91 u0 CR com.vivo.doubleinstance/.WhitelistQureyService:@3a8fcb8}
All Connections:
ConnectionRecord{a43da91 u0 CR com.vivo.doubleinstance/.WhitelistQureyService:@3a8fcb8}
ConnectionRecord{c7b1067 u0 CR com.vivo.doubleinstance/.WhitelistQureyService:@d82ac26}
ConnectionRecord{3a5c59a u0 CR com.vivo.doubleinstance/.WhitelistQureyService:@d82ac26}

其他常用命令

netstat

netstat:用于显示各种网络相关信息,如网络连接,路由表,接口状态

1
2
3
4
5
6
7
8
9
10
netstat -a (all)显示所有选项,默认不显示LISTEN相关
netstat -t (tcp)仅显示tcp相关选项
netstat -u (udp)仅显示udp相关选项
netstat -n 拒绝显示别名,能显示数字的全部转化成数字。
netstat -l 仅列出有在 Listen (监听) 的服務状态
netstat -p 显示建立相关链接的程序名
netstat -r 显示路由信息,路由表
netstat -e 显示扩展信息,例如uid等
netstat -s 按各个协议进行统计
netstat -c 每隔一个固定时间,执行该netstat命令。

lsof

lsof:(列出打开文件lists openfiles)能看到pid和用户(有权限控制,只能看到本用户),可以找到哪个进程占用了这个端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
lsof `which httpd` //那个进程在使用apache的可执行文件
lsof /etc/passwd //那个进程在占用/etc/passwd
lsof /dev/hda6 //那个进程在占用hda6
lsof /dev/cdrom //那个进程在占用光驱
lsof -c sendmail //查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
lsof -p 30297 //显示那些文件被pid为30297的进程打开
lsof -D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列
lsof -u1000 //查看uid是100的用户的进程的文件使用情况
lsof -utony //查看用户tony的进程的文件使用情况
lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
lsof -i //显示所有打开的端口
lsof -i:80 //显示所有打开80端口的进程
lsof -i -U //显示所有打开的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数
▌显示瞬间进程的状态

参考文档

https://developer.android.com/studio/command-line/adb?hl=zh-cn
https://developer.android.com/studio/command-line/logcat?hl=zh-cn
https://itimetraveler.github.io/2019/06/07/Android%20ADB%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/
https://cloud.tencent.com/developer/article/1809910
https://blog.csdn.net/weixin_44203158/article/details/108359975