一.ADB 基本介绍
adb(Android Debug Bridge)
是在嵌入式软件调试测试中经常使用到的一个工具,它是一个命令行工具,我们可以通过它与仿真器或连接的Android设备进行通信。在android sdk/platform
中可以找到ADB
工具,或者下载ADB Kits
。
二.ADB 基本架构
Adb
源代码位于 源码根目录 system/core/adb
adb
和adb server
是运行在PC端,
adb
就是大家所熟悉的控制台命令adb
,
adb server
是由adb
fork出的一个常驻后台的子进程
adbd
运行在Android端,在/system/bin/adbd
通过Android.bp
脚本去编译
adbd:
cc_defaults {
name: "adbd_defaults",
...
cflags: ["-UADB_HOST", "-DADB_HOST=0"],
...
}
cc_binary {
name: "adbd",
defaults: ["adbd_defaults", "host_adbd_supported"],
...
srcs: [
"daemon/main.cpp",
],
.....
}
adb:
cc_binary_host {
name: "adb",
defaults: ["adb_defaults"],
cc_defaults {
name: "adb_defaults",
cflags: [
...
"-DADB_HOST=1", // overridden by adbd_defaults
"-DALLOW_ADBD_ROOT=0", // overridden by adbd_defaults
],
....
}
1. 这里可以看到cc_binary
用于编译adbd
,cc_binary_host
用于编译adb
,后面加入了host
关键字都是用来编译PC上的可执行程序,
2. 这需要注意的是 ADB_HOST
, Android.bp
中通过 cflags
标签中
-UADB_HOST
取消之前宏定义,-DADB_HOST=1
定义一个宏,并给宏赋值
三.启动流程
首先我们看看adbd的启动流程,
adbd时序图:
adb 时序图
从上面可以看到 adb
模块功能其实也非常多,我们平时最主要的修改可能就是需要做一个私有的 adb
连接,让其他人的 adb
无法连接我们的设备,必须使用我们指定的 adb
才能连接,因此我们这里之讲解 adb
和adbd
的建立连接大致过程
可以看到在adbd
和abd
的执行顺序中,都调用了transport.cpp
这个类中的 init_transport_registration();
后面我们主要就讲解这个函数
我们首先看到adbd
的启动大致流程,看到代码:
首先是 是在rc
中start adbd
,看到如下代码:
system/core/rootdir/init_usb.rc
//adbd 服务在 /system/bin/adbd ,
-- 后面接参数 root_seclabel=u:r:su:s0
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
//给adbd 指定一个类属,便于管理stop core.
class core
//创建一个adbd的socket,这个socket主要是与PC端通信
socket adbd seqpacket 660 system system
//默认不启动,必须通过start启动
Disabled
//selinux的label
seclabel u:r:adbd:s0
//on 后面接触发器,当触发器触发,这进行下面的操作。类似与程序中的判断语句。
on property:sys.usb.config=adb && property:sys.usb.configfs=0
....
//启动adbd service
start adbd
setprop sys.usb.state ${sys.usb.config}