引言

我们知道,Android程序安装和调试都可通过adb来实现。adb原理看似简单,其实涉及到的知识和原理很多也比较复杂,要想完全弄清楚adb的原理和运行机制,除了查阅官方资料、网上的相关资料(这里提供两份参考资料,请下载adb原理.pdfAndroid远程控制技术.pdf,不过个人认为这两份资料并未将adb原理讲透将明白,也缺乏实际的场景抓包说明),实际动手(抓包、测试)都不可少,本文下面章节对adb原理做详细介绍。

adb原理分析

(待续)

adb常用命令介绍

  1. adb命令详解(官方文档)
    adb命令的官方文档和命令使用请参见https://developer.android.com/studio/command-line/adb.html。里面对命令的各种参数和子命令都有详细的介绍,可以根据需要,查阅对应的子命令章节。
  2. 通过命令行学习
    打开命令行,这里以windows系统为例。如果没有将adb.exe的父目录添加到环境变量path路径中,那么在命令行里面需要输入adb命令的全路径。adb.exe在%ANDROID_HOME%\platform-tools下,其中%ANDROID_HOME%代表你电脑上Android SDK的安装路径。
    打开命令行,输入adb命令,就可以看到命令的帮助信息,从中也可以了解有哪些子命令和参数可用。如下图所示:
    adb命令
  3. 常用命令介绍
    adb命令通用格式
    参见官方文档:http://developer.android.com/intl/zh-cn/tools/help/adb.html

    adb [-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

常见问题

  1. 打开adb时(在命令行输入adb命令的时候)出现类似报错:
    adb server version (31) doesn’t match this client (39); killing…
    error: could not install smartsocket listener: cannot bind to 127.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掉;

  • 具体步骤:

    1. Netstat –ano|findstr “5037”,找到正在使用5037端口的进程ID;
    2. tasklist|findstr "<PID号>"(其中<PID>为步骤1中查询到的进程ID号),查看该PID对应的进程名称;
    3. 通过任务管理器的详细信息栏(适用于windows7以上版本系统),找到对应PID和进程名称的进程,kill之(或者直接用taskkill /F /PID <PID>命令直接kill对应PID的进程也可,其中<PID>为步骤1中查询到的进程ID号);
    4. 重新打开命令行然后输入adb devices即可;