尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
DroidDeck ADB 远程控制实操:droiddeckctl 会话自动化完整上手
DroidDeck ADB 远程控制实操droiddeckctl 会话自动化完整上手【免费下载链接】DroidDeckDroidDeck brings the SteamOS experience to Android项目地址: https://gitcode.com/gh_mirrors/dr/DroidDeck如果你想在 Android 设备上对 DroidDeck 做自动化测试就不能靠点屏幕。它内置的 ADB 远程控制接口 Agent Control 配合 droiddeckctl 命令行工具让你从主机端拉起会话、轮询状态、拉回失败产物——这正是 DroidDeck 自动化脚本的底座。本文覆盖从安装 debug 构建、首次启动 Steam 会话到状态监控、多设备解析、CI 分支与失败取证的全流程。不碰屏幕启动会话装好 debug 构建验证 Agent Control 通道Agent Control 由两部分组成理解它们的分工能解释为什么启动命令必须走 CLIAgentBridgeProvider注册在content://com.droiddeck.launcher.agent的 ContentProvider提供state查询会话状态、stop停止会话、resume恢复挂起会话三类调用源码见 AgentBridgeProvider.kt。AgentStartActivity一个受保护的调试 Activity专职启动会话。因为后台 Provider 无法可靠地把会话屏幕拉到前台启动请求必须经由这个 Activity 完成见 AgentStartActivity.kt。两者都受 Android 的shell-onlyDUMP权限保护只有 ADB shell 可以调用普通应用碰不到这个面。整套接口也仅存在于 debug APK正式版完全不含因此不引入额外攻击面——这也是会话自动化第一步装 debug 构建的原因./gradlew assembleDebug --consoleplain adb install -r app/build/outputs/apk/debug/app-debug.apk如果要还原 CI 等价的全套资产含 ARM64 preload 库用DROIDDECK_BUILD_VARIANTdebug配合 tools/build_local.sh。装好后一条命令确认通道是否活着adb shell content call --uri content://com.droiddeck.launcher.agent --method state返回 JSON 即说明通道就绪可以开始用 droiddeckctl 了。完整说明在 docs/agent-control.md。一条命令启动 Steam 会话三种入口与 JSON 输出约定tools/droiddeckctl是一个 Python 脚本。每条命令执行前它先自动定位 adb依次尝试--adb参数、ADB环境变量、PATH、Android SDK 目录ANDROID_HOME/ANDROID_SDK_ROOT再解析出目标设备规则见下文多设备一节。所有命令把一个 JSON 对象写到 stdout、把解析出的设备序列号写到stderr——前者供脚本解析后者供日志互不污染。最小可运行流程只有三步tools/droiddeckctl start steam # 默认 Big Picture 模式 tools/droiddeckctl wait ready --timeout 90 # 阻塞直到会话进入 READY tools/droiddeckctl stop # 停止并等回 IDLEstart有三种入口入口命令说明Steamstart steam默认 Big Picture--ui desktop切桌面客户端--url steam://...传客户端 URL--wait启动时直接等READYLinux 桌面start desktop启动内置 Linux 桌面环境任意程序run /usr/bin/foo -- arg1 arg2在 Gamescope 下运行客端程序--之后整体作为参数注意run还要求先在设备上打开 Setup Diagnostics Debugging tools 开关否则会以调试工具未启用被拒绝退出码 7。监控会话状态10 个阶段、state 关键字段与 wait 的提前退出 会话是一个状态机。state子命令加--json显式声明机器可读用途返回schema 1的响应字段包括构建标签build、运行时版本runtime、会话id与阶段phase、模式mode、所请求程序program、挂起与首帧状态suspended/firstFrame、输出尺寸output、客端进程guestPid、失败详情failurecode message以及产物路径logDir/eventsFile。阶段枚举定义在 SessionState.kt阶段含义IDLE空闲无活动会话PREPARING会话准备中INSTALLING_RUNTIME安装 Linux 运行时STARTING_COMPOSITOR启动合成器STARTING_GUEST启动客端环境STARTING_STEAM启动 Steam 客户端READY会话就绪可交互SUSPENDED会话已挂起STOPPING正在停止FAILED会话失败响应附带失败代码与消息在脚本里手动轮询state是坏习惯——wait ready \| idle \| failed就是为会话状态监控设计的它按固定间隔轮询直到目标阶段--timeout控制最长等待默认 90 秒。关键细节是等待过程中会话一旦进入FAILED立即抛出失败详情而不是等到超时这让 CI 能区分会话真失败了和只是没来得及 READY。设备休眠导致会话挂起时用resume恢复即可。多设备并存目标设备解析规则与传输选择同时接了多台设备或 USB 无线 ADB 并存时droiddeckctl 不会猜。解析逻辑在 tools/adb_device.pytools/deploy_local.sh复用同一模块构建脚本与 CLI 行为因此始终一致显式优先设置了--serial放在子命令之前、ADB_SERIAL或ANDROID_SERIAL时直接采用并校验其为已授权设备按硬件序列号归组否则枚举所有device状态设备按ro.serialno/ro.boot.serialno归组去重——同一台设备的 USB 与网络传输被折叠成一个拒绝猜测归组后仍有多台独立设备直接报错并要求显式指定序列号传输择优同一设备存在多个传输时优先稳定的 mDNS 传输其次选无临时端口的网络地址。如何区分 FAILED 与超时按退出码在 CI 脚本里分支droiddeckctl 的退出码为脚本分支而设计定义见 tools/droiddeckctl 末尾退出码含义典型场景0成功命令完成2命令无效或被拒绝参数错误、未知命令3ADB / 设备错误找不到 adb、设备未授权、解析失败4会话错误会话已激活、客端启动失败、Activity 启动失败5超时等待阶段或产物收集超时6产物或文件错误无日志目录、拉取失败、截图失败7调试工具未启用设备上 Diagnostics 开关未打开失败时 stdout 同样输出结构化 JSON脚本可以按code字段做精细处理{ok: false, error: {code: TIMEOUT, message: Timed out waiting for READY; phase STARTING_STEAM, ...}}一个典型的 CI 分支写法tools/droiddeckctl wait ready --timeout 120 case $? in 0) ;; # 已 READY继续后续步骤 4) tools/droiddeckctl logs latest ./artifacts ;; # 会话失败直接拉产物取证 5) tools/droiddeckctl state --json ;; # 超时抓当前 phase定位卡在哪一步 esac退出码 4 与 5 的区分正来自wait的提前退出机制会话自己失败走 4只是慢走 5。失败取证stop 收集产物events.jsonl 复盘全过程stop不只是停会话它等待阶段回到IDLE后还会继续等产物收集完成--artifact-timeout控制上限。每次会话都会在产物目录里额外写入events.jsonl事件流拉回本地后可以逐条复盘会话的完整生命周期tools/droiddeckctl logs latest ./session-artifacts # adb pull 最近一次会话的完整产物目录 tools/droiddeckctl screenshot ./screen.png # screencap -p 抓设备截图存为 PNGlogs latest内部会先检查artifactsAvailable/artifactsComplete会话刚停、产物还在写入时会先等齐再拉若没有可用产物目录则按退出码 6 报错。把启动、状态监控、退出码分支与产物取证串起来DroidDeck 的 CI 集成就形成了闭环。【免费下载链接】DroidDeckDroidDeck brings the SteamOS experience to Android项目地址: https://gitcode.com/gh_mirrors/dr/DroidDeck创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

