`
yanghaoli
  • 浏览: 288525 次
社区版块
存档分类
最新评论

Android Debug Bridge(ADB)学习总结

 
阅读更多

Android Debug Bridge

Android调试桥(ADB)是一种多用途的命令行工具。通过它我们可以和模拟器或者设备通信。ADB是一个客户端-服务器程序,包括三个组成部分:

  • 客户端(Client),运行在你用于程序开发的电脑上。你可以通过shell端使用adb命令启动客户端。其他Android工具,例如ADT插件和DDMS同样可以产生adb客户端。
  • 服务器(Server),以后台进程的形式运行在你用于程序开发的电脑上。该服务器负责管理客户端和运行于模拟器或设备上的adb守护进程(daemon)之间的通信。
  • 守护进程(Daemon),以后台进程的形式运行在模拟器或者设备上。

你可以在sdk/platform-tools下面找到adb工具。

当你启动一个adb客户端,客户端首先检测是否已有一个adb服务器进程正在运行。如果没有,则启动服务器进程。当服务器运行,adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令——所有的adb客户端都是通过TCP端口5037与adb服务器进行通信。

接下来,服务器将所有运行中的模拟器或设备实例建立连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。一旦服务器找到了adb守护进程,它将建立一个到该端口的连接。请注意每个模拟器或设备实例都会取得两个连续的端口——偶数端口响应控制台连接,奇数端口响应adb连接。例如:

Emulator 1, console: 5554

Emulator 1, adb: 5555

Emulator 2, console: 5556

Emulator 2, adb: 5557

如上所示,通过5555端口连接adb的模拟器实例和通过5554端口连接控制台的实例是相同的。

一旦服务器与所有模拟器实例建立连接,就可以使用adb命令来访问该实例。因为服务器管理模拟器或设备实例的连接,而且处理来自多个adb客户端的命令,你可以通过任何客户端(或脚本)来控制任何模拟器或设备实例。

你可以在PC的命令行或脚本上发布Android命令,使用方法:

语法

adb [-d|-e|-s <serialNumber>] <command>

如果仅有一个模拟器运行或一个设备连接,adb命令默认发送给这个设备。如果有多个模拟器运行或多个设备连接,你就需要使用-d, -e, -s选项来指定接收命令的目标设备。

ADB常用命令

  • adb start-server
  • adb kill-server
  • adb shell
  • adb devices
  • adb connect <serialNumber>
  • adb pull -s <serialNumber> <remote> <local>
  • adb push -s <serialNumber> <local> <remote>

实例演练

上面的学习总结都是铺垫,或者说都是废话,因为在其他技术博客也能看到相关的介绍。接下来才是文章的重点:"adb server is out of date. killing..."

这里我忍不住吐槽一下,网上关于"adb server is out of date. killing..."的介绍都是关于神马“豌豆荚”之类的,没有一篇文章从深层原理发出,解释为什么会出现这种情况。吐槽完毕。。。

 

为了解决公司里多客户端通过tftp公用adb server造成相互“杀死”对方的情况,我进行了如下测试:

场景:两个DMP Board,三个tftp用户。

1. 查看A,B,C三个用户的adb路径

macan@BG2BLT06:~$ which adb
/home/macan/Android_Eclipse/adt-bundle-linux-x86_64-20130219/sdk/platform-tools/adb
[~/macan/Honeycomb]which adb
/home/chenwei/macan/Honeycomb/out/host/linux-x86/bin/adb
cwen@BG2BLT06:~$ which adb
/home/cwen/android/android-sdk-linux_86/platform-tools/adb

细心的读者可能会发现,三个用户的adb路径都不同啊,怎么说公用一个adb server呢?上面文章讲过:“当你启动一个adb客户端,客户端首先检测是否已有一个adb服务器进程正在运行。如果没有,则启动服务器进程。”为了更好的理解,第二步让我们看看进程情况。

2. 用户B,C启动adb server

 

[~/macan/Honeycomb]adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
cwen@BG2BLT06:~$ adb start-server

A,B,C用户分别查看进程情况

macan@BG2BLT06:~$ ps aux | grep adb
chenwei  14873  0.0  0.0  19988   916 pts/10   Sl   13:38   0:00 adb fork-server server
macan    14891  0.0  0.0   8956   876 pts/12   R+   13:39   0:00 grep --color=auto adb
[~/macan/Honeycomb]ps axu | grep adb
chenwei  14873  0.0  0.0  19988   916 pts/10   Sl   13:38   0:00 adb fork-server server
chenwei  14918  0.0  0.0   8956   876 pts/10   S+   13:40   0:00 grep --color=auto adb
cwen@BG2BLT06:~$ ps aux | grep adb
chenwei  14873  0.0  0.0  19988   916 pts/10   Sl   13:38   0:00 adb fork-server server
cwen     14915  0.0  0.0   8952   876 pts/11   R+   13:40   0:00 grep --color=auto adb

到了这里大家应该就明白了“公用adb server”这句话的意思了。不过,我们还是没有发现所谓的:"adb server is out of date. killing..."

3. 用户A启动adb server(关键)

在B已经启动adb server的情况下,我们发现C执行"adb start-server"没有反应,因为公用B的adb server。那么当A执行“adb start-server”呢?

macan@BG2BLT06:~$ adb start-server
adb server is out of date.  killing...
* daemon started successfully *

悲剧发生了。。。我们盼望已久的"adb server is out of date. killing..."出现了!这是为啥捏??? 

先别急,一步步分析。

4. 再次看看进程

macan@BG2BLT06:~$ ps aux |grep adb
macan    15062  0.0  0.0  20944  1404 pts/12   Sl   13:49   0:00 adb fork-server server
macan    15107  0.0  0.0   8956   872 pts/12   R+   13:52   0:00 grep --color=auto adb

很明显,之前由B的Client fork出的adb server已经被kill,现在的adb server是由A的Client fork出的。。。

这个时候,我们的线索只有一个"adb server is out of date. killing..."!!!

一切都是浮云,源码才是王道!!!

/system/core/adb

通过定位找到了"adb server is out of date. killing..."所在位置

//adb_client.c

if(version != ADB_SERVER_VERSION) {
            printf("*Yagami* version: %d ADB_SERVER_VERSION: %d\n" ,version,ADB_SERVER_VERSION);
            printf("adb server is out of date.  killing...\n");
            fd = _adb_connect("host:kill");
            adb_close(fd);

            /* XXX can we better detect its death? */
            adb_sleep_ms(2000);
            goto start_server;
        }

我们发现了好东东:ADB_SERVER_VERSION!找到它的声明!

#define ADB_SERVER_VERSION    26    // Increment this when we want to force users to start a new adb server

这就是版本号啊!我们离真相已经不远了!!!

我在B用户adb源码adb_client.c中加入了一条打印,希望能发现更多信息。

继续测试

5. 再次启动B adb server

[~/macan/Honeycomb]adb start-server
*Yagami* version: 31 ADB_SERVER_VERSION: 26
adb server is out of date.  killing...
* daemon started successfully *

同样,我们发现B又kill掉了A的server。不过此时的我们已经发现了原因,一个版本号是26,一个版本号是31。。。

6. 好吧,让我们看看A,B,C分别都是神码版本吧。。。

macan@BG2BLT06:~$ adb version
Android Debug Bridge version 1.0.31
[~/macan/Honeycomb]adb version
Android Debug Bridge version 1.0.26
cwen@BG2BLT06:~$ adb version
Android Debug Bridge version 1.0.26

怪不的B,C两个能兼容,因为版本号一样啊。。。

到这里还没完呢,原因找到了,解决方法还木有给呢。。。

其实很简单啦,统一版本号呗。

方法一:

在tftp的/usr/bin下面存放一个adb,保证每个用户的$PATH里面/usr/bin的路径在最前面,这样大家就可以统一用这个adb,版本当然一样。

方法二:

如果每个用户想用自己的adb server,可能有时自己会修改源码,那么大家就统一一个版本号,修改ADB_SERVER_VERSION这个宏即可。

 

ps:还有一点测试时候用的其他命令,就当看着玩吧。

进入DMP Board查看daemon进程

ps | grep adbd
root      735   1     7484   900   ffffffff 2ac1ec30 S /sbin/adbd

查看5037端口号

netstat -apn|grep 5037
tcp        0      0 127.0.0.1:5037          0.0.0.0:*               LISTEN      15861/adb

查看进程15861

ps aux | grep 15861
chenwei  15861  0.0  0.0  29144  1512 pts/27   Sl   11:37   0:00 adb fork-server server
chenwei  22605  0.0  0.0   8956   876 pts/0    S+   11:55   0:00 grep --color=auto 15861
1
5
分享到:
评论

相关推荐

    android debug bridge adb 1.0.32

    **Android Debug Bridge (ADB) 1.0.32 知识详解** Android Debug Bridge(ADB)是Android开发者必备的一款工具,它允许开发者通过USB或Wi-Fi与Android设备进行通信,进行一系列操作,如安装应用、调试应用、查看...

    Android Debug Bridge version 1.0.32

    Android Debug Bridge version 1.0.31 当你的android设备接入pc端进行程序调试的时候是否出现state offline呢?无法进行真机调试,原因就是android 4.2以上的版本过高,sdk的adb驱动不匹配,需要升级。我原本的adb是...

    Android Debug Bridge version 1.0.41/adb 1.0.41/最新版本

    adb shell am broadcast -a ADB_INPUT_TEXT --es msg '中文输 入' 连接好安卓手机,本地运行cmd :adb devices 可以看到安卓机使用的adb版本 解决Appium 在cmd环境下的中文问题,2020.06.01更新版本

    Android Debug Bridge(安卓调试桥)

    adb工具即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。在某些特殊的情况下进入不了系统,adb就派上用场啦! adb工具我觉得很重要,比如说你的手机不...

    Android Debug Bridge(安卓调试桥) tools

    adb工具即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。在某些特殊的情况下进入不了系统,adb就派上用场啦! adb工具我觉得很重要,比如说你的手机不...

    Android Debug Bridge (adb).zip

    **Android Debug Bridge (adb)** adb(Android Debug Bridge)是Android开发者不可或缺的工具之一,它在Android系统开发、调试和设备管理中扮演着至关重要的角色。这个工具提供了一个命令行接口,允许开发者与运行...

    Android Debug Bridge最新版(内含一些apk)。可用于WSA。

    Android Debug Bridge(ADB)是Android开发中的一个关键组件,它为开发者提供了与Android设备进行通信的能力,包括安装、调试和管理应用程序。最新的ADB版本(如平台工具_r31.0.3)通常会包含一系列增强功能和修复...

    adb工具即Android Debug Bridge(安卓调试桥) tools

    adb,全称为Android Debug Bridge,是Android开发者不可或缺的一款强大的命令行工具。它为开发者提供了连接Android设备进行调试、传输文件、运行命令、安装应用等操作的能力。adb是Android SDK(软件开发工具包)的...

    Android Debug Bridge 下载 download

    Android Debug Bridge (adb) 是一个android开发人员必会的多功能的调试工具,确实它的名字一样,它在开发者和目标机器之间,架起了一座bridge。 adb的用法很简单,只要看完SDK文档关于ADB的部分,(android-sdk-...

    ADB,Android Debug Bridge.

    ADB,Android Debug Bridge. ADB,Android Debug Bridge.

    Android Debug Bridge version 1.0.31 for mac

    **Android Debug Bridge (ADB) 是一个强大的工具,用于在Android设备和计算机之间建立通信桥梁,是Android开发和调试过程中的核心组件。在本资源中,我们聚焦于版本1.0.31的ADB,专为mac平台设计。** **ADB简介:**...

    Android Debug Bridge含使用说明 超简单

    **Android Debug Bridge(ADB)详解:超简单指南** Android Debug Bridge(ADB)是Google开发的一个强大的工具,用于在Android设备和计算机之间建立通信桥梁。它为开发者提供了多种功能,包括设备控制、数据传输、...

    Android Debug Bridge version 1.0.26.zip

    总结来说,Android Debug Bridge是Android开发和维护过程中必不可少的工具,它极大地提高了开发者的工作效率,简化了设备管理和应用调试的过程。通过不断更新和优化,如版本1.0.26,ADB确保了与最新Android系统的...

    安卓调试桥adb

    adb1.0.32 Android Debug Bridge(ADB)ADB的全称为Android Debug Bridge,就是调试桥的作用,存放在sdk安装目录下的platform-tools文件夹中,借助这个工具,我们可以管理设备或手机模拟器的状态,可以让你与仿真实例...

    ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。

    ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注: 有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。 Other languages: ...

    adb程序(Android Debug Bridge)

    adb的全称为Android Debug Bridge,就是起到调试桥的作用,是客户端测试常用的辅助工具。借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多终端操作,如安装软件、卸载软件、系统升级、运行shell...

    adb(Android Debug Bridge)

    **adb(Android Debug Bridge)详解** adb,全称Android Debug Bridge,是Google为Android系统开发的一个强大的命令行工具。它是Android开发者不可或缺的调试桥梁,连接了计算机与Android设备,允许开发者进行一...

    ADB.zip ADB(Android Debug Bridge)安卓调试桥

    ADB(Android Debug Bridge)安卓调试桥

    androidStudio adb1.0.40

    **Android Debug Bridge (ADB) 简介** Android Debug Bridge(ADB)是Android开发者工具集中的一个重要组件,它是一个命令行实用程序,用于连接、控制Android设备或模拟器。通过ADB,开发者可以进行一系列操作,如...

Global site tag (gtag.js) - Google Analytics