文章目录
- 一、ADB基础
- 1. 工作原理
- 2. 安装与配置
- 二、常用ADB指令分类
- 1. 设备连接与管理
- 2. 文件传输
- 3. 应用管理
- 4. 设备交互
- 5. 系统信息
- 6. 日志与调试
- 7. 网络与端口转发
- 三、高级用法
- 1. 多设备管理
- 2. 无线ADB连接
- 3. 批量执行命令
- 4. ADB脚本示例
- 四、常见问题与解决方案
- 五、注意事项
- 六、进一步学习资源
- 七、C++代码
在自动化生产过程中,可能会遇到各种各样的场景,比如需要通过软件取读写连在电脑上的安卓设备,那此时采用adb指令将是一种极为方便的方法,adb\adb指令、C++代码详细记录如下:
ADB(Android Debug Bridge)是一种功能强大的命令行工具,允许开发者与Android设备进行通信和交互。它是Android SDK的一部分,常用于调试应用程序、安装APK、传输文件以及执行设备命令。下面从多个方面详细介绍ADB及其指令:
一、ADB基础
1. 工作原理
- ADB通过USB或Wi-Fi在计算机(客户端)和Android设备(守护进程adbd)之间建立通信桥梁。
- 通信流程:客户端(如命令行)→ ADB服务器(本地进程)→ 设备上的ADB守护进程。
2. 安装与配置
- 安装:通过Android SDK Platform-Tools安装,或直接下载独立的Platform-Tools包。
- 配置环境变量:将
platform-tools
目录添加到系统PATH中,以便全局使用adb
命令。 - 安装教程网上大把的,这里就不赘述了,参考地址:https://blog.csdn.net/qq_44807940/article/details/140588328
二、常用ADB指令分类
1. 设备连接与管理
adb devices # 列出所有连接的设备(包括模拟器)
adb kill-server # 终止ADB服务器
adb start-server # 启动ADB服务器
adb reconnect # 重新连接设备
2. 文件传输
adb push <本地路径> <设备路径> # 从电脑复制文件到设备
adb pull <设备路径> <本地路径> # 从设备复制文件到电脑
adb shell ls <设备路径> # 查看设备文件列表
3. 应用管理
adb install <APK路径> # 安装APK
adb uninstall <包名> # 卸载应用
adb shell pm list packages # 列出所有安装的应用包名
adb shell pm clear <包名> # 清除应用数据
4. 设备交互
adb shell input text "hello" # 在设备上输入文本
adb shell input keyevent 26 # 按下电源键(26为电源键码)
adb shell input tap x y # 点击屏幕坐标(x,y)
adb shell screencap <路径> # 截图并保存到设备
adb shell screenrecord <路径> # 录制屏幕(最长180秒)
5. 系统信息
adb shell getprop ro.product.model # 获取设备型号
adb shell getprop ro.build.version.release # 获取Android版本
adb shell dumpsys battery # 获取电池信息
adb shell dumpsys wifi # 获取Wi-Fi信息
adb reboot # 重启设备
6. 日志与调试
adb logcat # 查看系统日志
adb logcat -s <标签名> # 过滤特定标签的日志
adb shell ps # 查看进程列表
adb shell top # 查看资源占用情况
7. 网络与端口转发
adb forward tcp:8080 tcp:8080 # 将本地端口8080转发到设备端口8080
adb reverse tcp:8080 tcp:8080 # 将设备端口8080转发到本地端口8080(Android 5.0+)
adb shell ifconfig # 查看网络配置
三、高级用法
1. 多设备管理
当连接多个设备时,使用-s <设备ID>
指定目标设备:
adb -s emulator-5554 shell # 对模拟器执行命令
adb -s 0123456789ABCDEF install app.apk # 对特定设备安装APK
2. 无线ADB连接
需先通过USB连接设备,然后执行:
adb tcpip 5555 # 开启设备的TCP/IP模式,监听5555端口
adb connect <设备IP>:5555 # 通过IP连接设备(断开USB后仍可通信)
3. 批量执行命令
使用adb shell
结合循环或脚本批量操作:
adb shell "for i in $(seq 1 10); do input tap 500 500; done" # 连续点击10次
4. ADB脚本示例
# 自动化安装并启动应用
adb install myapp.apk
adb shell am start -n com.example.app/.MainActivity
四、常见问题与解决方案
-
设备未被识别
- 检查USB连接和驱动
- 重启ADB服务器:
adb kill-server && adb start-server
- 确保设备开启USB调试模式
-
权限问题
- 在设备上确认USB调试授权弹窗
- 使用root权限:
adb root
(需设备已root)
-
无线连接失败
- 确保设备和电脑在同一Wi-Fi网络
- 检查防火墙设置
- 尝试重新执行
adb tcpip 5555
和adb connect
五、注意事项
- 数据安全:ADB可访问设备敏感数据,建议仅在受信任环境使用。
- 性能影响:长时间使用
screenrecord
可能导致设备发热。 - 兼容性:部分指令可能因设备型号或Android版本不同而有差异。
六、进一步学习资源
- 官方文档:Android Developers - ADB
- ADB命令速查表:可在线搜索或使用第三方工具(如ADBKeyBoard)提高效率。
- ADB下载安装:
Windows版本: https://dl.google.com/android/repository/platform-tools-latest-windows.zip
Mac版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip
Linux版本:https://dl.google.com/android/repository/platform-tools-latest-linux.zip
通过掌握ADB指令,开发者可以大幅提升Android应用的调试、测试和部署效率。
七、C++代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>/*** 执行ADB命令并返回结果* @param command 要执行的ADB命令(不含"adb "前缀)* @param outputBuffer 用于存储命令输出的缓冲区* @param bufferSize 缓冲区大小* @return 成功返回0,失败返回-1*/
int executeAdbCommand(const char *command, char *outputBuffer, size_t bufferSize) {if (command == NULL || outputBuffer == NULL || bufferSize < 1) {errno = EINVAL;return -1;}// 构建完整的ADB命令char fullCommand[1024];_snprintf(fullCommand, sizeof(fullCommand), "adb %s", command);fullCommand[sizeof(fullCommand) - 1] = '\0'; // 确保字符串终止FILE *pPipe = _popen(fullCommand, "rt");if (pPipe == NULL) {fprintf(stderr, "Error: Failed to execute command (errno=%d)\n", errno);return -1;}// 初始化输出缓冲区outputBuffer[0] = '\0';// 读取命令输出char tempBuffer[256];while (fgets(tempBuffer, sizeof(tempBuffer), pPipe) != NULL) {size_t currentLen = strlen(outputBuffer);size_t lineLen = strlen(tempBuffer);// 检查是否有足够空间添加新行if (currentLen + lineLen + 1 >= bufferSize) {fprintf(stderr, "Warning: Output buffer is full, truncating output\n");break;}// 追加到输出缓冲区strncat(outputBuffer, tempBuffer, bufferSize - currentLen - 1);}// 关闭管道并获取退出码int exitCode = _pclose(pPipe);if (exitCode == -1) {fprintf(stderr, "Error: Failed to close pipe (errno=%d)\n", errno);return -1;}// 检查ADB命令是否成功执行(通常返回0表示成功)return (exitCode == 0) ? 0 : -1;
}int main(void)
{char output[2048];const char *adbCommands[] = {"devices","shell getprop ro.product.model","version","invalid-command" // 测试失败情况};for (int i = 0; i < sizeof(adbCommands) / sizeof(adbCommands[0]); i++) {printf("Executing: adb %s\n", adbCommands[i]);printf("----------------------start------------------\n");if (executeAdbCommand(adbCommands[i], output, sizeof(output)) == 0){printf("Output:\n%s\n", output);printf("==0\n");} else{printf("Failed to execute command\n");printf("==-1\n");}printf("==================end======================\n\n");}return 0;
}