Android 自动化软件 #
Android 自动化 / 容器 #
| 软件 | 作用 |
|---|---|
ReDroid (redroid/redroid) | Docker 容器中的 Android 操作系统 |
| Waydroid | 通过 LXC 和 Wayland 在 Linux 桌面上运行 Android |
| Anbox | 最初的 Android 容器化概念验证项目;Waydroid 和 ReDroid 的祖先 |
Waydroid 与 ReDroid #
Waydroid 和 ReDroid 使用相同的底层理念:不运行完整虚拟机,而是在主机 Linux 内核上运行 Android 用户空间。Android 本身基于 Linux,但高度依赖 Binder IPC 和共享内存等 Android 专用内核功能。因此,两者都要求主机支持binder_linux以及共享内存,例如ashmem_linux或更新的基于memfd的替代方案。
两者的主要区别在于目标环境。Waydroid面向希望在Wayland会话中将Android应用显示为类似原生窗口的Linux桌面用户。ReDroid面向服务器、CI、自动化和云手机场景,在这些场景中,Android以Docker容器形式运行,并通过ADB、scrcpy、自动化工具或插桩进行远程控制。
| 领域 | Waydroid | ReDroid |
|---|---|---|
| 主要目标 | Linux 桌面 | 服务器、CI、自动化、云手机 |
| 容器运行时 | LXC | Docker / OCI 容器 |
| 显示模型 | 与主机 Wayland 合成器集成 | 默认无头;通过 ADB/scrcpy 或浏览器封装器查看 |
| 主机依赖 | 需要 Waydroid 软件包、LXC 和 Wayland 会话集成 | 需要 Docker 和 Android 内核模块 |
| 部署方式 | 通过软件包管理器进行系统级安装 | 可复现的docker run / docker-compose.yml工作流 |
| 拆除方式 | 卸载软件包并清理残留的主机配置 | 删除容器和卷 |
| 适用场景 | 在 Linux 桌面上运行 Android 应用 | 为自动化、爬取、捕获运行 Android 应用 |
对于此用例,LXC并没有比Docker更高的实际效率。两者都是对同一组Linux内核原语的接口:命名空间、cgroups、挂载、网络和设备访问。Docker早期在内部使用LXC,后来迁移到libcontainer/runc。Android容器的性能瓶颈通常来自Binder IPC、图形/显示合成、GPU直通,以及渲染是否使用硬件加速,而不是LXC与Docker之间的差异。
Waydroid可能选择LXC,是因为LXC更适合桌面集成,尤其是将主机Wayland套接字绑定挂载并暴露给Android容器。ReDroid选择Docker,则是因为Docker更适合部署、可复现性、编排和无头自动化。
对于自动化或爬虫系统,ReDroid通常更容易部署。可以使用Docker镜像和compose文件描述运行时,在端口5555上暴露ADB,将/data持久化,并连接scrcpy、uiautomator2、Frida或mitmproxy等工具。主机层面的必要条件仍然是内核支持Android的Binder和共享内存:
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux某些Linux内核默认不提供这些模块,因此主机可能需要额外的内核模块或不同的内核软件包。即使存在这一限制,ReDroid通常仍比安装Waydroid侵入性更低,因为它不需要桌面Wayland会话或系统级Android桌面集成栈。
ReDroid的隐蔽性 #
默认情况下,ReDroid并不能躲避Android应用的环境检测。ReDroid是容器化的AOSP环境,因此除非进行定制,许多标识符都会呈现为通用值。对于基础检测,应用可能会检查Android构建属性、可用硬件功能、传感器、电话状态、电池行为、已安装服务和运行时痕迹。
常见的检测面包括:
| 检测面 | 突出原因 |
|---|---|
| 构建属性 | 默认的AOSP/ReDroid值可能看起来像通用环境,而不像真实设备 |
| 硬件功能 | 传感器、摄像头、电话功能、电池、Bluetooth和GPS可能缺失或被简化 |
| CPU/原生架构 | 在x86_64主机上运行ARM应用需要转换,这可能留下指纹 |
| Google Play Services | ReDroid通常是纯AOSP,默认不包含GMS |
| 运行时工具 | 对于主动扫描进程表、端口、内存映射或已加载库的应用,Frida等插桩工具可能可见 |
| 图形/显示路径 | 容器化渲染和虚拟显示行为可能不同于实体手机 |
简单检查通常基于静态属性,因此更容易通过。中等强度的检测SDK会结合构建属性、软件包清单、缺失的硬件、root状态、Play Services状态和原生环境检查。激进的应用可能使用专有的反滥用或反作弊系统,将多个信号与服务器端信誉评分结合起来。
对于类似微信的应用,现实评估如下:
| 检测级别 | ReDroid前景 |
|---|---|
| 简单的模拟器检查 | 使用更真实的环境配置后,通常可以应对 |
| 常见商业SDK检查 | 可行,但需要谨慎保持设备、服务和运行时的一致性 |
| 激进的应用专用反滥用 | 困难且不稳定;可能演变为持续的攻防竞赛 |
对于自动化或爬取,实际做法通常不是让ReDroid与手机完全无法区分,而是确保应用能够安装、登录并稳定运行;将/data持久化为Docker卷;并尽量减少不必要的插桩。一个已使用过且稳定的账户,以及持久化的Android数据目录,往往比追踪每一种模拟器指纹信号更加重要。
如果目标是捕获流量或状态,而不是创建账户或规避反滥用机制,更安全的架构是运行普通ReDroid实例,在需要时手动交互,持久化会话,并且仅在授权调试或研究确有需要时添加Frida或mitmproxy等工具。
屏幕流式传输/远程显示 #
| 软件 | 作用 |
|---|---|
scrcpy (Genymobile/scrcpy) | 通过 ADB 流式传输 Android 屏幕 |
| ws-scrcpy | 围绕 scrcpy 的浏览器/WebRTC 封装器 |
| TigerVNC | 之前的 Playwright 容器设计使用的 VNC 服务器 |
| DroidVNC-NG | Android 的 VNC 服务器应用 |
| openbox | 之前的 Playwright 容器设计使用的最小 X11 窗口管理器 |
VNC为何不是Android上的常用方案 #
Android上存在VNC,但使用不便,也不常见。通常对应Android的方案是scrcpy,它通过ADB使用Android自身的视频编码路径传输Android屏幕。实际上,当人们希望以类似VNC的方式查看和控制Android设备时,通常会使用scrcpy。
核心区别在于传输的内容:
| 领域 | VNC | scrcpy |
|---|---|---|
| 流类型 | 帧缓冲/截图式像素流 | 编码后的H.264/H.265视频流 |
| 传输 | VNC TCP协议 | USB或TCP上的ADB |
| 服务器要求 | Android上需要VNC服务器应用或root级帧缓冲访问权限 | 不需要Android端应用;使用ADB |
| 输入 | 通过VNC服务器转换鼠标/键盘 | 通过ADB发送触摸/键盘事件 |
| 延迟 | 通常更高 | 通常较低 |
| 自动化适配性 | 独立的远程桌面层 | 自然适用于ADB自动化 |
Android不像Linux桌面那样提供常规桌面帧缓冲。现代Android应用通过SurfaceFlinger、硬件合成、安全表面和应用沙箱进行渲染。VNC服务器要么必须使用受限的MediaProjection屏幕捕获API,要么依赖root级访问权限来捕获底层显示缓冲区。
因此会产生以下实际问题:
| 问题 | 影响 |
|---|---|
| 安全表面可能被显示为黑色 | 应用可以设置FLAG_SECURE,导致登录屏幕、二维码或敏感视图在捕获API中显示为黑色 |
| 输入转换存在信息损失 | VNC鼠标事件不是Android的原生控制模型;Android需要触摸、手势、IME输入和无障碍事件 |
| 需要额外应用/进程 | 必须在Android内部安装并持续运行VNC服务器 |
| 延迟和带宽表现更差 | VNC没有针对Android原生显示管线进行优化 |
| 不适合容器 | ReDroid已经暴露ADB,因此scrcpy更简单、更可靠 |
Android存在DroidVNC-NG等VNC服务器应用,Termux也可以通过VNC暴露Linux桌面,但这些属于小众场景。它们不是控制Android本身的常规方式。对于ReDroid或自动化用途,scrcpy加ADB是标准的远程显示路径。如果需要浏览器访问,应使用ws-scrcpy等scrcpy封装器,而不是增加VNC。
插桩/流量捕获 #
| 软件 | 作用 |
|---|---|
| Frida | 运行时Hook和动态插桩 |
| objection | 基于Frida的CLI,用于常见移动应用Hook,例如SSL固定解除和root绕过 |
| mitmproxy | HTTP/S拦截代理 |
| Charles Proxy | mitmproxy的HTTP/S拦截代理替代方案 |
| apk-mitm | 用于禁用SSL固定的APK补丁工具 |
Android自动化/UI #
| 软件 | 作用 |
|---|---|
| uiautomator2 | 基于Python的Android UI自动化 |
| airtest | Android UI自动化框架 |
FlowBot (xlrpa/FlowBot) | 通过Android无障碍API进行微信/Android自动化 |
| ADB | 用于主机控制Android的Android Debug Bridge |
微信专用 #
| 软件 | 作用 |
|---|---|
| WeChatFerry | 支持Python/Node SDK的PC版微信DLL Hook |
| WTAPI | 第三方iPad协议微信API/SaaS |
浏览器自动化 #
| 软件 | 作用 |
|---|---|
| Playwright | 浏览器自动化框架 |
| Chromium | 由Playwright驱动的浏览器 |
| tini | 容器的init进程 |
容器/系统 #
| 软件 | 作用 |
|---|---|
| Docker | 容器运行时 |
| LXC | Waydroid使用的容器运行时 |
| Magisk | Android root管理和root隐藏工具 |
| binder_linux | 用于Android Binder IPC的Linux内核模块 |
| ashmem_linux | 用于Android共享内存的Linux内核模块 |
评论
在 GitHub 上阅读或评论(发表评论需要登录)