夜雨聆风学习资料网

ARTICLE · 1128252

一部手机开发安卓 App:让写代码和看效果都舒服起来

一部手机开发安卓 App:让写代码和看效果都舒服起来

一部手机开发安卓 App:让写代码和看效果都舒服起来

一部安卓手机通过 SSH 开发,并通过 AScrcpy 与 Tailcat 验收远端模拟器

想只用一部安卓手机开发 App,最容易卡住我的环节,是“代码写完之后怎么看效果”。

SSH 登录服务器,让 Agent 改代码、构建、安装、跑测试,都可以在终端里完成。可当终端显示测试通过,我仍然想知道:页面有没有挤在一起?按钮好不好点?输入、弹窗和返回流程顺不顺?

这些问题,需要看到画面,也需要亲手操作。

我的场景很具体:手边只有一部安卓手机,用手机上的 SSH 客户端登录一台没有桌面图形环境的 Linux 服务器,在终端里做 Vibe Coding。 Android 模拟器也运行在那台服务器上。

所以,我想把开发和验收接成一条顺手的流程:服务器负责构建和测试,手机负责发指令、看画面、点操作。全程只用同一部手机,切换 SSH 和 AScrcpy 两个入口。

先把“舒服”这件事说清楚

对我而言,手机开发舒服不舒服,取决于日常需要折腾多少环境、来回搬多少信息。

这套方案把 Android SDK、项目文件、构建缓存和测试任务集中在服务器。手机通过 SSH 打开开发 Agent,用自然语言描述需求,查看改动和验证结果。

需要验收时,切到 AScrcpy,远端模拟器的画面就显示在手机上。我可以像操作手机 App 一样点击、滑动、输入,再切回 SSH,把具体问题反馈给 Agent。

想法、实现、自动测试、人工验收,都能从一部手机串起来。

这条路线尤其适合习惯终端、愿意让 Agent 承担大量编码工作的开发者。它的价值在于把重活放在服务器,把日常操作入口留在手上。

两个项目,各自补上哪一块

一部手机上的 SSH 与 AScrcpy 分别连接开发终端和模拟器画面的手绘架构图

手绘架构示意:上面始终是同一部手机,下面是没有桌面的 Linux 服务器;手机里的两个卡片表示切换应用。

nl2sh:在模拟器里准备配对与端口共享

nl2sh 是面向 Android 原生 shell 环境的 Agent 项目,可以通过自然语言和工具调用完成任务,并保留安全分类与确认步骤。

在这个场景里,我主要用它的 tailcat_adb_pair 工具:引导无线调试,读取当前配对信息,在批准后共享需要的端口,并把配对码返回到对话里。

它工作的位置是被控 Android 模拟器内部。Linux 服务器上的开发 Agent 负责项目开发;模拟器中的 nl2sh 负责这段配对与共享准备。

这样,我在手机的 SSH 会话里就能取得当前信息,再切到手机上的控制端完成配对。

AScrcpy:把远端模拟器变成手机上能看、能点的画面

AScrcpy 是运行在安卓手机上的 ADB 与 scrcpy 控制端。

通过 Tailcat 无线配对 入口,它可以使用共享地址、配对端口、连接端口和六位配对码,完成配对与 TLS ADB 连接,然后显示远端画面,把触摸和按键送回目标。

待验收的 App 仍然运行在服务器上的模拟器里。 手机上的 AScrcpy 提供查看和操作入口,方便我检查布局、交互和功能逻辑。

Tailcat:把两端的通信接起来

Tailcat 是这两个项目在此场景中使用的连接工具。

它转发无线调试的配对端口和连接端口,让手机里的 AScrcpy 能够连接远端模拟器。配对完成后,画面和控制通过 ADB 与 scrcpy 这条链路传递。

两条路线各有用途:SSH 用来开发,Tailcat 加 AScrcpy 用来看和操作模拟器。

实际使用时,我会这样走

从手机 SSH 开发到配对、查看画面和反馈修改的四步手绘流程

图中的手机表示同一设备的不同操作阶段,界面与配对信息均为示意。反馈由我切回 SSH 后发送给 Agent。

第一步,在手机 SSH 里让 Agent 开工

首次部署时,先把服务器上的 Android SDK、ADB、竖屏模拟器,以及模拟器内的 nl2sh 准备好(nl2sh提供一键安装+配合脚本,可以快速部署并配置好nl2sh到模拟器)。模拟器可以用无窗口模式运行,Linux 不需要显示桌面。

日常开发时,我在手机上 SSH 登录服务器,进入项目目录,打开开发 Agent。例如给它这样的任务:

实现这个页面。完成后构建并安装到模拟器,运行现有测试,检查空输入、加载失败和返回路径,并告诉我改了什么、验证了什么。

