了解:
1.adb框架
Android Adb 一共分为三个部分:adb、adb server、adbd,源码路径:system/core/adb。根据他们运行的地方不同,可以分为pc端和手机端两部分。
pc端
adb client和adb server 是运行在PC端,adb就是大家所熟悉的控制台命令adb,adb server是由adb fork出的一个常驻后台的子进程,作为adb的server进程,adb kill-server就是kill掉这个进程。adb与adb server 通过local socket进行通信。
手机端
adbd运行在Android端,是在内核初始化完毕之后,由init进程启动。
2.adbd启动流程
手机端的adbd是在init解析rc文件的时候启动的,具体可以查看init.rc中的配置信息。根据注释,可以了解到adbd的启动是根据一个属性触发器来控制的,具体的触发器在init.<platform>.usb.rc文件中。
on property:ro.debuggable=1
start console
# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
class core
socket adbd stream 660 system system
disabled
seclabel u:r:adbd:s0
# adbd on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
接下来我们看看在init.<platform>.usb.rc文件中如何定义触发器。触发器根据sys.usb.config的值来决定是否启动adbd,其实就是仅当sys.usb.config的值中包含adb选项时才会启动adbd。
on property:sys.usb.config=ptp,adb
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 18D1
write /sys/class/android_usb/android0/idProduct 4EE6
write /sys/class/android_usb/android0/bDeviceClass 0
write /sys/class/android_usb/android0/bDeviceSubClass 0
write /sys/class/android_usb/android0/bDeviceProtocol 0
write /sys/class/android_usb/android0/functions ptp,adb
write /sys/class/android_usb/android0/enable 1
start adbd
setprop sys.usb.state ${sys.usb.config}
adbd的启动代码在system/core/adb/daemon/main.cpp中,其中main函数调用了adbd_main完成启动过程。adbd是一个linux程序,通过tcp或者usb与PC端的adb server通信,调用logcat shell等等程序实现各种调试功能。
代码1 main.cpp
int adbd_main(int server_port) {
umask(0);
signal(SIGPIPE, SIG_IGN);
init_transport_registration();
// We need to call this even if auth isn't enabled because the file// descriptor will always be open.
adbd_cloexec_auth_socket();
if (ALLOW_ADBD_NO_AUTH && !android::base::GetBoolProperty("ro.adb.secure", false)) {
auth_required = false;
}
adbd_auth_init();
// Our external storage path may be different than apps, since// we aren't able to bind mount after dropping root.const char* adb_external_storage = getenv("ADB_EXTERNAL_STORAGE");
if (adb_external_storage != nullptr) {
setenv("EXTERNAL_STORAGE", adb_external_storage, 1);
} else {
D("Warning: ADB_EXTERNAL_STORAGE is not set. Leaving EXTERNAL_STORAGE"" unchanged.\n");
}
drop_privileges(server_port);
bool is_usb = false;
if (access(USB_FFS_ADB_EP0, F_OK) == 0) {// Listen on USB.
usb_init();
is_usb = true;
}// If one of these properties is set, also listen on that port.// If one of the properties isn't set and we couldn't listen on usb, listen// on the default port.
std::string prop_port = android::base::GetProperty("service.adb.tcp.port", "");
if (prop_port.empty()) {
prop_port = android::base::GetProperty("persist.adb.tcp.port", "");
}int port;
if (sscanf(prop_port.c_str(), "%d", &port) == 1 && port > 0) {
D("using port=%d", port);
// Listen on TCP port specified by service.adb.tcp.port property.
setup_port(port);
} else if (!is_usb) {// Listen on default port.
setup_port(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
}
D("adbd_main(): pre init_jdwp()");
init_jdwp();
D("adbd_main(): post init_jdwp()");
D("Event loop starting");
fdevent_loop();
return 0;
}int main(int argc, char** argv) {while (true) {static struct option opts[] = {
{"root_seclabel", required_argume