iOS 输入框键盘遮挡的 8 类问题逐条排查(附源码行号)

iOS 输入框键盘遮挡的 8 类问题逐条排查(附源码行号)

iOS 输入框键盘遮挡的 8 类问题逐条排查(附源码行号) 【免费下载链接】IQKeyboardManager Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code no…

📅 2026/11/1 1:30:43
Shelley的@文件补全功能详解:模糊搜索+Git内容搜索如何快速引用项目文件(完整指南)

Shelley的@文件补全功能详解:模糊搜索+Git内容搜索如何快速引用项目文件(完整指南)

【免费下载链接】shelley Shelley is a coding agent 项目地址: https://gitcode.com/gh_mirrors/shell/shelley 点击查看 免费下载 什么是 Shelley 的 文件补全 Shelley 是一个 web 端、移动端友好的编码 Agent(coding agent)&#xff0c…

📅 2026/11/1 1:30:43
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?

Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?

在将 Highcharts 集成到 React 或 Vue 项目中时,遵循一些最佳实践可以帮助您更高效地使用 TypeScript。以下是一些建议:React 项目中的最佳实践安装依赖: 确保安装 Highcharts 和类型声明:npm install highcharts使用 TypeScript&…

📅 2026/11/1 1:30:43
MORE NEWS

更多资讯

📰

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

📰

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

📰

先能用,再好用:从烂尾复盘到两周上线,全栈项目的‘原型—快速迭代‘方法论

先能用,再好用:从烂尾复盘到两周上线,全栈项目的“原型—快速迭代”方法论 全栈学习路径的文章已经很多了:怎么选技术栈、怎么搭环境、怎么记文档,几乎每个方向都有人写。但一个更扎心的问题很少有人正面讨论——为什…

📰

深度思考模式把 ARC-AGI-2 从 17.6% 拉到 45.1%:对照 Gemini 3 Pro 的三份能力评测,看‘会思考‘改写了哪些边界

深度思考模式把 ARC-AGI-2 从 17.6% 拉到 45.1%:对照 Gemini 3 Pro 的三份能力评测,看“会思考”改写了哪些边界 一、先说结论:变强的不是“知识”,而是“解法” 每次新模型发布,评测榜单都会涨几个点,大…

📰

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

📰

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