Agent 负责执行具体开发与测试任务,我在终端里查看结果、确认需要批准的操作。

这里可以换成自己习惯的终端开发 Agent;关键是让它具备项目构建、ADB 安装和测试所需的工具与权限。

第二步,让模拟器中的 nl2sh 准备共享

在服务器终端通过 ADB 进入模拟器的 shell,运行已部署的 nl2sh。这一步也在手机的 SSH 会话里完成。

启用 Tailcat 工具组后,让 nl2sh 调用 tailcat_adb_pair。流程分两段:

  1. 1. setup 引导进入无线调试配对界面,返回当前六位配对码、配对端口和连接端口。
  2. 2. share 在强确认后共享这些端口,返回完整 Tailcat 地址和当前配对信息。

开发者选项未开启、需要输入设备凭据,或设置界面不受支持时,要按提示完成首次准备。这个流程保留用户确认,使用它需要先部署和配置好环境。

手机端要填写四项:Tailcat 地址、配对端口、连接端口、六位配对码。 配对码会显示在 nl2sh 的对话中,便于在同一部手机上切换应用后填写。

第三步,切到 AScrcpy 配对并连接

在同一部安卓手机上打开 AScrcpy,选择 Tailcat 无线配对,填写刚才的四项信息,点击 配对并连接。

两个端口都填写工具返回的目标设备远端端口。手机端的随机回环端口由 AScrcpy 管理。

配对期间保持目标配对窗口打开。成功后,AScrcpy 清空配对码,建立连接,并在显示界面就绪后启动投屏。

目标仍然信任这部手机的身份时,后续可以使用当前地址和连接端口,点击 连接已配对设备。不必每次重新配对。

第四步,亲手验收,再回到 SSH 修改

现在,我可以在手机上检查 Agent 做出来的 App:文字和按钮的位置、页面跳转、输入与键盘遮挡、错误提示、返回和 Home 行为,都能实际看、实际点。

发现问题,就切回 SSH,把现象说具体:

点击提交后,加载提示挡住了底部按钮。请调整布局,重新构建安装,并补上对应的验证。

Agent 继续修改和测试,我再切回 AScrcpy 验收下一版。

自动测试给出一部分证据,人工操作补上视觉与交互感受。

这条链路已经验证到哪里

这次开发先使用两台 Android 15 模拟器,分别作为被控端和 AScrcpy 控制端,验证了 Tailcat 配对、TLS ADB 连接、隧道内 shell,以及 864×1920 的视频播放。

控制端发送 Home 按键后,目标切换到了启动器;停止投屏后,服务端进程正常退出。使用同一身份、不输入新的配对码,也成功重新连接并再次投屏。

在模拟器验证之外,我还使用一加 Ace 3 手机,实机验证了 AScrcpy 的无线配对流程。 因此,这条链路已经有了模拟器端的通信、投屏和控制验证,也有了真实安卓手机上的无线配对验证。

一部手机通过 SSH 开发、让 Agent 自动测试,再切换到 AScrcpy 查看效果的完整使用体验,仍需结合实际 SSH 客户端和网络环境检验。文中的图片均为手绘示意图。

想用得顺手,还要记住几件事

首次环境准备好以后,日常入口可以集中在手机上。使用中仍有几个边界:

  • • 无线调试需要 Android 11 及以上的目标系统;nl2sh 的配对引导需要 Android shell/root 身份。
  • • 地址和端口可能随 Tailcat、Wi-Fi 或无线调试重启而变化,重连要使用当前值。
  • • Tailcat 地址和配对码属于接入凭据,配对码会进入模型与对话;只提供给预期控制端,不放进公开文章或截图。
  • • 网络与中继性能会影响上传和画面延迟;AScrcpy 尚未用前台服务保证长时间后台会话,切换应用后的连接状态需要留意。
  • • 断开 AScrcpy 只停止控制端转发。结束共享要在目标端批准 tailcat_stop;关闭隧道也不会自动关闭无线调试或撤销已经配对的身份。

我最想保留的是这个节奏:在手机 SSH 里说清需求,让服务器上的 Agent 实现和测试,再在同一部手机上看到结果、亲手验收。

如果你也想只带一部安卓手机开发 App,习惯用终端和 Agent 做事,这套组合提供了一条值得尝试的路线:把构建与测试留给服务器,把开发入口和验收画面放到手机里。

项目入口

  • • [nl2sh] https://github.com/nl2sh/nl2sh
  • • [AScrcpy] https://github.com/Ernest-su/ascrcpy

安装或构建时,请确认所用版本包含 tailcat_adb_pair 工具与 Tailcat 无线配对 入口。本文介绍的是本次迭代后的联动流程,已发布版本的功能以对应版本文档为准。

相关学习资料