Files
aiagent/ADB工具和Android日志Agent搭建总结.md
2026-03-06 22:31:41 +08:00

571 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADB工具和Android日志Agent搭建总结
## ✅ 完成状态
**任务**: 创建ADB工具和Android日志获取Agent
**状态**: ✅ 已完成
**完成时间**: 2026-01-23
---
## 📋 实现内容
### 1. ADB日志工具adb_log
**文件位置**: `backend/app/services/builtin_tools.py`
**功能描述**:
- 通过ADB命令获取Android设备日志
- 支持多种ADB命令类型
- 支持日志过滤和级别控制
- 支持超时和行数限制
**支持的命令类型**:
1. **logcat** - 获取日志
- 获取Android设备的logcat日志
- 支持按标签过滤(如 `ActivityManager``SystemServer`
- 支持按级别过滤V/D/I/W/E/F/S
- 支持限制返回行数
2. **devices** - 列出设备
- 列出所有连接的Android设备
- 显示设备详细信息
3. **shell** - 执行shell命令受限
- 只允许执行安全命令
- 支持的命令:`getprop``dumpsys``pm``am``settings`
- 不允许执行危险命令(如 `rm``reboot` 等)
**工具参数**:
```python
async def adb_log_tool(
command: str = "logcat", # 命令类型logcat/devices/shell
filter_tag: Optional[str] = None, # 日志标签过滤或shell命令
level: Optional[str] = None, # 日志级别V/D/I/W/E/F/S
max_lines: int = 100, # 最大返回行数1-10000
timeout: int = 10 # 超时时间1-60
) -> str
```
**工具Schema**:
```json
{
"type": "function",
"function": {
"name": "adb_log",
"description": "执行ADB命令获取Android设备日志。支持logcat获取日志、devices列出设备、shell执行shell命令。可以过滤日志标签和级别。",
"parameters": {
"type": "object",
"properties": {
"command": {
"type": "string",
"enum": ["logcat", "devices", "shell"],
"description": "ADB命令类型",
"default": "logcat"
},
"filter_tag": {
"type": "string",
"description": "日志标签过滤或shell命令"
},
"level": {
"type": "string",
"enum": ["V", "D", "I", "W", "E", "F", "S"],
"description": "日志级别过滤"
},
"max_lines": {
"type": "integer",
"description": "最大返回行数",
"default": 100
},
"timeout": {
"type": "integer",
"description": "命令执行超时时间(秒)",
"default": 10
}
}
}
}
}
```
**返回格式**:
```json
{
"success": true,
"command": "adb logcat -d -t 100",
"return_code": 0,
"output": "日志内容...",
"output_lines": 100,
"error": null,
"timestamp": "2026-01-23T11:00:00"
}
```
**安全特性**:
- ✅ 超时控制(防止长时间执行)
- ✅ 行数限制(防止输出过长)
- ✅ Shell命令白名单只允许安全命令
- ✅ 错误处理和日志记录
---
### 2. 工具注册 ✅
**文件位置**: `backend/app/main.py`
**注册代码**:
```python
from app.services.builtin_tools import (
adb_log_tool,
ADB_LOG_SCHEMA
)
tool_registry.register_builtin_tool("adb_log", adb_log_tool, ADB_LOG_SCHEMA)
```
**注册状态**: ✅ 已注册共10个内置工具
---
### 3. Android日志获取助手Agent ✅
**文件位置**: `backend/scripts/generate_android_log_agent.py`
**Agent信息**:
- **Agent ID**: `b68e96d2-da66-4402-86a5-9fae6b5ac092`
- **Agent名称**: `Android日志获取助手`
- **工作流ID**: `4df28591-7d47-403e-b7dc-9fc298b79527`
- **描述**: 通过ADB命令获取和分析Android设备日志的智能助手。支持获取logcat日志、列出设备、执行shell命令等功能。
**工作流结构**:
```
开始 → 意图识别 → JSON解析 → LLM工具调用 → 结束
```
**节点详情**:
1. **开始节点** (`start`)
- 接收用户输入
- 输入格式: `{"query": "用户请求"}`
2. **意图识别节点** (`intent-recognize`)
- 类型: LLM节点
- 模型: deepseek-chat
- 功能: 分析用户请求提取ADB命令参数
- 输出格式: JSON
```json
{
"command": "logcat|devices|shell",
"filter_tag": "标签或shell命令可选",
"level": "V|D|I|W|E|F|S可选",
"max_lines": 100
}
```
3. **JSON解析节点** (`json-parse`)
- 类型: JSON节点
- 功能: 解析意图识别的结果
- 操作: parse
4. **LLM工具调用节点** (`llm-with-tools`)
- 类型: LLM节点启用工具调用
- 模型: deepseek-chat
- 启用工具: `adb_log`
- 功能: 根据解析的参数调用adb_log工具分析日志内容
5. **结束节点** (`end`)
- 返回最终结果
**工作流配置**:
```json
{
"nodes": [
{
"id": "start",
"type": "start",
"position": {"x": 100, "y": 200},
"data": {"label": "开始"}
},
{
"id": "intent-recognize",
"type": "llm",
"position": {"x": 400, "y": 200},
"data": {
"label": "意图识别",
"provider": "deepseek",
"model": "deepseek-chat",
"temperature": 0.3,
"max_tokens": 200,
"prompt": "分析用户请求提取ADB命令参数..."
}
},
{
"id": "json-parse",
"type": "json",
"position": {"x": 700, "y": 200},
"data": {
"label": "解析参数",
"operation": "parse",
"json_path": "$"
}
},
{
"id": "llm-with-tools",
"type": "llm",
"position": {"x": 1000, "y": 200},
"data": {
"label": "执行ADB命令",
"provider": "deepseek",
"model": "deepseek-chat",
"temperature": 0.7,
"max_tokens": 2000,
"enable_tools": true,
"selected_tools": ["adb_log"],
"prompt": "根据解析的参数使用adb_log工具获取Android设备日志..."
}
},
{
"id": "end",
"type": "end",
"position": {"x": 1300, "y": 200},
"data": {"label": "结束"}
}
],
"edges": [
{
"id": "e1",
"source": "start",
"target": "intent-recognize"
},
{
"id": "e2",
"source": "intent-recognize",
"target": "json-parse"
},
{
"id": "e3",
"source": "json-parse",
"target": "llm-with-tools"
},
{
"id": "e4",
"source": "llm-with-tools",
"target": "end"
}
]
}
```
---
## 🎯 使用说明
### 1. 环境要求
**ADB环境**:
- 需要安装 Android SDK Platform Tools
- 需要将 `adb` 命令添加到 PATH
- 需要连接 Android 设备或启动模拟器
**验证ADB环境**:
```bash
adb version
adb devices
```
### 2. 测试Agent
**使用测试工具**:
```bash
# 获取最近的错误日志
python3 test_workflow_tool.py -a "Android日志获取助手" -i '{"query": "获取最近的错误日志"}'
# 列出所有连接的设备
python3 test_workflow_tool.py -a "Android日志获取助手" -i '{"query": "列出所有连接的设备"}'
# 获取ActivityManager的日志
python3 test_workflow_tool.py -a "Android日志获取助手" -i '{"query": "获取ActivityManager的日志"}'
# 获取特定级别的日志
python3 test_workflow_tool.py -a "Android日志获取助手" -i '{"query": "获取错误级别的日志"}'
```
**通过API调用**:
```bash
curl -X POST http://localhost:8037/api/v1/agents/execute \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"agent_id": "b68e96d2-da66-4402-86a5-9fae6b5ac092",
"input_data": {
"query": "获取最近的错误日志"
}
}'
```
### 3. 在前端使用
1. 打开 Agent 管理页面
2. 找到 "Android日志获取助手"
3. 点击"测试"或"执行"
4. 输入查询请求,例如:
- "获取最近的错误日志"
- "列出所有连接的设备"
- "获取ActivityManager的日志"
---
## 📊 功能特点
### 1. 智能意图识别
- 自动分析用户请求
- 提取ADB命令参数
- 支持自然语言输入
### 2. 灵活的日志过滤
- 按标签过滤(如 `ActivityManager`、`SystemServer`
- 按级别过滤V/D/I/W/E/F/S
- 可限制返回行数
### 3. 安全控制
- Shell命令白名单
- 超时控制
- 行数限制
- 错误处理
### 4. 智能分析
- 自动分析日志内容
- 提取关键信息
- 生成总结报告
---
## 🔧 技术实现
### 1. 工具实现
**核心技术**:
- `subprocess` - 执行系统命令
- `asyncio` - 异步执行和超时控制
- `json` - 结果格式化
**关键代码**:
```python
async def adb_log_tool(
command: str = "logcat",
filter_tag: Optional[str] = None,
level: Optional[str] = None,
max_lines: int = 100,
timeout: int = 10
) -> str:
# 构建adb命令
if command == "logcat":
adb_cmd = ["adb", "logcat", "-d"]
if level:
adb_cmd.extend([f"*:{level}"])
if filter_tag:
adb_cmd.append(filter_tag)
adb_cmd.extend(["-t", str(max_lines)])
# ...
# 异步执行命令
result = await asyncio.wait_for(
asyncio.to_thread(_execute_adb),
timeout=timeout + 2
)
# 返回JSON格式结果
return json.dumps({...}, ensure_ascii=False)
```
### 2. Agent工作流
**工作流设计**:
- 使用LLM进行意图识别
- 使用JSON节点解析参数
- 使用LLM工具调用执行ADB命令
- 自动分析和总结结果
**数据流**:
```
用户输入 → 意图识别 → JSON解析 → 工具调用 → 结果分析 → 输出
```
---
## 📝 使用示例
### 示例1: 获取错误日志
**输入**:
```json
{
"query": "获取最近的错误日志"
}
```
**处理流程**:
1. 意图识别: 提取 `command=logcat`, `level=E`
2. JSON解析: 解析参数
3. 工具调用: `adb_log(command="logcat", level="E", max_lines=100)`
4. 结果分析: 分析错误日志,提取关键信息
**输出**:
```
已获取最近的错误日志共发现3个错误
1. [2026-01-23 10:30:15] ActivityManager: 应用崩溃
- 包名: com.example.app
- 错误类型: NullPointerException
2. [2026-01-23 10:31:20] SystemServer: 服务启动失败
- 服务名: MediaService
- 错误原因: 权限不足
3. [2026-01-23 10:32:05] NetworkManager: 网络连接失败
- 错误类型: ConnectionTimeout
- 建议: 检查网络配置
```
### 示例2: 列出设备
**输入**:
```json
{
"query": "列出所有连接的设备"
}
```
**处理流程**:
1. 意图识别: 提取 `command=devices`
2. JSON解析: 解析参数
3. 工具调用: `adb_log(command="devices")`
4. 结果分析: 格式化设备列表
**输出**:
```
已找到2个连接的设备
1. emulator-5554
- 状态: device
- 型号: Android SDK built for x86
2. 192.168.1.100:5555
- 状态: device
- 型号: SM-G991B
```
### 示例3: 获取特定标签日志
**输入**:
```json
{
"query": "获取ActivityManager的日志"
}
```
**处理流程**:
1. 意图识别: 提取 `command=logcat`, `filter_tag=ActivityManager`
2. JSON解析: 解析参数
3. 工具调用: `adb_log(command="logcat", filter_tag="ActivityManager", max_lines=100)`
4. 结果分析: 分析ActivityManager日志
**输出**:
```
已获取ActivityManager日志共100行
关键活动:
- 应用启动: com.example.app (10:30:15)
- Activity切换: MainActivity → SettingsActivity (10:31:20)
- 应用关闭: com.example.app (10:32:05)
性能指标:
- 平均启动时间: 1.2秒
- Activity切换次数: 15次
```
---
## ⚠️ 注意事项
### 1. ADB环境要求
- ✅ 必须安装 Android SDK Platform Tools
- ✅ 必须将 `adb` 命令添加到 PATH
- ✅ 必须连接 Android 设备或启动模拟器
### 2. 安全限制
- ✅ Shell命令只允许执行安全命令
- ✅ 不允许执行危险命令(如 `rm`、`reboot` 等)
- ✅ 超时控制防止长时间执行
- ✅ 行数限制防止输出过长
### 3. 性能优化
- ✅ 默认限制返回100行日志
- ✅ 支持超时控制默认10秒
- ✅ 异步执行避免阻塞
### 4. 错误处理
- ✅ 处理ADB命令执行失败
- ✅ 处理设备未连接情况
- ✅ 处理超时情况
- ✅ 详细的错误信息返回
---
## 🚀 扩展建议
### 1. 功能扩展
- [ ] 支持实时日志监控logcat -c
- [ ] 支持日志保存到文件
- [ ] 支持日志搜索和过滤
- [ ] 支持多设备管理
- [ ] 支持日志分析和统计
### 2. 安全增强
- [ ] 添加用户权限控制
- [ ] 添加命令执行审计
- [ ] 添加设备访问控制
- [ ] 添加日志访问记录
### 3. 性能优化
- [ ] 支持日志缓存
- [ ] 支持增量获取
- [ ] 支持并行处理
- [ ] 支持结果压缩
---
## 📊 统计信息
- **工具数量**: 1个adb_log
- **Agent数量**: 1个Android日志获取助手
- **工作流节点数**: 5个
- **代码行数**: 约200行工具实现+ 约150行Agent脚本
- **完成时间**: 2026-01-23
---
## 🎉 总结
本次实现了完整的ADB工具和Android日志获取Agent包括
1.**ADB日志工具** - 功能完整、安全可靠
2.**工具注册** - 已集成到工具注册表
3.**Agent工作流** - 智能意图识别和工具调用
4.**文档完善** - 使用说明和示例齐全
Agent已经可以正常使用支持通过自然语言请求获取Android设备日志并自动分析和总结结果。
---
**最后更新**: 2026-01-23
**文档版本**: v1.0
**状态**: 已完成 ✅