Android Debug Bridge(ADB)学習まとめ

13577 ワード

Android Debug Bridge
Androidデバッグブリッジ(ADB)は、マルチ用途のコマンドラインツールです。それを通してシミュレータや設備と通信できます。ADBはクライアントサーバプログラムであり、三つの構成部分を含む。
  • クライアントは、あなたがプログラム開発に使うコンピュータ上で動作します。shell側でadbコマンドを使ってクライアントを起動することができます。他のAndroidツールは、ADTプラグインやDDMSなどと同様に、adbクライアントを生成することができる。
  • サーバ(Server)は、プログラム開発用のコンピュータ上でバックグラウンドプロセスとして動作します。サーバーは、クライアントとシミュレータまたはデバイス上で動作するadbデーモンとの間の通信を管理しています。
  • デーモンは、バックグラウンドプロセスとしてシミュレータまたはデバイス上で実行されます。
  • sdk/plotform-toolsの下にadbツールを見つけられます。
    adbクライアントを起動すると、クライアントはまず、既に1つのadbサーバプロセスが実行されているかどうかを検出する。ない場合は、サーバープロセスを開始します。サーバーが動作すると、adbサーバはローカルのTCPポート5037をバインドし、adbクライアントからのコマンドを傍受する。すべてのadbクライアントはTCPポート5037を介してadbサーバと通信する。
    次に、サーバは、すべての動作中のシミュレータまたはデバイスのインスタンスを接続する。すべての5555から5585の範囲の奇数ポートを走査することにより、すべてのシミュレータまたはデバイスを特定する。サーバーがadbデーモンを見つけたら、ポートへの接続を確立します。各シミュレータまたはデバイスの例は、2つの連続ポート、偶数ポート応答コンソール接続、奇数ポート応答adb接続を取得することに注意してください。たとえば:
    Emullator 1,sone:5554
    Emullator 1,adb:5555
    Emullator 2,sone:5556
    Emullator 2,adb:5557
    上記のように、5555ポートを介してアドビに接続されたシミュレータの例と、5554ポートを介してコンソールに接続された例は同じである。
    サーバがすべてのシミュレータのインスタンスと接続を確立すると、adbコマンドを使用してこのインスタンスにアクセスすることができる。サーバはシミュレータまたはデバイスのインスタンスの接続を管理し、複数のadbクライアントからのコマンドを処理するので、任意のクライアント(またはスクリプト)を介して任意のシミュレータまたはデバイスのインスタンスを制御することができる。
    PCのコマンドラインやスクリプトにAndroidコマンドを発行することができます。
    構文
    adb[-d𞓜-e 124;- s
    一つのシミュレータだけがデバイス接続を実行している場合、adbコマンドはデフォルトでこのデバイスに送信します。複数のシミュレータが動作したり、複数のデバイスが接続されている場合は、−d,−e,−sオプションを使用してコマンドを受信する対象機器を指定する必要があります。
    ADB常用命令
  • adb start-server
  • adb kill-server
  • adb shell
  • adb devices
  • adb connect
  • adb pull-s
  • adb push-s
  • 実例訓練
    上の学習総括はすべて敷物で、あるいはすべてむだ話で、その他の技術のブログでも関連している紹介を見ることができるためです。次は文章のポイントです。「adb server is out of date.killing...」
    ここで私は思わず突っ込みました。ネットで「adb server is out of date.killing...」と紹介されているのは、「グリーンピース」などに関するものです。深層原理から出された文章は一つもありません。なぜこのような状況が発生したのかを説明します。ツッコミが終わりました。
     
    会社内のマルチクライアントがtftftp共用adb serverを通じてお互いに「殺す」状況を解決するために、次のようなテストを行いました。
    シーン:2つのDMP Board、3つのtftpユーザ。
    1.A、B、Cの3つのユーザの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
    注意深い読者は、3人のユーザーの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はすでにキルルされています。今の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
    " ,version,ADB_SERVER_VERSION); printf("adb server is out of date. killing...
    "); fd = _adb_connect("host:kill"); adb_close(fd); /* XXX can we better detect its death? */ adb_sleep_ms(2000); goto start_server; }
    私達は良いものを発見しました。ADB_SERVER_VERION!その声明を見つけます。
    #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さんが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は互換性があります。バージョン番号が同じですから。
    ここまではまだ終わらないです。原因が見つかりました。解決方法はまだ与えられていません。。。
    実は簡単ですよ。バージョン番号を統一してください。
    方法1:
    tftftpの/usr/binの下にadbを保存して、各ユーザのPATHの中/usr/binのパスが一番前にあることを保証します。そうすると、みんなはこのadbを統一して使うことができます。バージョンはもちろん同じです。
    方法二:
    各ユーザーが自分のadb serverを使いたいならば、時々自分でソースコードを修正します。そうすると、みんなは一つのバージョン番号を統一してADB_を修正します。SERVER_VERIONというマクロでいいです。
     
    ps:テストの時に使う他のコマンドがありますので、見て遊んでください。
    DMP Boardに入ってdaemenプロセスを確認します。
    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