2012年02月03日
Androidのadbのメモ(9) Android端末同士をadbでつなぐ
「Androidのadbのメモ(7) Androidデバイス側でadbを動かす」では、自分の中でループバックさせてadbから自分自身のadbdとつないでみましたが、これにどんな用途があるのかいまひとつわかりませんでした。
@matsuu さんのつぶやきではっと気がついたのですが、これは2台のAndroid端末をつなげば、Android端末でAndroid端末をデバッグできるということなのです。さっそく試してみました。
「Androidのadbのメモ(7) Androidデバイス側でadbを動かす」では、TCPのループバックで自分自身のadbdとつなぐことに成功しました。TCPのしくみから考えて、相手のIPアドレスがわかって、Fire wall等に邪魔されなければネットワーク経由で他の端末のadbdにつなぐのは可能だと思います。
でももし2台の Android端末とAndroid端末をUSBケーブルでつないでadbの通信ができるのならば、IPアドレス等を調べる必要すらないのでもっと手軽で確実です。
2台の Android端末をUSBケーブルでつないでみる
KZM-A9-Dualボード(Android 4.0.3)のUSBホスト(Aコネクタ)とNexusOne(Android 2.3.6)のUSBデバイス(マイクロBコネクタ)をつなぎました。
KZM-A9-Dualのシリアルコンソールで
# adb devices * daemon not running. starting it now on port 5038 * * daemon started successfully * List of devices attached HT015P803242 device #
あ、あっさりとNexusOneを認識しました。
# adb shell ls config cache sdcard acct mnt vendor d etc ueventd.rc ueventd.mahimahi.rc ueventd.goldfish.rc system sys sbin proc init.rc init.mahimahi.rc init.goldfish.rc init default.prop data root dev #
mahimahiはNexusOneのコードネームです。確かにNexusOneのルートディレクトリが見えています。
# adb logcat --------- beginning of /dev/log/system I/Vold ( 63): Vold 2.1 (the revenge) firing up D/Vold ( 63): Volume sdcard state changing -1 (Initializing) -> 0 (No-Media) D/Vold ( 63): Volume sdcard state changing 0 (No-Media) -> 2 (Pending) D/Vold ( 63): Volume sdcard state changing 2 (Pending) -> 1 (Idle-Unmounted) I/SystemServer( 96): Entered the Android system server! I/SystemServer( 96): Entropy Service I/SystemServer( 96): Power Manager I/SystemServer( 96): Activity Manager I/ActivityManager( 96): Memory class: 32 I/UsageStats( 96): Deleting usage file : usage-20111018 ...
NexusOneのlogcatも普通に見ることができます。
Android端末から別のAndroid端末にアプリをインストール
KZM-A9-DualボードにインストールされているアプリをNexusOneにインストールできるかやってみました。
# cd /data/app # ls com.example.native_plasma-1.apk # adb install com.example.native_plasma-1.apk 885 KB/s (169266 bytes in 0.186s) pkg: /data/local/tmp/com.example.native_plasma-1.apk Success #
何の問題もなく、NexusOneにnative plazmaのアプリがインストールできて起動もできました。
なにかいろいろと面白そうなことができますね。
追記(2012.2.7)
ここではroot権限で動いているシリアルコンソールのshellから動かしましたが、secureモードのadb shellからでも同じことを行うことができました。つまり今後USBホストが使えるAndroid 4.0の製品が出てくればroot権限なしでもadbを使用することが出来る可能性が高いです。
追記:Android 2.3.4でadbを動かす
KZM-A9-DualのAndroid 4.0.3の/system/bin/adb をAndroid 2.3.4にコピーして、Android2.3.4を起動して同じことができるかやってみました。
特に問題ないようです。つまりこれはAndroid4.0でのUSBホストサポートとは無関係です。
adbはダイナミックリンクされていますが、ライブラリのインタフェースは特に変わっていないようです。なにか問題があればadbをスタティックリンクしなおして持ってくればよいと思います。
追記2: TCPでつなぐ
2台のKZM-A9-Dualボードを有線LANで同じHubにつなぎます。
デバッグ対象のほうのIPアドレスを確認し、adbdをTCPを待つように変更して再起動します。
# netcfg lo UP 127.0.0.1 255.0.0.0 0x00000049 eth0 UP 192.168.1.139 255.255.255.0 0x00001043 # setprop service.adb.tcp.port 5555 # stop adbd # start adbd #
もう一方のボードでは相手のIPアドレスを環境変数ADBHOSTにセットしてadb serverを再起動します。
# adb kill-server # ADBHOST=192.168.1.139 adb devices * daemon not running. starting it now on port 5038 * * daemon started successfully * List of devices attached emulator-5554 device #
ほらつながった。
おまけ
KZM-A9-DualボードのUSBホスト(Aコネクタ)とUSBデバイス(ミニBコネクタ)をUSBケーブルでつないで
# adb devices List of devices attached 0123456789ABCDEF device #
自分自身が見えます。:)
おまけ2
adbdの再起動は今までは必ずシリアルコンソールで行う必要がありました。USB経由のadb shellで実行していると
# setprop service.adb.tcp.port 5555 # stop adbd # start adbd
としようとしても、stop adbdの段階で接続が切れてしまって start adbdを行うことができないからです。
しかし、Android 4.0ではserviceの再起動ができるようになりました。
# setprop service.adb.tcp.port 5555 # setprop ctl.restart adbd
おまけ3
USBからTCPを切り替えるためにadbdを再起動するにはもっと簡単な方法がありました。
ホスト側から
$ adb tcpip 5555 restarting in TCP mode port : 5555 $
関連するページ
Android Builders SummitでADBの話をしました
Androidのadbのメモ(1) adb serverの観察
Androidのadbのメモ(5) adb shell lsを実行したときのログ
Androidのemulator consoleに簡単にコマンドを送る方法
Androidのadbのメモ(6) 直接adb serverと通信するrubyスクリプト
Androidのadbのメモ(7) Androidデバイス側でadbを動かす
Androidのadbのメモ(8) Android以外でadbを使う実験
Androidのadbのメモ(9) Android端末同士をadbでつなぐ
Androidのadbのメモ(10) adbdの起動のトリガー
Androidのadbのメモ(11) adbdのsecureモード