使用ADB远程无线调试G1 应用程序 (通过WiFi)
习惯了使用usb连接线在G1手机上debug Android应用程序,今天突然心血来潮想到是不是可以通过无线网络远程调试应用程序?
(如果知道对方ip地址,有可能网络上的手机都有可能被利用哦?)
首先咨询一下 高人stevens,Tan博。 Tan博给于肯定答复,下面就是我结合Tan博的手顺在G1上调试实现。
1. 首先G1 需要有root权限 , 关于如何获取root权限,可以参考
http://www.webnetta.com/tag/jfv13/
(后面还可以升级Cyanogen 的ROM)
2. 登陆G1 控制台,这个可以通过 G1 上的Terminal软件,如果 G1 ROM中带busybox的话(Cyanogen ROM 是带的),可以启动telnetd, 然后在PC上telnet登陆,前提是G1和你的PC在一个网络里。这样就可以摆脱在G1上输入命令的不便。
# mv /dev/android_adb /dev/android_adb.bk
* Android 是默认的ADB是使用 USB 作为debug,可以参考代码gdb.c, 重命名这个文件后,adb会尝试使用网络连接。
#setprop persist.service.adb.enable 1
#setprop service.adb.root 1
#setprop ctl.stop adbd
#setprop ctl.start adbd
* 设置adb权限并重起服务
# netstat
Proto Recv-Q Send-Q Local Address Foreign Address State
….
tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN
….
此时如果显示 tcp 5555 端口开启表明手机端的设置已经成功了。
3. PC上设置环境变量
ADB_TRACE <= adb
ADBHOST <= G1手机ip地址,这个必须正确
PATH <= 增加android sdk tools 路径
4. 重起PC 使环境变量生效,然后运行adb server,
# adb nodaemon server
bit_buffer_init 0x33b60
bit_buffer_init 0x34ba0
adb_socketpair: returns (100, 101)
fdevent_update: add 1 to 101
event_looper_hook: call hook for 101 (new=0, old=1)
trCarneatesd depvicoe trhretad
: local client init
transport: client_socket_thread() starting
socket_loopback_server: port 5037 type tcp => fd 102
fdevent_update: add 1 to 102
event_looper_hook: call hook for 102 (new=0, old=1)
_event_socketpair_start: hook 101(pair:100) for 65 wanted=1
_event_socket_start: hooking 102(lo-server:5037) for 1 (flags 41)
adb_win32: waiting for 2 events
socket_network_client: host '192.168.0.188' port 5555 type tcp => fd 103
client: connected on remote on fd 103
transport: 0x36868 init'ing for socket 103, on port 5555
transport: 0x36868 registered
adb_win32: got one (index 0)
adb_win32: signaling 101(pair:100) for 0
bit_buffer_init 0x368f8
bit_buffer_init 0x37938
adb_socketpair: returns (105, 106)
transport: 0x36868 (105,106) starting
transport: 0x36868 install 105
fdevent_update: add 1 to 105
event_looper_hook: call hook for 105 (new=0, old=1)
_teovf_reermnootmt__esr:oe cmskotetater:t pisanigr_ staritinngp utth_trheraeda t
dfa orfrto :rt rh0aoxno3sk6p 8o16r08t1, ( 0prxae3ia6rd8:i61n80g,0 )fo rnfo omf
r d f 6d15 0 16w0
a6fn
rtoemd_=r1e
m_oetvee:n tt_rsaoncskpeotrpta ir0_xs3t6a8r6t8: ShYoNoCk o1nl05(ipnaei r(:21)0
6w)ri tfeo_pra c6k9e tw:a n1t0e6d =[14
3a4deb5_9w5i3n 3S2Y: NwC] 0a0i0t0i0n0g0 1f o0r0 0030 0e0v2e n(t0s)
fardobm__wrienm3o2t:e :got data pump for transpor ont e0 x(3i6n8d6e8x
r2e)a
daxd:b _1w0i3n 302x:3 9sbi1gcn a2l4i
ng 105(pair:106) for 0
read_packet: 105 ok: [434e5953 SYNC] 00000001 00000002 (0)
handle_packet() 1129208147
write_packet: 105 [434e5953 SYNC] 00000001 00000002 (0)
Carlelaidn_gp asckeet: n106d ok:_ c[43o4e5n953n SYNeC] 0c0t000 001
0000w000r2 (i0) t e
_to_premaotce: tkranespotrt :0x3 68681 S05YNC onl[ine
4e584e43 CNXN] 01000000 00001000 (7) 686f73743a3a00 host::.
read_packet: 106 ok: [4e584e43 CNXN] 01000000 00001000 (7) 686f73743a3a00 host:
:.
to_remote: transport 0x36868 got packet, sending to remote
writex: 103 0x3ab4c 31: 434e584e000000010010000007000000 CNXN............
writex: 103 ok
_event_socketpair_start: hook 101(pair:100) for 65 wanted=1
_event_socketpair_start: hook 105(pair:106) for 69 wanted=1
adb_win32: waiting for 3 events
readx: 103 ok: 434e584e000000010010000009000000 CNXN............
readx: 103 0x39b34 9
readx: 103 ok: 6465766963653a3a00 device::.
from_remote: received remote packet, sending to transport 0x36868
write_packet: 106 [4e584e43 CNXN] 01000000 00001000 (9) 6465766963653a3a00 devi
ce::.
raedabd_xw:i n13023: 0gxot3 8oaneec (2i4n
dex 2)
adb_win32: signaling 105(pair:106) for 0
read_packet: 105 ok: [4e584e43 CNXN] 01000000 00001000 (9) 6465766963653a3a00 d
evice::.
handle_packet() 1314410051
parse_banner: device::
setting connection_state to CS_DEVICE
adb: online
_event_socketpair_start: hook 101(pair:100) for 65 wanted=1
_event_socketpair_start: hook 105(pair:106) for 69 wanted=1
adb_win32: waiting for 3 events
socket_loopback_client: could not connect to tcp:5557
…..
* abd 会默认尝试 从端口5555 ~ 5587 , 此时5555端口已经连上,因此后面5557 ~ 5587 端口连接不上的错误可以忽略。
5. 现在就可以在 另一个终端窗口中使用adb 功能命令
如运行logcat 可以看到以下类似信息(当然也可以adb push 等)
#adb logcat
_adb_connect: host:version
socket_loopback_client: port 5037 type tcp => fd 100
writex: 100 0x23cbc0 4: 30303063 000c
writex: 100 ok
writex: 100 0x41d9a1 12: 686f73743a76657273696f6e host:version
writex: 100 ok
readx: 100 0x23cb20 4
readx: 100 ok: 4f4b4159 OKAY
readx: 100 0x23cc10 4
readx: 100 ok: 30303034 0004
readx: 100 0x23cc10 4
readx: 100 ok: 30303134 0014
adb_close: 100(lo-client:5037)
_adb_connect: shell:export ANDROID_LOG_TAGS="" ; exec logcat
socket_loopback_client: port 5037 type tcp => fd 101
…..
6. 最后运行eclipse ,就可以远程调试你的应用程序了。
需要注意的是由于eclipse android emulator 就是使用ADB的网络连接。
但是经过上面的这些步骤此时ADB已经被定向到了G1手机上,因此eclipse 环境下的target Android emulator 这时就是你实际的G1手机而不是sdk自带的emulator,同时而android sdk自带的emulator也不会被启动。