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进程。)
Server 启动的时候,会将自己绑定到本地的5037端口,当 Client 有请求到来时,便通过 TCP 连接 Server 的 5037 端口。
Server 会与所有正在运行的设备建立连接,它通过扫描5555-5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接,请注意,每个模拟器都使用一对按顺序排列的端口(用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口)
Server 与所有设备均建立连接后,便可以使用 adb 命令访问这些设备。
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通信。
Client 和 Server 通信 Client 和 Server 通信的数据通道是一个本地 TCP 连接,ADB Server 启动以后,在本地的5037端口侦听。ADB Client 通过本地的随机端口与5037端口建立连接。
Client向Server发送的命令都遵循如下格式:
命令的长度(Length),由四位的十六进制表示
实际的命令(Payload),通过ASCII编码
1 2 3 4 5 6 7 8 9 adb version 000Chost:version
Server收到Client的请求后,返回的数据遵循如下格式:
如果成功,则返回四个字节的字符串”OKAY“
如果失败,则返回四个字节的字符串”FAIL“和出错原因
如果异常,则返回错误码
当Client收到Server返回的”OKAY“后,就可以发继续发起其他操作命令了。
Client 和 Server 间传输的命令定义源码在 /system/core/adb/SERVICES.TXT 文件中。
Daemon 和 Server 通信
Daemon 和 Server 通信的 transport 协议的源码定义在 system/core/adb/protocol.txt 文件中。
ADB 调试手机 USB 调试
手机开启开发者选项和 USB 调试模式(通常开启方式:在关于手机连续点击7次版本号);
USB 连接线和各种接口正常(个别三方数据线仅支持充电,不支持调试);
驱动状态正常(Linux 和 Mac 通常没有问题,Windows 可能需要安装);
WLAN 调试(Android 10 及更低版本,需要借助 USB) Android 10以及更低的版本,必须通过 USB 连接后,才可实现同一 WLAN 下无线调试。
手机和电脑需连接在同一 WiFi 下;
手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices -l可以查看到手机);
设置手机的监听 adb tcpip 5555;
拔掉 USB 线,找到手机的 IP 地址;
通过 IP 连接到手机 adb connect ip(端口默认:5555);
Wi-Fi 调试(Android 11 及更高版本,无需借助 USB) 从 Android 11 开始支持 ADB 以无线方式连接手机调试,可以彻底摆脱 USB 线。
手机和电脑需连接在同一 WiFi 下;
保证 SDK 为最新版本(adb –version ≥ 30.0.0);
手机启用开发者选项和无线调试模式(会提示确认);
允许无线调试后,选择使用配对码配对。记下显示的配对码、IP 地址和端口号;
运行adb pair ip:port,使用第 4 步中的 IP 地址和端口号;
根据提示,输入第 3 步中的配对码,系统会显示一条消息,表明您的设备已成功配对;
运行 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