Adb的全称为Android Debug Bridge,起到通过PC对Android系统的调试桥的作用,是一个多用途的工具,它能够执行多种命令,还能提供一个shell。这儿简单介绍一下Adb的代码结构,并在某些情况下我们可以获取root权限。
Adb的代码在system/core/adb里,它的入口函数很直接了当:
[cpp]
int main(int argc, char **argv)
{
#if ADB_HOST //代码被ADB_HOST宏分成两部分,一部分是宿主,即被ADB_HOST定义包括的部分,运行在Windows或Linux系统上。另一部分是目标,即Android系统上的deamon程序。
adb_sysdeps_init();
adb_trace_init();
D("Handling commandline()\n");
return adb_commandline(argc - 1, argv + 1);
#else
/* If adbd runs inside the emulator this will enable adb tracing via
* adb-debug qemud service in the emulator. */
adb_qemu_trace_init();
if((argc > 1) && (!strcmp(argv[1],"recovery"))) {
adb_device_banner = "recovery";
recovery_mode = 1;
}
start_device_log();
D("Handling main()\n");
return adb_main(0, DEFAULT_ADB_PORT);
#endif
}
int main(int argc, char **argv)
{
#if ADB_HOST //代码被ADB_HOST宏分成两部分,一部分是宿主,即被ADB_HOST定义包括的部分,运行在Windows或Linux系统上。另一部分是目标,即Android系统上的deamon程序。
adb_sysdeps_init();
adb_trace_init();
D("Handling commandline()\n");
return adb_commandline(argc - 1, argv + 1);
#else
/* If adbd runs inside the emulator this will enable adb tracing via
* adb-debug qemud service in the emulator. */
adb_qemu_trace_init();
if((argc > 1) && (!strcmp(argv[1],"recovery"))) {
adb_device_banner = "recovery";
recovery_mode = 1;
}
start_device_log();
D("Handling main()\n");
return adb_main(0, DEFAULT_ADB_PORT);
#endif
}
先看宿主代码的路径,我们看到它进入了adb_commandline()函数,这里主要是负责解析参数并执行相应的命令,注意这儿在执行命令之前还有一个启动本地服务的动作:
[cpp]
if (is_server) {
if (no_daemon || is_daemon) {
r = adb_main(is_daemon, server_port); //Linux平台
} else {
r = launch_server(server_port); //Windows平台
}
if(r) {
fprintf(stderr,"* could not start server *\n");
}
return r;
}
if (is_server) {
if (no_daemon || is_daemon) {
r = adb_main(is_daemon, server_port); //Linux平台
} else {
r = launch_server(server_port); //Windows平台
}
if(r) {
fprintf(stderr,"* could not start server *\n");
}
return r;
}
这儿会区分宿主平台是Linux还是Windows,他们的服务形态是不一样 的。我们可以使用adb start-server, adb kill-server这样的命令原因在此。
在本地服务启动前会有一些初始化工作,例如USB的初始化:
[cpp]
#if ADB_HOST
HOST = 1;
usb_vendors_init();
usb_init();
local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
char local_name[30];
build_local_name(local_name, sizeof(local_name), server_port);
if(install_listener(local_name, "*smartsocket*", NULL)) {
exit(1);
}
#else
#if ADB_HOST
HOST = 1;
usb_vendors_init();
usb_init();
local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
char local_name[30];
build_local_name(local_name, sizeof(local_name), server_port);
if(install_listener(local_name, "*smartsocket*", NULL)) {
exit(1);
}
#else
因为adb是通过USB 进行socket通信,以adb devices的命令执行过程分析如下:
1. 组织命令格式,
[cpp]
if(!strcmp(argv[0], "devices")) {
char *tmp;
snprintf(buf, sizeof buf, "host:%s", argv[0]); //命令格式为:host:devices
tmp = adb_query(buf); //发送命令并返回命令执行结果
if(tmp) {
printf("List of devices attached \n");
printf("%s\n", tmp); //打印结果