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

想只用一部安卓手机开发 App,最容易卡住我的环节,是“代码写完之后怎么看效果”。
SSH 登录服务器,让 Agent 改代码、构建、安装、跑测试,都可以在终端里完成。可当终端显示测试通过,我仍然想知道:页面有没有挤在一起?按钮好不好点?输入、弹窗和返回流程顺不顺?
这些问题,需要看到画面,也需要亲手操作。
我的场景很具体:手边只有一部安卓手机,用手机上的 SSH 客户端登录一台没有桌面图形环境的 Linux 服务器,在终端里做 Vibe Coding。 Android 模拟器也运行在那台服务器上。
所以,我想把开发和验收接成一条顺手的流程:服务器负责构建和测试,手机负责发指令、看画面、点操作。全程只用同一部手机,切换 SSH 和 AScrcpy 两个入口。
先把“舒服”这件事说清楚
对我而言,手机开发舒服不舒服,取决于日常需要折腾多少环境、来回搬多少信息。
这套方案把 Android SDK、项目文件、构建缓存和测试任务集中在服务器。手机通过 SSH 打开开发 Agent,用自然语言描述需求,查看改动和验证结果。
需要验收时,切到 AScrcpy,远端模拟器的画面就显示在手机上。我可以像操作手机 App 一样点击、滑动、输入,再切回 SSH,把具体问题反馈给 Agent。
想法、实现、自动测试、人工验收,都能从一部手机串起来。
这条路线尤其适合习惯终端、愿意让 Agent 承担大量编码工作的开发者。它的价值在于把重活放在服务器,把日常操作入口留在手上。
两个项目,各自补上哪一块

手绘架构示意:上面始终是同一部手机,下面是没有桌面的 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 后发送给 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. setup引导进入无线调试配对界面,返回当前六位配对码、配对端口和连接端口。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 无线配对 入口。本文介绍的是本次迭代后的联动流程,已发布版本的功能以对应版本文档为准。