adb命令执行过程解析

本文将以"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系统比较复杂,两篇文章只讲解了一个粗略的结构,许多细节没有一一解析,后续如果有机会,

将再就某些细节部分作深入研究。

时间: 2024-10-24 11:09:50

adb命令执行过程解析的相关文章

Redis 命令执行过程(下)

在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据到输入缓冲区,解析命令,执行命令等过程的原理和实现细节.接下来,我们来具体看一下 set 和 get 命令的实现细节和如何将命令结果通过输出缓冲区和 socket 发送给 Redis 客户端. set 和 get 命令具体实现 前文讲到 processCommand 方法会从输入缓冲区中解析出对应的 redi

Linux命令执行过程

在shell中可执行命令分为:   内部命令:由shell自带,会随着系统启动   外部命令:在系统中有对应的可执行文件 通过type可查看命令是否为内部命令 [[email protected] ~]#type pwd # 内部命令 pwd is a shell builtin [[email protected] ~]#type top # 外部命令 top is /usr/bin/top 内部命令直接从内存中读取而外部命令需要从系统文件中读取 [[email protected] ~]#e

linux命令执行过程详解

1.执行命令输入命令后回车提请shell程序找到键入命令所对应的可执行程序或者代码,并且由其分期后,提交给内核分配资源将其运行起来.在shell中可执行的命令有俩类:内部命令:由shell自带的内部集成命令help 可以查看内部命令列表 [[email protected] ~]# help GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) These shell commands are defined internal

第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输进来的參数: 由于MonkeyRunner须要依据指定的參数才干做事情,比方输入的一个须要执行的脚本. 假设确实不知道不论什么參数的话它就会进入MonkeyRunner的交互模式,事实上就是Jythong的交互模式,让用户能够边写代码边执行 启动AndroidDebugBridge: 事实上就是启动

Monkey的ADB命令简单使用解析(1)

进行简单的压力测试: 1. adb shell monkey –p 包名 –v-v 3000 >E:\bugLog.txt -v -v 标识打印的日志的详细级别为2级,更高级有3级,也可以用1级,一级的话,一个 -v 就可以了: ">E:\bugLog.txt"标识把日志文件打出到本地PC机的E盘,文件名称是bugLog.txt; 2. adb shell monkey --pct-nav 100 –p 包名 –v-v 3000 >E:\bugLog.txt02 其中

图解“管道过滤器模式”应用实例:SOD框架的命令执行管道

管道和过滤器 管道和过滤器是八种体系结构模式之一,这八种体系结构模式是:层.管道和过滤器.黑板.代理者.模型-视图-控制器(MVC) 表示-抽象-控制(PAC).微核.映像. 管道和过滤器适用于需要渐增式处理数据流的领域,而常见的“层”模式它 能够被分解成子任务组,其中每个子任务组处于一个特定的抽象层次上. 按照<POSA(面向模式的软件架构)>里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构.管道过滤器和生产流水线类似,在生产流水线上

shell 将变量当命令执行问题【多条命令同时执行问题】

shell将变量当命令执行问题[多条命令同时执行问题] 今天写了个shell脚本,脚本中需要将变量当做shell命令运行,通常的方法有多种,比如: `${var}` 将变量内容当shell命令行执行 $(${var}) 将变量内容当shell命令执行 ${var}将变量内容当shell命令执行[不推荐此种方法] 但是这3种方法只能运行单条命令,当命令是下面类型时就会有问题: VAR1='cd /home ;echo "hello";echo "good"' VAR2

linux :TOP命令及参数解析

第二行 分别显示:total进程总数. running正在运行的进程数. sleeping睡眠的进程数.stopped停止的进程数. zombie僵尸进程数. 第三行 分别显示: %us 用户空间占用CPU百分比. %sy 内核空间占用CPU百分比. %ni 用户进程空间内改变过优先级的进程占用CPU百分比. %id 空闲CPU百分比. %wa 等待输入输出(I/O)的CPU时间百分比 . %hi指的是cpu处理硬件中断的时间.%si指的是cpu处理软中断的时间 . %st用于有虚拟cpu的情况

JS的解析与执行过程(javascript面向对象一)

JS的解析与执行过程 全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. 一.全局环境中如何理解预处理 比如说下面的这段代码: var a = 1;//用var定义的变量,以赋值 var b;//用var定义的变量,未赋值 c = 3;//未定义,直接赋值 function d(){//用声明的方式声明的函数 console.log('hello'