zoukankan      html  css  js  c++  java
  • Android 官方命令深入分析之Android Debug Bridge(adb)

    作者:宋志辉
    Android Debug Brideg(adb)是一个多用途的命令行工具。可以与Android虚拟机进行通信或连接真机。它同样提供了访问设备shell的高级命令行操作的权限。它是一个包含以下三部分的客户端-服务端程序:

    • 一个客户端,运行在你的开发设备上。你可以通过adb命令来从shell中调用一个客户端。或者通过ADT插件和DDMS创建adb客户端。
    • 一个服务端,作为一个后台进程运行在你的开发设备中。服务端负责客户端和虚拟机或设备中adb守护进程的通信。
    • 一个守护进程,运行在虚拟机和设备中的一个后台进程。

    你可以在/platform-tools/中找到adb工具。

    当你启动一个adb客户端时,客户端首先检查这里是否已经有一个服务端进程在运行。如果没有,则启动服务端进程。当服务端进程运行后,与本地的TCP的5037端口,并且监听发自客户端的命令-所有的adb 客户端都通过5037端口与adb 服务端进行通信。

    接下来服务端建立起与所有运行的虚拟机和设备的连接。它通过扫描5555到5585端口的奇数端口来确定运行的虚拟机或设备的实例。当服务端发现一个adb守护进程,就通过这个端口建立连接。需要注意的是,每个虚拟机或设备都需要两个端口:一个偶数端口用来进行控制台连接,一个奇数端口用来adb 连接。
    比如:
    宋志辉的虚拟机,控制台端口:5554
    宋志辉的虚拟机,adb端口:5555

    如上所示,虚拟机实例连接到5555端口,控制台监听5554端口。

    一旦服务器建立起所有虚拟机的连接,你可以使用adb命令来访问这些设备。因为服务端管理与设备或虚拟机的连接并且处理来自adb客户端的命令。你可以使用任何的客户端来控制任意的虚拟机或设备。

    允许adb 调试

    为了使adb可以通过USB连接设备,必须在系统设置中找到 开发者选项 开启USB调试。

    在Android 4.2及以上版本中,开发者选项默认是隐藏的。要显示出来,点击“设置”“关于”“构建版本”7次。返回之前的屏幕可以找到“开发者选项”。

    在有些设备中,开发者选项 可能显示出来或者名称不同。

    注意:当你连接一个高于Android4.2.2版本的设备到计算机时,手机会弹窗提示是否同意一个RSA密钥来运行这台计算机进行调试。这个安全机制用来保护用户的设备,因为除非你解锁设备,否则其他的adb命令无法运行。这需要adb版本大于等于1.0.31(SDK大于等于16.0.1)。

    语法

    你可以在你的电脑上通过命令行来运行adb命令。用法如下:

    adb [-d|-e|-s <设备号>] <命令>
    

    如果这里只有一个虚拟机或设备运行,adb默认发送到这台设备或虚拟机。如果有多个虚拟机或设备存在,你需要使用-d, -e, 或 -s选项指明运行命令的设备。

    命令

    下面的表格列出了所有的支持的adb命令并解释了含义和用途。

    分类 命令 描述
    目标设备 -d 传递一个adb命令到仅有的usb设备上
    -e 传递一个adb命令到仅有的虚拟机上
    -s 传递一个adb命令到指定的设备上
    通用 devices 列出当前运行的虚拟机或设备列表
    help 列出adb命令的帮助列表
    version 输出adb的版本
    调试 logcat [option] [filter-specs] 打印log数据到屏幕上
    bugreport 输出dumpsys, dumpstate和logcat数据到屏幕上
    jdwp 列出指定的设备的可用的JDWP进程
    数据 install 安装Android应用到虚拟机或设备中
    pull 从虚拟机或设备中复制文件到电脑上
    push 从电脑上复制文件到虚拟机或设备中
    端口和网络 forward sockets连接用到的命令
    ppp 通过USB运行PPP
    脚本 get-serialno 获取adb实例的序列号字符串
    get-state 获取虚拟机或设备的adb状态
    wait-for-device 阻断执行直到设备在线
    服务端 start-server 检测adb服务端是否运行,如果不,则运行
    stop-server 终止adb服务端进程
    shell shell 在指定设备或虚拟机中启动远程的shell

    查询虚拟机或设备实例

    在使用adb命令之前,了解当前运行了多少虚拟机或设备是很有必要的。可以通过指定的命令生成一个当前运行的列表:

    adb devices

    作为回应adb输出所有设备的状态信息:

    • 序列号。由adb创建的用于唯一标示虚拟机或设备的字符串。
    • 状态。实例运行的状态(offline,device,no device)。

    输出的格式如下:

    [序列号] [状态]

    下面是devices命令的一个例子:

    adb devices
    List of devices attached
    emulator-5554  device
    emulator-5556  device
    emulator-5558  device

    指定特定的虚拟机或设备

    如果是多个设备或虚拟机在运行,你需要指定运行adb命令的实例。可以使用命令中的-s来实现:

    adb -s <序列号> <命令> 

    可以通过devices命令获取序列号。

    adb -s emulator-5556 install helloWorld.apk

    需要注意的是,当多个设备运行时,你没有通过-s指定设备,运行adb命令会报错。
    如果有一个或多个设备,但只有一个虚拟机,可以使用-e命令在虚拟机运行;如果有一个或多个虚拟机,但只有设备,可以使用-d在设备运行。

    安装一个应用

    你可以使用adb命令从开发计算机中复制一个应用到虚拟机或设备中。可以使用install命令:

    adb install <apk路径>

    当然,安装apk到设备中不一定要使用命令行。

    复制文件

    你可以使用pull和push来复制虚拟机或设备中的文件。

    停止adb服务端

    在有些时候,我们需要停止adb服务端,重新启动来解决问题。
    停止adb服务端,可以使用kill-server命令,之后就可以重启adb服务端运行任何命令了。

    无线连接

    通常adb命令通过usb连接设备来使用,当然也可以通过wifi来实现。

    1. 开发计算机和设备(通常是手机)连接了同一个网络(同一个wifi或在同一个局域网中)。(并不是所有的热点都支持,防火墙需要支持adb)。
    2. 使用usb线连接计算机。
    3. 确保计算机的adb命令运行在usb模式中。
      $ adb usb
      restarting in USB mode
    4. 通过usb连接设备。
      $ adb devices
      List of devices attached
      ######## device

    5. 重启adb到tcipip模式。
      $ adb tcpip 5555
      restarting in TCP mode port: 5555

    6. 找到android设备的ip地址。

    7. 通过ip地址连接到设备。
      $ adb connect #.#.#.#
      connected to #.#.#.#:5555
    8. 移除设备的usb线,确认你还可以对设备进行访问。
      $ adb devices
      List of devices attached
      #.#.#.#:5555 device

    如果adb连接丢失后:

    1. 确保你的计算机和手机接入同一个wifi。
    2. 通过adb connect重新连接。
    3. 如果没用的话,重启服务端进程。
         adb kill-server

    然后重新开始以上步骤。

  • 相关阅读:
    内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!(内附超全思维导图)
    又能扯皮了!没内存了还能看片?
    写给大忙人看的进程和线程
    Python面试常用的高级用法,怎么动态创建类?
    LeetCode 74,直击BAT经典面试题
    LeetCode 73,为什么第一反应想到的解法很有可能是个坑?
    Golang基础教程——map使用篇
    手把手教你学numpy,从此数据处理不再慌【三】
    从辗转相除法到求逆元,数论算法初体验
    深入了解机器学习决策树模型——C4.5算法
  • 原文地址:https://www.cnblogs.com/hainange/p/6153474.html
Copyright © 2011-2022 走看看