2012年02月10日
Androidのadbのメモ(12) adbdをTCPモードに切り替える
システムプロパティの値を直接書き直したりもしましたが、今のところ一番よいと思われる手順は以下です。
まずUSBでつながっている状態で、ネットワークのIPアドレスを確認します。
$ adb shell netcfg lo UP 127.0.0.1 255.0.0.0 0x00000049 eth0 UP 192.168.1.56 255.255.255.0 0x00001043
TCPモードへの切り替えコマンドを実行します。指定するポート番号は5555から5585までの奇数です。
$ adb tcpip 5555 restarting in TCP mode port: 5555 $ adb devices List of devices attached $
ここでadb deviceとしてUSBでの接続が切れたことを確認します。もしこれで切れない場合はTCPモードへの切り替えがうまくいっていません。そうなる原因については後述。
新たにTCP経由で接続するためには、まずadb serverを終了させ、環境変数ADBHOSTにさきほど調べたIPアドレスをセットしてadb serverを起動します。そのあとは通常通り使えるはずです。
$ adb kill-server $ ADBHOST=192.168.1.56 adb start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * $ adb devices List of devices attached emulator-5554 device $
TCP経由で接続している場合は、emulatorであってもなくても"emulator-" + (ポート番号 - 1)の名前で認識されます。
"adb tcpip"を実行したときのadbdの動作
system/core/adb/services.c: restart_tcp_service を見てください。
property_set("service.adb.tcp.port", value);
でシステムプロパティを書き換えた後に、exit(1)で自分でプロセスを終了させます。するとinitがadbdを再起動するので、そのときに"service.adb.tcp.port"の値を見てTCPモードになります。
Android 4.0ではadbdがsecureモードでも問題なくTCPモードに切り替えることができますが、Android 2.3までだとadbdがroot権限で動いていないと"service.adb.tcp.port"のシステムプロパティの書き換えがPermission deniedで失敗します。その結果、adbdが再起動してもUSBモードのままです。
注意
adbdをTCPモードにしたときは、セキュリティ的には無防備です。誰でもパスワード無しでshellが使えてしまいますし、通信経路も暗号化されていません。公衆無線LANなどで使うべきではないですね。
Android 2.3でsecureモードでもadbをTCPに切り替え可能にするパッチ
initのソースコードの以下の一行を追加してリビルドしたものに置き換えることができれば、Android 2.3でsecureモードでもadbをTCPに切り替え可能になります。
system/core/init/property_service.c
$ diff -u property_service.c.2 property_service.c --- property_service.c.2 2012-02-07 18:40:34.472414791 +0900 +++ property_service.c 2012-02-07 18:41:24.782801630 +0900 @@ -79,6 +79,7 @@ { "debug.", AID_SHELL, 0 }, { "log.", AID_SHELL, 0 }, { "service.adb.root", AID_SHELL, 0 }, + { "service.adb.tcp.port", AID_SHELL, 0 }, { "persist.sys.", AID_SYSTEM, 0 }, { "persist.service.", AID_SYSTEM, 0 }, { "persist.security.", AID_SYSTEM, 0 },
KZM-A9-Dualボードで動作確認ずみ。
関連するページ
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モード