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
$


トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード