Bootstrap

adb通信协议分析以及实现(二):adb服务进程发现设备

  adb服务进程一个重要的功能就是查找设备,当插入一个android设备,并且成功安装手机驱动后,adb的服务进程就可以发现设备,当adb进程使用devices命令的时候,服务进程把自己保存的设备列表返回给adb进程。这里解释一下,adb进程和adb服务进程。其实这两个东西是一个exe文件,仅仅是在启动的时候通过不同的命令行来区别。这里贴一下adb的代码,就能更好的理解adb服务进程了。

1)进程启动之后,经过各种的初始化之后,进入了adb_commandline函数。这个函数是用来处理所有的命令行:


2)之后解析命令行,其中就有一个关键的命令:


3)在第二步设置了标志之后,后面就是进入了一个死循环,然后这个服务进程就一直在后台了:



下面是adb_main函数中代码片段,有一个死循环,一直在查找设备:


主线程的死循环里面很简单,就是从消息队列获取消息,处理之后转发等等:


以上就是adb服务进程启动的一个大致的过程,adb服务进程在启动过程中会做比较多的事情,下面列举一些重要的事件:

1)启动一个线程,每隔1s扫描一下设备:


函数里面启动一个线程:


线程的实现代码,find_devices函数内部再遍历设备,把新设备加入到设备列表中:


接下来重点说一下find_devices函数里面的一个细节,前一篇文章说到设备序列号,很多手机的序列号是一样的,就会导致同时插入多个手机的时候区分不开始哪个手机。由于序列号相同,所以执行adb命令的时候就不知道发给哪个手机了。这个过程涉及到USB接口的操作,谷歌的代码里面有一套adbwinapi,其实里面就是用的windows的setupapi函数而已:



可以根据接口来做一个变换,因为每个硬件的接口是唯一的,所以可以根据这个接口来变换,然后返回即可。buffer是保存的序列号,只要把你需要的序列号写入这个缓存就可以。buffer_char_size这个参数缓存的是长度。不要越界了。

adb通信协议分析以及实现(一):www.jianshu.com/p/713c7823d…

adb通信协议分析以及实现(二):www.jianshu.com/p/4bdd315a9…

adb通信协议分析以及实现(三):www.jianshu.com/p/23581d48f…

adb通信协议分析以及实现(四):www.jianshu.com/p/639fd2155…

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;