现在很多设备都是Android系统开发的,包括游戏机,智能售货机,垃圾回收机,安卓手机,机顶盒,车载电脑等等。
需要操作设备里面的东西,就需要用到adb命令,下面是常用的adb命令。

技术实现原理

adb 是一个三层结构

adb(Android Debug Bridge)名字里的 bridge 就是它的架构:PC 端命令行客户端 ↔ 本机 adb 服务器 ↔ 设备端 adbd 守护进程

  • 你敲的每条 adb 命令都是客户端,它把请求交给本机常驻的 adb 服务器(默认监听 5037 端口),由服务器统一管理所有已连接设备;
  • 设备端的 adbd 负责真正执行,再把结果传回来。

这个结构解释了两件常遇到的事:一是服务器会常驻,设备状态错乱(显示 offline/unauthorized)时 adb kill-server 再重连是第一招,重启的就是中间那层;二是同一台 PC 可以同时挂多台设备,多设备时命令要加 -s 序列号 指定目标,否则会报 more than one device。

为什么能通过网络 connect

adb 到设备有两条路:USB,以及 TCP。adb connect ip:5555 走的是后者——设备端 adbd 在 5555 端口监听。手机默认只开 USB 调试不监听网络(要先 USB 连着执行 adb tcpip 5555 打开),而机顶盒、车机、售货机这类没有 USB 调试口的设备,固件通常默认开放了网络 adbd,所以插上网线/连上 Wi-Fi 就能直接 connect,这也是搞这些设备的人最常用的一条命令。

命令里的 am / pm / aapt 是谁

  • am(Activity Manager):管理四大组件,am start 就是让系统按 Intent 启动一个 Activity;-W 表示等到启动完成并打印耗时;
  • pm(Package Manager):包管理,pm list packages 列出已装应用;
  • aapt:PC 端的 APK 解析工具,直接读 APK 里编译后的 AndroidManifest(二进制 XML),所以不用装到设备上就能查包名和入口 Activity——写自动化脚本、做逆向分析都靠它先摸清"包名/入口"这两个值。

另外注意过滤命令跑在哪端:adb shell pm list package | grep xxx 的 grep 在设备端(toybox 提供)可用;而 aapt 在 PC 上跑,Windows 下过滤要换 findstr。

通过ip连接设备

1
adb connect ip:5555

例如:

1
adb connect 192.168.1.61:5555

安装应用

加上-r参数覆盖安装

1
adb install -r apk文件路径

卸载APP

1
adb uninstall -k <apk名称>

查看包名

1
pm list package | grep  "包名称"

grep——过滤某个包名

查询APP的包名

1
aapt dump badging 包名(apk)| findstr package

例如

aapt dump badging com.zhaopin.social_8006.apk |findstr package

查询APP的Activity的值

1
aapt dump badging 包名(apk)| findstr activity

例如

1
aapt dump badging com.zhaopin.social_8006.apk |findstr activity 

启动app

1
adb shell am start -W -n 包名/启动的Activity

例如

adb shell am start -W -n com.zhaopin.social/com.zhaopin.social.SplashActivity

上传文件

adb push <local> <remote>

下载文件

1
adb pull <remote> <local>

屏幕截图

1
adb shell screencap /sdcard/***.png

adb服务启动

1
adb start server

adb服务关闭

1
adb kill server

进入命令行

1
adb shell

踩坑记录与注意事项

  • connect 不上:先 ping 通、确认 5555 端口(telnet ip 5555 试一下);手机类设备默认不监听网络 adbd,要 USB 执行 adb tcpip 5555 后再拔线;部分量产固件干脆去掉了网络 adbd;
  • 设备显示 offline/unauthorizedadb kill-server 后重连;首次连接要在设备屏幕上点允许调试的授权弹窗,机顶盒/车机没屏幕或没弹窗时最麻烦,接 USB 或重新烧授权文件;
  • 多设备必须 -s 指定adb devices 先看序列号,adb -s 192.168.1.61:5555 shell 这样用;
  • install 报 INSTALL_FAILED_UPDATE_INCOMPATIBLE:设备上已有签名不同的同包名应用(常见于调试版换正式版),先 adb uninstall 包名 再装,-r 覆盖装解决不了签名冲突;
  • aapt 是 PC 端工具:别在 adb shell 里敲 aapt;同理 Windows 下 PC 端管道过滤用 findstr 不是 grep;
  • push 到系统分区失败:/system、/vendor 挂载为只读,要 push 就先 remount(需要固件允许)或推到 /data/local/tmp;
  • screencap 生成的文件在设备上adb shell screencap /sdcard/x.png 只是截图存到设备,还要 adb pull 拉回 PC,两步别少一步。