本文转载自:http://blog.csdn.net/wlwl0071986/article/details/50935496

一、adb守护进程的初始化

源码路径:~/system/core/adb/adb.c

int main(int argc, char **argv)

---> start_device_log()

---> property_get("persist.adb.trace_mask", value, "")  // 如果定义了该属性,则打开对应adb log开关

---> adb_main(0, DEFAULT_ADB_PORT)

---> init_transport_registration()  //在注册adb传输通道之前,初始化注册通道的处理函数

---> property_get("service.adb.tcp.port", value, "")

---> local_init(port)  //如果定义了该属性,则使用指定接口通过tcp连接adbd

---> adb_thread_create(&thr, server_socket_thread, (void *)port)  //创建adbd socket传输线程

---> adb_socket_accept(serverfd, &addr, &alen)  //侦听来自adb server的连接请求

---> register_socket_transport(fd, "host", port, 1)  //如果连接成功,

//则注册一个socket传输通道和server进行命令交互

---> access("/dev/android_adb", F_OK)

---> usb_init()  //如果没有设置tcp端口,并且android_adb存在,则使用usb连接adbd

---> adb_thread_create(&tid, usb_open_thread, h)  //创建打开android_adb文件的线程

---> usb_open_thread()

---> unix_open("/dev/android_adb", O_RDWR) //打开android_adb

---> register_usb_transport(usb, 0, 1)

---> init_usb_transport(...)  //初始化usb传输通道的数据结构

---> register_transport(t)  //往transport_registration_send描述符写注册命令

---> transport_registration_recv()  //处理函数通过transport_registration_recv描述符接收到的命令

---> adb_thread_create(&input_thread_ptr, input_thread, t)  //创建adb输入通道

---> adb_thread_create(&output_thread_ptr, output_thread, t)  //创建adb输出通道

以上为adb守护进程初始化的大致流程,创建传输通道的细节,大家可以跟踪代码看看。

二、adb的运行机制和框架结构

下面以一张图来进行分析:

完整的数据处理流程:

1:PC端adb server发送cmd到小机端

2:adbd(adb daemon)的output thread从/dev/android_usb读取到cmd并解析

(adbd和内核usb driver通过/dev/android_usb进行数据交互)

3:output_thread将解析的cmd写到socketpair的A端

4:fdevent_loop通过select socketpair的B端,得知A端有数据写入,B端可读,然后读取cmd,

进行处理(handle_packet)

5:处理完后将结果写到socketpair的B端

6:Input_thread阻塞式读取socketpair的A端

7:Input_thread读取到数据后,写入/dev/android_usb

8:由usb driver将response发给pc端

output_thread负责读取/dev/android_usb,Input_thread负责写入

ADB运行框架原理解析【转】的更多相关文章

  1. Linux入门:运行级别解析

    Linux入门:运行级别解析   一.查看当前运行级别 Ubuntu中,runlevel命令 可以查看当前运行级别: CentOS中,who -r 命令查看当前运行级别:   www.2cto.com ...

  2. [MapReduce_3] MapReduce 程序运行流程解析

    0. 说明 Word Count 程序运行流程解析 &&  MapReduce 程序运行流程解析 1. Word Count 程序运行流程解析 2. MapReduce 程序运行流程图

  3. ADB 运行原理

    ADB基本命令和简介 ADB就是Android Debug Bridge,Android调试桥的意思,很形象.需要在电脑上安装SDK Platform Tools 对应的版本才能使用 基于ADB的工具 ...

  4. (转)Apache和Nginx运行原理解析

    Apache和Nginx运行原理解析 原文:https://www.server110.com/nginx/201402/6543.html Web服务器 Web服务器也称为WWW(WORLD WID ...

  5. View Animation 运行原理解析

    Android 平台目前提供了两大类动画,在 Android 3.0 之前,一大类是 View Animation,包括 Tween animation(补间动画),Frame animation(帧 ...

  6. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数 2

    我们这一节会先去分析下monkeyrunner是如何对参数进行处理的,我们跳转到MonkeyRunnerOptions这个类里面的processOptions这个方法: 93   public sta ...

  7. MapReduce 运行全过程解析

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 前言 前面我们讲了 MapReduce 的编程模型,我们知道他主要分成两大阶段来完成一项任务,一是 m ...

  8. php运行步骤解析

    2000年, PHP4.0发布的时候,引入了Zend Engine. Zend引擎把PHP代码的执行切分成两个阶段: 一. Zend Engine 解析PHP代码并生成二进制中间码Zend Opcod ...

  9. 转:Apache和Nginx运行原理解析

    Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. 应用层使用HTTP协议. HTML文档格式. 浏览器统一资源定位器(URL). Web服 ...

随机推荐

  1. Java程序性能优化之缓冲优化

    优化前的代码: package com; import javax.swing.*; import java.awt.*; /** * 使用Eclipse,右键Run As,Java Applet运行 ...

  2. PHP中的验证码类(准备篇)

    <!--code.php内容--> <?php //开启session session_start(); include "vcode.class.php"; / ...

  3. PHP文件上传设置和处理(单文件)

    <!--upload.php内容--><?php /* 修改php.ini的设置 file_uploads必须是On upload_max_filesize 设置上传文件的大小,此值 ...

  4. 16.1114 模拟考试T1

    1.正确答案 [题目描述] 小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案. “吔,我的答案和你都不一样!”,小Y说道,”我们去找神犇们问答案吧”. 外卡组试卷中共有m道判断题, ...

  5. [MFC] CFile读写文件实现(高效)

    1.文件写入 void CMFCApplication1Dlg::Write() { CFile file; CString FileName = "D:\\100w.txt"; ...

  6. 解决U3D4.1.5或以上无法启动MONODEV的方法

    通常会报这样的错误 System.EntryPointNotFoundException: Unable to find an entry point named 'gtksharp_list_get ...

  7. Day 12 shell语法及程序若干

    1. 现归纳一下shell中的运算符:       +:对两个变量做加法.    -:对两个变量做减法.    *:对两个变量做乘法.    /:对两个变量做除法.    **:对两个变量做幂运算.  ...

  8. 使用javaconfig方式配置spring工程的单元测试

    添加@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {MoveModelSpringTestConfig ...

  9. BZOJ 1090 字符串折叠(Hash + DP)

    题目链接 字符串折叠 区间DP.$f[l][r]$为字符串在区间l到r的最小值 正常情况下 $f[l][r] = min(f[l][r], f[l][l+k-1]+f[l+k][r]);$ 当$l$到 ...

  10. 程序防止SqlServer使用SqlServer Profiler跟踪

    思路: 1.使用默认函数(fn_trace_getinfo)查询跟踪列表: 2.调用系统存储过程(sp_trace_setstatus)修改跟踪状态. 相关Sql : declare @default ...