引言
我们知道,Android程序安装和调试都可通过adb来实现。adb原理看似简单,其实涉及到的知识和原理很多也比较复杂,要想完全弄清楚adb的原理和运行机制,除了查阅官方资料、网上的相关资料(这里提供两份参考资料,请下载adb原理.pdf、Android远程控制技术.pdf,不过个人认为这两份资料并未将adb原理讲透将明白,也缺乏实际的场景抓包说明),实际动手(抓包、测试)都不可少,本文下面章节对adb原理做详细介绍。
adb原理分析
(待续)
adb常用命令介绍
- adb命令详解(官方文档)
adb命令的官方文档和命令使用请参见https://developer.android.com/studio/command-line/adb.html。里面对命令的各种参数和子命令都有详细的介绍,可以根据需要,查阅对应的子命令章节。 - 通过命令行学习
打开命令行,这里以windows系统为例。如果没有将adb.exe的父目录添加到环境变量path路径中,那么在命令行里面需要输入adb命令的全路径。adb.exe在%ANDROID_HOME%\platform-tools
下,其中%ANDROID_HOME%
代表你电脑上Android SDK的安装路径。
打开命令行,输入adb命令,就可以看到命令的帮助信息,从中也可以了解有哪些子命令和参数可用。如下图所示:
- 常用命令介绍
adb命令通用格式:
参见官方文档:http://developer.android.com/intl/zh-cn/tools/help/adb.htmladb [-d|-e|-s
] <command>
获取系统版本
adb shell getprop ro.build.version.release
查看手机SDK API Level
adb shell getprop ro.build.version.sdk
查看手机CPU信息
adb shell getprop ro.product.cpu.abi
或按照下面命令序列依次输入,即进入Android手机的shell命令行,读取
cpuinfo
文件的内容adb shell
cd /proc
cat cpuinfo
发送文件到手机
adb push [-p] <local> <remote>
命令说明:
- copy file/dir to device(复制文件或目录至手机设备)
- (‘-p’ to display the transfer progress),-p参数表示显示传输进度
- local为本地的文件目录(全路径)
- remote为手机端指定存放目录(Linux风格,/开头,如/data/dir)
从手机拉取文件到本地
adb pull [-p] [-a] <remote> [<local>]
命令说明:
- copy file/dir from device(从手机设备复制文件或目录至本机)
- (‘-p’ to display the transfer progress),-p参数表示显示传输进度
- (‘-a’ means copy timestamp and mode),复制文件的同时复制文件的时间戳和模式(权限模式)
- local为本地的文件目录(全路径)
- remote为手机端指定存放目录(Linux风格,/开头,如/data/dir)
- 示例(e.g.)
adb pull -p /default.prop D:\
adb shell dumpsys
默认打印出当前系统所有service信息,在后面可加上具体的服务名 需要列出当前运行的服务,可运行:adb shell dumpsys | findstr DUMP
查看手机上层(顶层)Activity的名字
adb shell dumpsys activity -h 加上-h可以获取帮助信息
linux:
adb shell dumpsys activity | grep “mFocusedActivity”
windows:
adb shell dumpsys activity | findstr “mFocusedActivity”
查看UI层级
adb shell uiautomator dump
查看手机分辨率
adb shell wm size
或
adb shell dumpsys window displays
查看机型(手机型号)时,可以使用以下命令:
adb shell getprop ro.product.model
如果我们忘记具体系统属性的名字,我们可以使用grep进行过滤,比如:
windows系统:adb shell getprop | findstr product
或
adb shell cat /system/build.prop | findstr product
Linux系统:
adb shell getprop | grep product
或
adb shell cat /system/build.prop | grep product
常见问题
- 打开adb时(在命令行输入adb命令的时候)出现类似报错:
adb server version (31) doesn’t match this client (39); killing…
error: could not install smartsocket listener: cannot bind to127.0.0.1:5037:
通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)
原因:电脑上安装了其他手机助手,比如360,腾讯手机管家等,其开启了adb server,但是这些软件自带的adb版本与当前Android SDK路径(添加进了系统path)下的adb(位于
%ANDROID_HOME%\platform-tools
下,其中%ANDROID_HOME%
代表你电脑上Android SDK的安装路径)版本不一致,从命令行运行adb devices或者adb start-server,会从Android SDK路径下(已加入到了环境变量path中)的adb启动adb server,
从而与当前正在运行的其他软件开启的adb server冲突。而两个版本的server都默认监听5037端口,从而导致系统提示”cannot bind to 127.0.0.1:5037
,只能使用一次”的字样。解决办法:
查找是哪个软件开启了adb server,然后将其进程kill掉;具体步骤:
- Netstat –ano|findstr “5037”,找到正在使用5037端口的进程ID;
tasklist|findstr "<PID号>"
(其中<PID>
为步骤1中查询到的进程ID号),查看该PID对应的进程名称;- 通过任务管理器的详细信息栏(适用于windows7以上版本系统),找到对应PID和进程名称的进程,kill之(或者直接用
taskkill /F /PID <PID>
命令直接kill对应PID的进程也可,其中<PID>
为步骤1中查询到的进程ID号); - 重新打开命令行然后输入adb devices即可;