Files
agent_admin/docs/02-architecture-and-code-map.md

84 lines
4.5 KiB
Markdown

# 架构与代码地图
## 分层原则
AgentAdmin 当前的 Android Agent 子项目将通用任务能力与 Android 实现分开:
```text
外部任务源
│
▼
TaskGateway → TaskSynchronizer → TaskParser → TaskInbox / SQLite
│
▼
AgentTask
│
▼
TaskExecutor → ActionDriver
│
▼
AutoAccessibilityService
```
- 核心模型不依赖外部服务或目标 App。
- 执行器只依赖 `ActionDriver`,不直接调用 Android 无障碍 API。
- 服务端差异由 `TaskGateway` 或等价适配器隔离。
- 目标 App 的页面识别和业务步骤应进入独立适配层,不写入通用协议与执行内核。
## 代码地图
所有 Kotlin 源码位于 `android/app/src/`。
| 路径 | 职责 | 主要类型 |
|---|---|---|
| `main/java/cn/auto/agent/core/model/` | 通用任务、步骤、选择器和结果模型 | `AgentTask`、`TaskStep`、`NodeSelector`、`ActionType`、`ResultCode` |
| `main/java/cn/auto/agent/core/protocol/` | JSON 协议解析与校验 | `TaskParser`、`TaskProtocolException` |
| `main/java/cn/auto/agent/core/scheduler/` | 获取、筛选并同步任务 | `TaskGateway`、`TaskSynchronizer`、`TaskSyncSummary` |
| `main/java/cn/auto/agent/core/persistence/` | 任务收件箱抽象与 SQLite 实现 | `TaskInbox`、`SqliteTaskInbox` |
| `main/java/cn/auto/agent/core/executor/` | 步骤执行、超时和进程内互斥 | `TaskExecutor`、`ActionDriver`、`TaskExecutionMutex` |
| `main/java/cn/auto/agent/core/accessibility/` | Android 无障碍驱动与 Activity 跟踪 | `AutoAccessibilityService`、`ActivityTracker` |
| `main/java/cn/auto/agent/app/` | UI、生命周期和依赖装配入口 | `MainActivity` |
| `main/res/` | 字符串、主题和无障碍服务配置 | `strings.xml`、`accessibility_service_config.xml` |
| `test/java/cn/auto/agent/` | JVM 单元测试 | 解析、同步、执行和超时测试 |
## 任务同步流程
1. `TaskGateway.fetchTaskPayloads()` 返回外部任务的原始 JSON 列表。
2. `TaskSynchronizer` 逐条调用 `TaskParser`。
3. 格式无效的任务计入无效数量,不写入数据库。
4. `assignedAgentName` 与本机设备名做区分大小写的精确比较。
5. 不属于本机的任务被忽略,不算本机执行失败。
6. 属于本机的有效任务交给 `TaskInbox.save()`。
7. `SqliteTaskInbox` 以 `task_id + revision` 作为幂等键保存。
同步只负责获取、校验、归属判断和入库,不代表任务已经领取或开始执行。
## 任务执行流程
1. 调用方将一个已解析的 `AgentTask` 交给 `TaskExecutor`。
2. 执行器依次处理步骤,并在每步操作前检查包名和已声明 Activity。
3. 需要控件的动作通过 `ActionDriver.find()` 查找节点。
4. 默认要求唯一匹配:零个匹配为未找到,多个匹配为歧义失败。
5. 执行器调用驱动完成点击、输入、返回或文本读取。
6. 每个步骤都有有限超时,最终返回类型化 `TaskExecutionResult`。
`AutoAccessibilityService` 是当前 Android 驱动实现。它负责把通用驱动调用转换为无障碍节点查询和操作,不应承担服务端协议或目标 App 业务编排。
## 应用入口
`MainActivity` 当前只展示无障碍服务状态并提供打开系统无障碍设置的入口。后台轮询、任务自动启动、结果 Outbox 和服务端提交尚未实现。
## 修改影响
| 需要修改的行为 | 首要代码位置 | 通常还需检查 |
|---|---|---|
| 新增动作 | `TaskModels.kt`、`TaskParser.kt`、`TaskExecutor.kt` | `ActionDriver`、无障碍实现、动作文档和测试 |
| 修改 JSON 字段或校验 | `TaskParser.kt`、模型 | 协议文档、解析测试、兼容性 |
| 修改设备任务筛选 | `TaskSynchronizer.kt` | 业务规则、同步测试 |
| 修改幂等或表结构 | `SqliteTaskInbox.kt` | 数据库版本、升级路径、持久化测试 |
| 接入外部服务 | 新的 `TaskGateway` 实现 | 配置、错误处理、调度测试;不污染核心模型 |
| 修改节点操作 | `AutoAccessibilityService.kt` | 执行器契约、真机验证 |
| 增加目标 App 流程 | 独立适配层 | 包名/Activity、页面状态、恢复策略和真机用例 |
更具体的操作步骤见 [常见改动指南](05-common-changes.md)。