网友通过本文主要向大家介绍了android6.0 usb调试,adbd,adbd是什么,start adbd,重新启动adbd等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程
一、log打印流程
我们先来看下自己调试的代码打印:
由于显示的问题,我把log的时间去除了,只显示了pid 和tid
//拔去usb线 185 188 I adbd : output_thread:(null): remote read failed for transport 185 188 I adbd : output_thread:(null) SYNC offline for transport 185 185 I adbd : handle_packet: A_SYNC 185 185 I adbd : handle_packet: A_SYNC CS_OFFLINE 185 187 I adbd : input_thread:(null): transport SYNC offline 185 187 I adbd : input_thread:(null): transport input thread is exiting, fd 13 185 186 I usb_adb_open_thread: adbd usb_thread - opening device 185 186 I usb_adb_open_thread: adbd opening device succeeded 185 185 I adbd : handle_packet: A_SYNC 185 185 I adbd : handle_packet: A_SYNC send_packet 185 2164 I adbd : input_thread:(null): transport SYNC online //插上usb线 185 2165 I adbd : output_thread: read_from_remote after 185 185 I adbd : handle_packet: A_CNXN 185 185 I adbd : handle_packet: A_CNXN handle_online 185 185 I adbd : handle_packet: A_CNXN send_connect 185 2165 I adbd : output_thread: read_from_remote after 185 185 I adbd : adb command: 'shell:dumpsys iphonesubinfo' 185 2165 I adbd : output_thread: read_from_remote after 185 2165 I adbd : output_thread: read_from_remote after 185 185 I adbd : adb command: 'shell:dumpsys battery' 185 2165 I adbd : output_thread: read_from_remote after 185 2165 I adbd : output_thread: read_from_remote after 185 2165 I adbd : output_thread: read_from_remote after 185 185 I adbd : handle_packet: A_CNXN 185 185 I adbd : handle_packet: A_CNXN handle_offline 185 185 I adbd : handle_packet: A_CNXN handle_online 185 185 I adbd : handle_packet: A_CNXN send_connect
二、拔usb线流程
2.1 output_thread读取adb驱动的数据出错
我们按照log看,首先就是output_thread读取adb驱动的数据出错了
static void *output_thread(void *_t)
{
atransport *t = reinterpret_cast(_t);
apacket *p;
D("%s: starting transport output thread on fd %d, SYNC online (%d)\n",
t->serial, t->fd, t->sync_token + 1);
p = get_apacket();
p->msg.command = A_SYNC;
p->msg.arg0 = 1;
p->msg.arg1 = ++(t->sync_token);
p->msg.magic = A_SYNC ^ 0xffffffff;
if(write_packet(t->fd, t->serial, &p)) {
put_apacket(p);
D("%s: failed to write SYNC packet\n", t->serial);
goto oops;
}
D("%s: data pump started\n", t->serial);
for(;;) {
p = get_apacket();
if(t->read_from_remote(p, t) == 0){
D("%s: received remote packet, sending to transport\n",
t->serial);
if(write_packet(t->fd, t->serial, &p)){
put_apacket(p);
D("%s: failed to write apacket to transport\n", t->serial);
LOG("%s:%s: failed to write apacket to transport\n", __FUNCTION__, t->serial);
goto oops;
}
} else {
D("%s: remote read failed for transport\n", t->serial);
LOG("%s:%s: remote read failed for transport\n", __FUNCTION__, t->serial);//读取adb驱动数据失败
put_apacket(p);
break;
}
}
D("%s: SYNC offline for transport\n", t->serial);
LOG("%s:%s SYNC offline for transport\n", __FUNCTION__, t->serial);//线程退出
p = get_apacket();
p->msg.command = A_SYNC;
p->msg.arg0 = 0;
p->msg.arg1 = 0;
p->msg.magic = A_SYNC ^ 0xffffffff;
if(write_packet(t->fd, t->serial, &p)) {//往sockpair另一侧写信息
put_apacket(p);
D("%s: failed to write SYNC apacket to transport", t->serial);
}
output_thread读取adb驱动的数据出错了,然后退出线程并发送sockpair的另一侧数据
另一侧的socketpair关联的函数是transport_socket_events函数
fdevent_install(&(t->transport_fde),
t->transport_socket,
transport_socket_events,
t);
transport_socket_events函数,接着调用了handle_packet函数
static void transport_socket_events(int fd, unsigned events, void *_t)
{
atransport *t = reinterpret_cast(_t);
D("transport_socket_events(fd=%d, events=%04x,...)\n", fd, events);
if(events & FDE_READ){
apacket *p = 0;
if(read_packet(fd, t->serial, &p)){
D("%s: failed to read packet from transport socket on fd %d\n", t->serial, fd);
} else {
handle_packet(p, (atransport *) _t);
}
}
}
2.2 handle_packet处理offline
handle_packet函数收到A_SYNC命令,然后处理offline
void handle_packet(apacket *p, atransport *t)
{
asocket *s;
D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0],
((char*) (&(p->msg.command)))[1],
((char*) (&(p->msg.command)))[2],
((char*) (&(p->msg.command)))[3]);
print_packet("recv", p);
switch(p->msg.command){
case A_SYNC:
LOG("%s: A_SYNC \n", __FUNCTION__);//进入sync
if(p->msg.arg0){
send_packet(p, t);
LOG("%s: A_SYNC send_packet\n", __FUNCTION__);
if(HOST) send_connect(t);
} else {
t->connection_state = CS_OFFLINE;
LOG("%s: A_SYNC CS_OFFLINE\n", __FUNCTION__);//offline处理
handle_offline(t);
send_packet(p, t);
}
return;
hand_packet处理sync消息,我们先来看handle_offline函数,其实就是把状态处理下
void handle_offline(atransport *t)
{
D("adb: offline\n");
//Close the associated usb
t->online = 0;
run_transport_disconnects(t);
}
2.3 Input_thread处理offline
处理offline的我们看send_packet也是往socketpair的另一侧写数据,这样inputThread会有数据接收
static void *input_thread(void *_t)
{
atransport *t = reinterpret_cast(_t);
apacket *p;
int active = 0;
D("%s: starting transport input thread, reading from fd %d\n",
t->serial, t->fd);
for(;;){
if(read_packet(t->fd, t->serial, &p)) {
D("%s: failed to read apacket from transport on fd %d\n",
t->serial, t->fd );
LOG("%s:%s: failed to read apacket from transport on fd %d\n", __FUNCTION__, t->serial, t->fd );
break;
}
if(p->msg.command == A_SYNC){
if(p->msg.arg0 == 0) {
D("%s: transport SYNC offline\n", t->serial);
put_apacket(p);
LOG("%s:%s: transport SYNC offline\n", __FUNCTION__, t->serial);//收到handle_packet发来的offline的消息,跳出循环
break;
} else {
if(p->msg.arg1 == t->sync_token) {
LOG("%s:%s: transport SYNC online\n", __FUNCTION__, t->serial);
active = 1;
} else {
D("%s: transport ignoring SYNC %d != %d\n",
t->serial, p->msg.arg1, t->sync_token);
}
}
} else {
if(active) {
D("%s: transport got packet, sending to remote\n", t->serial);
t->write_to_remote(p, t);
} else {
D("%s: tr

