adb命令执行过程解析
2015-01-28 20:47
543 查看
本文将以"adb connect "和"adb shell"两个命令为例,解析adb命令的实现过程。
一、adb connect命令执行过程
目前adb支持两种形式建立host端和device端的连接:USB和网络。
adb connect命令的作用就是建立host和device之间的TCP/IP连接。
1、client端
adb_commnadline() -> adb_query() -> adb_connect("host:connect:xx.xx.xx.xx") ->
_adb_connect("host:connect:xx.xx.xx.xx") -> writex(fd, ...) ,
其中fd是service对5037端口进行监听的描述符。
2、service端
client端发来的数据 -> local_socket_event_func() -> smart_socket_enqueue() -> create_host_service_socket()
-> host_service_to_socket() ->connect_service() ,
conncet_service()中会与xx.xx.xx.xx.:5555建立socket连接,然后通过register_socket_transport()创建对这个socket的
监听。
adb connect命令处理相对来说比较简单,只涉及client和service端。 另外一些复杂的命令最后会由server端处理,
比如adb
shell 。
二、adb shell命令执行过程(以通过网络方式连接为例)
1、client端
adb_commandline() -> interactive_shell() -> adb_connect("shell:") -> _adb_connect("shell:")
->socket_loopback_client(),
这样就跟本地的service建立了一个socket连接(通过本地的5037端口),然后开始向service端发送数据。
2、service端
在上一篇<<Android ADB实现解析>>中讲到,service端代码执行install_listener(local_name, "*smartsocket*", NULL, 0)
之后,就开始监听本地5037端口,处理函数设置为ss_listener_event_func()。因此,这时service端收到client的数据,将
触发ss_listener_event_func() , 该函数中通过create_local_socket()和connect_to_smartsocket构造一个
asokcet(关联5037端口), 这个asocket负责与client端通信,通过fevent_install()设置监听,回调处理函数为
local_socket_event_func()。local_socket_event_func()对应进入FDE_READ处理部分,先创建一个apacket, 再调用
s->peer->enqueue(), 在前面的connect_to_smartsocket()中, s->peer已经指向了ss, 所以调用ss->enqueue函数,也就是
smart_socket_enqueue(), 如果收到的数据是"shell" ,就调用connect_to_remote(), 这时service端将向server端发送
A_OPEN命令开始一系列通讯。
3、server端
同样是在上一篇<<Android ADB实现解析>>中讲到, server端代码执行local_init()之后,会开始监听本地5555端口。因此,
当收到第二步中发来的数据后,output_thread先读取数据,触发transport_socket_events() -> handle_packet() ->
create_local_service_socket() -> service_to_fd() -> create_subproc_thread(),
create_subproc_thread()将fork一个进程执行exec /system/bin/sh。
完成这些之后, client端就出现shell的提示符, 这以后的shell命令就通过socket发送到server, 由server端新fork的
线程处理,将结果再通过socket返回client端显示。
三、小结
通过以上两个命令的解析,再结合上一篇<<Android ADB实现解析>>, 对adb中命令的实现过程已经有了大概的了解,其它
命令的处理类似。 但整个adb系统比较复杂,两篇文章只讲解了一个粗略的结构,许多细节没有一一解析,后续如果有机会,
将再就某些细节部分作深入研究。
一、adb connect命令执行过程
目前adb支持两种形式建立host端和device端的连接:USB和网络。
adb connect命令的作用就是建立host和device之间的TCP/IP连接。
1、client端
adb_commnadline() -> adb_query() -> adb_connect("host:connect:xx.xx.xx.xx") ->
_adb_connect("host:connect:xx.xx.xx.xx") -> writex(fd, ...) ,
其中fd是service对5037端口进行监听的描述符。
2、service端
client端发来的数据 -> local_socket_event_func() -> smart_socket_enqueue() -> create_host_service_socket()
-> host_service_to_socket() ->connect_service() ,
conncet_service()中会与xx.xx.xx.xx.:5555建立socket连接,然后通过register_socket_transport()创建对这个socket的
监听。
adb connect命令处理相对来说比较简单,只涉及client和service端。 另外一些复杂的命令最后会由server端处理,
比如adb
shell 。
二、adb shell命令执行过程(以通过网络方式连接为例)
1、client端
adb_commandline() -> interactive_shell() -> adb_connect("shell:") -> _adb_connect("shell:")
->socket_loopback_client(),
这样就跟本地的service建立了一个socket连接(通过本地的5037端口),然后开始向service端发送数据。
2、service端
在上一篇<<Android ADB实现解析>>中讲到,service端代码执行install_listener(local_name, "*smartsocket*", NULL, 0)
之后,就开始监听本地5037端口,处理函数设置为ss_listener_event_func()。因此,这时service端收到client的数据,将
触发ss_listener_event_func() , 该函数中通过create_local_socket()和connect_to_smartsocket构造一个
asokcet(关联5037端口), 这个asocket负责与client端通信,通过fevent_install()设置监听,回调处理函数为
local_socket_event_func()。local_socket_event_func()对应进入FDE_READ处理部分,先创建一个apacket, 再调用
s->peer->enqueue(), 在前面的connect_to_smartsocket()中, s->peer已经指向了ss, 所以调用ss->enqueue函数,也就是
smart_socket_enqueue(), 如果收到的数据是"shell" ,就调用connect_to_remote(), 这时service端将向server端发送
A_OPEN命令开始一系列通讯。
3、server端
同样是在上一篇<<Android ADB实现解析>>中讲到, server端代码执行local_init()之后,会开始监听本地5555端口。因此,
当收到第二步中发来的数据后,output_thread先读取数据,触发transport_socket_events() -> handle_packet() ->
create_local_service_socket() -> service_to_fd() -> create_subproc_thread(),
create_subproc_thread()将fork一个进程执行exec /system/bin/sh。
完成这些之后, client端就出现shell的提示符, 这以后的shell命令就通过socket发送到server, 由server端新fork的
线程处理,将结果再通过socket返回client端显示。
三、小结
通过以上两个命令的解析,再结合上一篇<<Android ADB实现解析>>, 对adb中命令的实现过程已经有了大概的了解,其它
命令的处理类似。 但整个adb系统比较复杂,两篇文章只讲解了一个粗略的结构,许多细节没有一一解析,后续如果有机会,
将再就某些细节部分作深入研究。
相关文章推荐
- (五) u-boot 命令执行过程解析与添加自定义命令
- shell命令的解析执行过程
- 配置命令执行过程
- bash命令解析过程(ZZ)
- HDFS------hadoop fs -get命令的代码执行过程
- Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script
- Oracle SQL 的硬解析和软解析 以及 SQL的整个在Oracle中的执行过程。
- Microsoft SQL Server 2000在复制的时候包含两个过程,攻击者可以操作输入提供恶意参数给存储过程,可导致执行任意命令。
- Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script
- LLBL Gen 3.x 源代码追踪与解析 存储过程的执行
- 在命令窗口下编写Oracle存储过程并执行的简单例子
- 第10周-任务0-构造和析构函数的执行过程实例解析
- make命令执行过程
- Linux Source命令及脚本的执行方式解析
- Linux之GCC命令 -- 解析GCC编译的四个过程
- HDFS------hadoop fs -ls命令的执行过程
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- PL/SQL命令窗口里,过程,包,触发器等不能执行的解决办法
- SQL SERVER 给一个大表添加自增主建 执行过程解析
- GlusterFS命令解析过程