
此篇在于分析指令、数据包的流向,分析local socket与smart socket、remote socket的关联以及分析PC与Android设备是如何传递数据信息的(从本地转发到远端)
该文章是之前自己写的博客,现在搬运到知乎,和大家一起分享。
如果有分析不到位的地方,还请各位大虾们指正,欢迎交流!^_^
传输层(transport.c)详细分析
在 transport.c 中:
①transport注册
init_transport_registration();
-->adb_socketpair(s)//创建socketpair
transport_registration_send = s[0];
transport_registration_recv = s[1];
fdevent_install(&transport_registration_fde,transport_registration_recv,transport_registration_func,0);
fdevent_set(&transport_registration_fde,FDE_READ);
注:当 transport_registration_send 有写事件的时候触发 transport_registration_recv 的读事件,回调 transport_registration_func 函数。什么时候能触发transport_registration_send 的写事件?
即当有transport需要被注册的时候,就会调用 register_transport,进而调用 transport_write_action(transport_registration_send, &m),这样就会触发 transport_registration_recv。
在 transport_registration_func 函数中:
-->adb_socketpair(s))//创建socketpair
t->transport_socket = s[0];
t->fd = s[1];
fdevent_install(&(t->transport_fde),t->transport_socket, transport_socket_events, t); //当有数据写入t->fd,会触发t->transport_socket读事件,调用transport_socket_events用于进一步处理远端发送过来的数据包。
fdevent_set(&(t->transport_fde),FDE_READ); //监听读事件
开了两个线程:
adb_thread_create(&input_thread_ptr,input_thread, t))
adb_thread_create(&output_thread_ptr,output_thread, t))
②从远端读取数据写入本地socket
output_thread==>t->read_from_remote(p, t);
等待远端数据,将远端发送过来的数据写入 t->fd 句柄,这样与 t->fd 相 pair 的 t->transport_socket 句柄就接收到该数据了,然后触发 transport_socket_events 后调用==>handle_packet 处理远端数据发送过来的数据包。host端:函数find_local_socket(p->msg.arg1)用来查寻本地s->id值为p->msg.arg1的local_socket,直接调用本地local_socket的s->enqueue(s, p);即local_socket_enqueue, local_socket_enqueue函数又将调用adb_write(s->fd, p->ptr, p->len);将数据发送给s->fd,该s->fd是由ss_listener_event_func函数创建的一个fd = adb_socket_accept(_fd, &addr, &alen);所以向s->fd发送数据就表示将数据发送给了与host端口#define ADB_PORT 5037建立网络连接的client,这些命令正在pending读取与host端口5037建立连接的句柄fd发送数据过来.
device端:函数find_local_socket(p->msg.arg1)用来查寻本地s->id值为p->msg.arg1的local_socket,直接调用本地local_socket的s->enqueue(s, p);即local_socket_enqueue,local_socket_enqueue函数又将调用adb_write(s->fd, p->ptr, p->len);将数据发送给s->fd,该s->fd是由create_local_service_socket函数创建的一个fd = service_to_fd(name);所以向s->fd发送数据就表示将数据发送给了与该fd(s[0])相pair的s[1](tfd), s[1](tfd)正在pending读取fd(s[0])发送数据过来.
③ 从本地socket读取数据包写入远端
② input_thread 等待 t->fd 句柄有数据到来,数据由与 t->fd 相 pair 的 t->transport_socket 句柄写入
通过 send_packet函数==>
write_packet(t->transport_socket, &p) 发送过来,之后 input_thread 将接收到得数据通过 t->write_to_remote(p, t) 发送给远端。