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パスを確認する。
2.ユーザーB、C起動adb server
3.ユーザーAがadb serverを起動する(キー)
Bが既にadb serverを起動している場合、Cが「adb start-server」を実行しても、パブリックBのadb serverが反応しないことが分かりました。Aが「adb start-server」を実行するときは?
焦らずに分析してください。
4.プロセスをもう一度見る
この時、私達の手がかりは一つしかありません。「adb server is out of date.killing...」!!
すべては浮雲で、ソースは王道です!!
私はBユーザーのadbソースのadb_です。client.cにプリントを入れました。もっと多くの情報を見つけたいです。
テストを続行
5.B adb serverを再起動する
6.はい、A、B、Cはそれぞれ神格バージョンですね。
ここまではまだ終わらないです。原因が見つかりました。解決方法はまだ与えられていません。。。
実は簡単ですよ。バージョン番号を統一してください。
方法1:
tftftpの/usr/binの下にadbを保存して、各ユーザのPATHの中/usr/binのパスが一番前にあることを保証します。そうすると、みんなはこのadbを統一して使うことができます。バージョンはもちろん同じです。
方法二:
各ユーザーが自分のadb serverを使いたいならば、時々自分でソースコードを修正します。そうすると、みんなは一つのバージョン番号を統一してADB_を修正します。SERVER_VERIONというマクロでいいです。
ps:テストの時に使う他のコマンドがありますので、見て遊んでください。
DMP Boardに入ってdaemenプロセスを確認します。
Androidデバッグブリッジ(ADB)は、マルチ用途のコマンドラインツールです。それを通してシミュレータや設備と通信できます。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 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
ビュープロセス15861ps 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