mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-16 01:40:46 +08:00
## 概述 - 在 `AdbController::connect` 确定目标 address/serial 后,通过 `PlatformIO::set_adb_serial` 显式声明当前 adb 设备。 - NativeIO 默认忽略该调用;AdbLiteIO 使用该 serial 初始化或切换内部 adb-lite client。 - adb-lite 的 `shell`、`exec-out`、`push` 和交互式 shell 只使用已声明的 client,不再从命令路径里隐式初始化 client。 - AdbLiteIO 内部集中校验 client/serial,并用 mutex 覆盖 `m_adb_client` / `m_adb_serial` 以及对 adb-lite client 的调用,避免 `call_command` 与 `interactive_shell` 并发访问同一状态。 ## 背景 #16850 已修复 `adb connect` 被跳过后 adb-lite client 未初始化的问题,并补充了内部锁保护。这个 PR 是后续调整:把 client 初始化入口从命令执行路径挪到连接生命周期中,让状态声明更明确。 ## 修复方式 连接阶段已经知道当前 address/serial,所以在设置 connect/release 命令后调用: ```cpp m_platform_io->set_adb_serial(address); ``` 对 NativeIO 来说这是 no-op;对 AdbLiteIO 来说,这是初始化或切换 `adb::client` 的入口。 后续 adb-lite 命令路径通过 `lock_adb_client(serial)` 统一校验命令中的 `-s <serial>` 与当前 client 对应的 serial 一致,并在同一把锁仍然持有时调用 adb-lite client。这样避免在 `interactive_shell` 中隐式写入 client/serial 状态,也避免把 `m_adb_client` 暴露给无锁调用。 `set_adb_serial` 也改为先创建临时 `adb::client`,创建成功后再提交 `m_adb_serial` / `m_adb_client` 状态;如果创建失败则记录错误并清空 adb-lite client 状态,避免 serial 已切换但 client 仍指向旧对象的不一致状态。 ## 验证 - `git diff --check --cached` - `cmake --build /private/tmp/maa-build-8599-core --parallel 8` - `cmake --install /private/tmp/maa-build-8599-core --config RelWithDebInfo` - 本机 `maa` CLI + Android 35 arm64 AVD: - `maa run connect-only -p adb-lite-test --no-summary -vvv` - 日志显示 `Loading MaaCore from: /private/tmp/maa-test-data-8599/lib` - 日志显示 `Setting adb lite enabled to true` - 日志到达 `Connected` - 日志到达 `FastestWayToScreencap Encode` - 未出现 `adb client not initialized` - 未出现 `failed to create adb-lite client` - 未出现 `fallback to NativeIO`