2010年10月16日 星期六

How to Use ADB over TCP/IP?

對於 Android 的開發,Android Debug Bridge (ADB) 是一個相當實用的工具。再且多數的 ARM 開發板都具有乙太網路介面,若透過 TCP/IP 來使用 ADB 其實是相當容易的。

首先,假設將電腦和 ARM 開發板直接用網路線連接起來,將電腦的 IP 位址設定為 192.168.1.200,而 ARM 開發板則設為 192.168.1.202。

那麼,在 ARM 開發板這端需要指定 service.adb.tcp.port 這個變數,並重啟 adbd (ADB Daemon)。

stop adbd
setprop service.adb.tcp.port 5555
start adbd

在電腦端,確認 Android SDK 裡的 adb 版本至少為 1.0.25 或更新版本後,開啟一個 DOS 終端,然後利用 adb connect [IP]:[PORT] 連接 ADB Daemon。

adb kill-server
adb connect 192.168.1.202:5555

這樣就 OK 了。

所以,如果在移植 Android 時,加上這個 patch,在使用就稍微方便些了。

diff -Naur old/system/core/rootdir/etc/init.goldfish.sh new/system/core/rootdir/etc/init.goldfish.sh
--- old/system/core/rootdir/etc/init.goldfish.sh 2010-09-09 02:24:32.318070299 +0000
+++ new/system/core/rootdir/etc/init.goldfish.sh 2010-09-09 02:26:18.598160293 +0000
@@ -1,7 +1,10 @@
#!/system/bin/sh

-#ifconfig eth0 10.0.2.15 netmask 255.255.255.0 up
-#route add default gw 10.0.2.2 dev eth0
+ifconfig eth0 192.168.1.202 netmask 255.255.255.0 up
+route add default gw 192.168.1.1 dev eth0

diff -Naur old/system/core/rootdir/init.rc new/system/core/rootdir/init.rc
--- old/system/core/rootdir/init.rc 2010-09-09 02:22:45.189174370 +0000
+++ new/system/core/rootdir/init.rc 2010-09-09 02:23:15.899741002 +0000
@@ -270,9 +270,11 @@

# adbd on at boot in emulator
on property:ro.kernel.qemu=1
+ setprop service.adb.tcp.port 5555
start adbd

on property:persist.service.adb.enable=1
+ setprop service.adb.tcp.port 5555
start adbd

on property:persist.service.adb.enable=0

此外,若再從 system/core/adb/adb.c 這個檔案第 921 行處的程式碼來看,大約就更可以瞭解為什麼設定 service.adb.tcp.port 之後就可以由 TCP/IP 使用 ADB 了。

    /* for the device, start the usb transport if the
** android usb device exists and the "service.adb.tcp.port" and
** "persist.adb.tcp.port" properties are not set.
** Otherwise start the network transport.
*/
property_get("service.adb.tcp.port", value, "");
if (!value[0])
property_get("persist.adb.tcp.port", value, "");
if (sscanf(value, "%d", &port) == 1 && port > 0) {
// listen on TCP port specified by service.adb.tcp.port property
local_init(port);
} else if (access("/dev/android_adb", F_OK) == 0) {
// listen on USB
usb_init();
} else {
// listen on default port
local_init(ADB_LOCAL_TRANSPORT_PORT);
}

延伸閱讀: