欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > adb简介

adb简介

2024/10/24 18:16:12 来源:https://blog.csdn.net/qq_34358193/article/details/140122146  浏览:    关键词:adb简介

ADB 的实现涉及到多个组件和多个步骤。下面是详细的实现过程:

1. 架构组成

  • ADB Client:运行在主机上,用户通过它发送命令。
  • ADB Daemon(adbd):运行在Android设备上,负责接收和执行来自ADB Client的命令。
  • ADB Server:在主机上运行,负责管理ADB Client和ADB Daemon之间的通信。

2. 启动和连接过程

  1. 启动ADB Server

    • 当用户在主机上执行ADB命令时,ADB Client首先检查ADB Server是否已经启动。
    • 如果ADB Server没有启动,ADB Client会启动ADB Server,监听5037端口。
  2. 连接设备

    • ADB Server启动后,会扫描主机上的所有USB端口和通过网络连接的设备。
    • 通过USB连接的设备,ADB Server会与设备上的ADB Daemon进行握手,建立连接。
    • 通过网络连接的设备(Wi-Fi),ADB Server会尝试连接到设备的5555端口(默认)。
  3. 建立通信通道

    • 一旦连接建立,ADB Server会维护一个设备列表,并为每个设备创建一个专门的通信通道。

3. 命令执行流程

  1. 发送命令

    • 用户在ADB Client上输入命令,例如 adb shell
    • ADB Client将命令发送给ADB Server。
  2. 转发命令

    • ADB Server接收到命令后,根据设备的状态和命令类型,将命令转发给对应的ADB Daemon。
  3. 执行命令

    • ADB Daemon接收到命令后,执行相应的操作,例如启动一个shell会话。
    • 执行结果通过通信通道返回给ADB Server,ADB Server再将结果返回给ADB Client。

4. 通信协议

  • 基于TCP/IP:ADB Server与ADB Daemon之间的通信通常使用TCP/IP协议。
  • 消息格式:ADB通信消息采用固定的格式,通常包括一个4字节的消息头和一个可变长度的消息体。消息头包含命令类型和消息体长度等信息。

5. 实际实现细节

  • USB连接

    • 通过USB连接时,ADB使用一种基于USB的自定义协议进行数据传输。
    • 主机上的ADB Server通过USB接口与设备上的ADB Daemon进行通信。
  • 网络连接

    • 用户可以通过命令 adb tcpip <port> 将设备的ADB Daemon配置为通过网络监听指定端口。
    • 然后可以使用 adb connect <device_ip>:<port> 命令通过网络连接设备。

6. 常见命令及其实现

  • adb devices

    • 列出所有连接的设备及其状态。
    • ADB Server向所有已连接设备的ADB Daemon发送请求,并收集响应信息。
  • adb shell

    • 在设备上打开一个shell会话。
    • ADB Client通过ADB Server向设备的ADB Daemon发送shell命令,设备上的shell进程将输出结果返回给客户端。
  • adb push / adb pull

    • 在主机和设备之间传输文件。
    • ADB Client将文件数据分块发送给ADB Server,ADB Server再转发给设备上的ADB Daemon进行文件存储或读取。

通过以上步骤和机制,ADB实现了主机与Android设备之间的高效通信和管理。

实现一个简单的 ADB 通信的 C 语言示例

展示了如何通过 ADB 连接到设备并执行命令。我们可以使用 popen 函数来执行系统命令并获取其输出。

C语言示例代码

#include <stdio.h>
#include <stdlib.h>// 执行ADB命令并返回结果
void adb_command(const char *command, char *output, size_t output_size) {FILE *fp;char buffer[128];// 使用popen函数执行命令并打开管道读取输出fp = popen(command, "r");if (fp == NULL) {snprintf(output, output_size, "Error: Failed to run command.\n");return;}// 读取命令输出while (fgets(buffer, sizeof(buffer), fp) != NULL) {strncat(output, buffer, output_size - strlen(output) - 1);}// 关闭管道pclose(fp);
}// 列出所有连接的设备
void list_devices(char *output, size_t output_size) {adb_command("adb devices", output, output_size);
}// 在设备上执行ADB shell命令
void adb_shell(const char *command, char *output, size_t output_size) {char full_command[256];snprintf(full_command, sizeof(full_command), "adb shell %s", command);adb_command(full_command, output, output_size);
}int main() {// 列出所有连接的设备char devices_output[1024] = {0};printf("连接的设备列表:\n");list_devices(devices_output, sizeof(devices_output));printf("%s\n", devices_output);// 在设备上执行命令char ls_output[1024] = {0};printf("\n在设备上执行'ls /'命令:\n");adb_shell("ls /", ls_output, sizeof(ls_output));printf("%s\n", ls_output);return 0;
}

代码说明

  1. adb_command:

    • 使用 popen 函数执行系统命令并打开管道读取命令输出。
    • 将命令输出存储在 output 缓冲区中。
    • 关闭管道。
  2. list_devices:

    • 调用 adb_command 函数执行 adb devices 命令。
    • 将结果存储在 output 缓冲区中。
  3. adb_shell:

    • 构造完整的 ADB shell 命令,如 adb shell ls /
    • 调用 adb_command 函数执行构造的命令。
    • 将结果存储在 output 缓冲区中。
  4. main:

    • 调用 list_devices 函数列出所有连接的设备并打印结果。
    • 调用 adb_shell 函数在设备上执行 ls / 命令并打印结果。

使用说明

  1. 安装 ADB:

    • 确保已安装 ADB 工具,并将其路径添加到环境变量中。
    • 可以通过官方网站下载 ADB 工具,或者通过 Android SDK 安装。
  2. 连接设备:

    • 使用 USB 线连接 Android 设备到电脑,或者通过 Wi-Fi 连接设备。
    • 确保设备已开启开发者选项和 USB 调试模式。
  3. 编译和运行代码:

    • 保存上述代码为 adb_example.c 文件。
    • 在命令行中运行 gcc adb_example.c -o adb_example 以编译代码。
    • 运行 ./adb_example 以执行代码。

该示例代码展示了如何通过 C 语言调用 ADB 命令与 Android 设备进行通信,包括列出连接的设备和在设备上执行 shell 命令。

实现一个简单的 ADB 通信的 Java 语言示例

可以通过执行命令行来与 ADB 进行交互。下面的代码展示了如何通过 Java 调用 ADB 命令列出连接的设备并执行 shell 命令。

java示例代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;public class ADBExample {// 执行ADB命令并返回结果public static String adbCommand(String command) {StringBuilder output = new StringBuilder();Process process = null;BufferedReader reader = null;try {// 执行命令process = Runtime.getRuntime().exec(command);// 读取命令输出reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {output.append(line).append("\n");}// 等待进程结束并获取退出状态process.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (process != null) {process.destroy();}}return output.toString();}// 列出所有连接的设备public static String listDevices() {return adbCommand("adb devices");}// 在设备上执行ADB shell命令public static String adbShell(String command) {return adbCommand("adb shell " + command);}public static void main(String[] args) {// 列出所有连接的设备System.out.println("连接的设备列表:");String devices = listDevices();System.out.println(devices);// 在设备上执行命令System.out.println("\n在设备上执行'ls /'命令:");String lsResult = adbShell("ls /");System.out.println(lsResult);}
}

代码说明

  1. adbCommand:

    • 使用 Runtime.getRuntime().exec 执行系统命令并打开进程读取命令输出。
    • 使用 BufferedReader 读取命令输出并将其存储在 StringBuilder 中。
    • 等待进程结束并获取退出状态。
    • 处理异常和资源关闭。
  2. listDevices:

    • 调用 adbCommand 函数执行 adb devices 命令。
    • 返回设备列表。
  3. adbShell:

    • 构造完整的 ADB shell 命令,如 adb shell ls /
    • 调用 adbCommand 函数执行构造的命令。
    • 返回命令输出结果。
  4. main:

    • 调用 listDevices 函数列出所有连接的设备并打印结果。
    • 调用 adbShell 函数在设备上执行 ls / 命令并打印结果。

使用说明

  1. 安装 ADB:

    • 确保已安装 ADB 工具,并将其路径添加到环境变量中。
    • 可以通过官方网站下载 ADB 工具,或者通过 Android SDK 安装。
  2. 连接设备:

    • 使用 USB 线连接 Android 设备到电脑,或者通过 Wi-Fi 连接设备。
    • 确保设备已开启开发者选项和 USB 调试模式。
  3. 编译和运行代码:

    • 保存上述代码为 ADBExample.java 文件。
    • 在命令行中运行 javac ADBExample.java 以编译代码。
    • 运行 java ADBExample 以执行代码。

该示例代码展示了如何通过 Java 调用 ADB 命令与 Android 设备进行通信,包括列出连接的设备和在设备上执行 shell 命令。

实现一个简单的 ADB 通信python示例代码

可以通过 Python 使用 subprocess 模块与 ADB 进行交互。下面是一个基本的示例代码,展示了如何通过 ADB 连接到设备并执行命令。

python 示例代码

import subprocessdef adb_command(command):"""执行ADB命令并返回结果。:param command: ADB命令字符串。:return: 命令输出结果。"""try:result = subprocess.run(['adb'] + command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)if result.returncode == 0:return result.stdout.strip()else:return f"Error: {result.stderr.strip()}"except FileNotFoundError:return "Error: ADB工具未找到,请确保已安装ADB并配置环境变量。"def list_devices():"""列出所有连接的设备。:return: 设备列表。"""result = adb_command('devices')return resultdef adb_shell(command):"""在设备上执行ADB shell命令。:param command: shell命令字符串。:return: 命令输出结果。"""result = adb_command(f'shell {command}')return resultdef main():# 列出所有连接的设备print("连接的设备列表:")devices = list_devices()print(devices)# 在设备上执行命令print("\n在设备上执行'ls /'命令:")ls_result = adb_shell('ls /')print(ls_result)if __name__ == '__main__':main()

代码说明

  1. adb_command:

    • 执行任意 ADB 命令。使用 subprocess.run 运行 ADB 命令并捕获输出和错误。
    • command 参数是 ADB 命令字符串,如 devicesshell ls /
    • 返回命令输出或错误信息。
  2. list_devices:

    • 列出所有连接的设备。
    • 使用 adb_command 函数执行 adb devices 命令。
    • 返回设备列表。
  3. adb_shell:

    • 在设备上执行 ADB shell 命令。
    • 使用 adb_command 函数执行 adb shell <command> 命令。
    • 返回命令输出结果。
  4. main:

    • 调用 list_devices 函数列出所有连接的设备并打印结果。
    • 调用 adb_shell 函数在设备上执行 ls / 命令并打印结果。

使用说明

  1. 安装 ADB:

    • 确保已安装 ADB 工具,并将其路径添加到环境变量中。
    • 可以通过官方网站下载 ADB 工具,或者通过 Android SDK 安装。
  2. 连接设备:

    • 使用 USB 线连接 Android 设备到电脑,或者通过 Wi-Fi 连接设备。
    • 确保设备已开启开发者选项和 USB 调试模式。
  3. 运行代码:

    • 保存上述代码为 adb_example.py 文件。
    • 在命令行中运行 python adb_example.py 以执行代码。

该示例代码展示了如何通过 Python 调用 ADB 命令与 Android 设备进行通信,包括列出连接的设备和在设备上执行 shell 命令。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com