• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程

android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了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



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程

相关文章

  • 2017-05-26Android群英传笔记系列二view的绘制(一),android群英
  • 2017-05-26linux中fcntl()、lockf、flock的区别
  • 2017-05-26Android自定义控件
  • 2017-05-26ViewPager结合view无限滑动,viewpagerview滑动
  • 2017-05-26RadioButton与CheckBox,radiobutton
  • 2017-05-26Android studio .gitignore 文件的内容,android.gitignore
  • 2017-05-26Android开发10:传感器器及地图相关应用,android传感器
  • 2017-05-26Android最佳实践之SystemBar状态栏全版本适配方案
  • 2017-05-26Android学习--RelativeLayout相对布局
  • 2017-05-26策略模式,java策略模式

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android handler 详解(面试百分之100问到),androidhandler
    • 老人桌面===花花绿绿的桌面,老人桌面
    • dpdk内存管理——内存初始化
    • 2.5.8 Notification(状态栏通知)详解
    • Android定位&地图&导航——基于百度地图移动获取位置和自动定位,android定位城市
    • Android中button点击后字体的变色效果,androidbutton
    • android adb pull push,androidadb
    • My First Android Application Project 第一个安卓应用,android安卓
    • 充值,充值平台
    • Accessibility辅助功能--一念天堂,一念地狱,一念天堂一念地狱

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有