云手机

in 前端 with 0 comment

背景
目前移动爬虫现有架构运行了大半年了,发现爬虫设备在长时间维护的时候会有很多问题:

移动设备太多、用途不一,管理容易乱,IT审计设备时经常出现丢失的情况。
一直插电导致移动设备的电池容易鼓包,有安全风险,而且使用寿命也较短,经常需要更换。
办公环境经常出现断网检修、断电检修、安全检查等事情,导致服务可用性很低。
设备申请和扩量比较困难,审批、采购、部署、拽线、移动设备初始化、主机申请、主机设备初始化等都很费劲。
账号管理和充值很麻烦,sim卡分散到很多手机里,很容易弄乱,续费管理、短信管理都很难做,基本上账号都当成了一次性使用的消耗品。
受设备厂商的限制,root很麻烦,很多高权限操作受限制。而且设备号无法修改,一旦设备被风控了,基本也无法补救。
目的
脱实入虚,摆脱办公硬件对系统扩量的限制,使移动爬虫真正做到云部署、云管控。

云手机方案
基于Windows下安卓虚拟机的方案
业界也有一些基于AOVB(Android-x86 on VirtualBox) 技术在 x86 机器上跑基于 AOSP (Android Open Source Project)的安卓ROM的虚拟机的方案,但是实际检测发现开源的安卓虚拟机的优化做的都不太好,对很多有 arm 原生 so 的app的兼容性也很差。如果要基于这些自己做优化,需要有较强的安卓基础和虚拟机二次开发技术,短时间内应该很难搞定。

不过现在业界有很多 Windows 上基于 AOVB 技术的虚拟机,例如逍遥模拟器、雷电模拟器、MuMu模拟器等,这些模拟器也能提供和真机类似的操作功能,对arm的优化做的也挺好,支持设备号重置,也支持通过ADB协议进行群控,大体上也能复用目前的开发框架。难点只在于Windows系统的申请、运维、安卓虚拟机的状态管理、运行效率等。

基于第三方服务的方案
事实上,云手机现在也是一套较为成熟的解决方案,各大云服务厂商也都有较为成熟的产品:

阿里云手机
百度云手机
华为云手机(鹏城云手机)
使用第三方服务的好处是产品较为成熟,坑可能少一点,但是一方面我们可能和他们没有合作关系,难以采购;另一方面很多定制化的事情和深度接入等方面可能不好搞;况且也有业务隐私性方面的问题。

因此不是很建议内部直接使用。

基于第三方硬件的方案
基于多开发板的群控主机
考虑到安卓手机本质上就是一个刷了安卓系统的arm设备,那么与其买昂贵且不便调度的整机,我们完全可以直接买多个安卓开发板拼成一个群控系统。

例如联智通达的群控主机,基于多个RK3399的安卓主板组装成一个主机,使用时只要往每一个小主板上刷入安卓系统即可。

这套方案比较粗暴,可能对真机的模拟程度会好一点,但是调度、刷机、运维都不太方便,故障率可能也比较高。

基于arm服务器的虚拟手机
多个小arm板的可靠性可能比较低,那么采用一个较大的arm服务器并虚拟化出云手机看来应该是个不错的方案。例如 安卓魔盒,凌点科技等公司就提供了类似的解决方案。

这种方案的好处就是设备管理成本会很小,例如安卓魔盒声称1U的机架服务器可以虚拟出100台安卓手机,扩量和管理起来也比较方便。由于没有屏幕和电池,功耗也会小很多,使用寿命也比手机要久。同时他们也提供一些基础的设备管理功能、Rom定制、一键改机等绕风控的方案。

这些公司本质上贩卖的是 arm服务器+虚拟化方案+定制ROM+管控软件,很多功能也都对“防反爬能力”做了优化,因此很多工作室都会用这些东西来搞事情。不过他们的管理软件等都是基于windows闭源的,如果需要内部使用,就一定需要进行二次开发。而二次开发能力则需要我们大批量采购他们才会提供,而且软件兼容性、风控概率、二次开发能力也未知,风险也不小。

基于anbox自建云服务的方案
市面上既然有了闭源方案,那么必然有对应的开源方案。比如所谓基于Monbox软件架构的华为云手机、基于华为云的鹏城云手机开源的一个叫openvmi的开源项目。这些项目其实都是基于一个叫anbox的开源项目。

Anbox is a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu. In other words: Anbox will let you run Android on your Linux system without the slowness of virtualization.
anbox采用的技术栈是类似 docker 初期的 lxc 的虚拟化方案,可以以窗口的形式打开安卓app,且多个模拟器可以共享一些底层资源,效率较高。

经本地测试后发现在x86上可以很容易的安装,内置的app使用也比较流畅。但是即使是在开了硬件加速、刷了libhoudini的情况下,启动大多数有arm so包的app仍然无法启动或者闪退。

而在arm上,目前anbox还不支持在arm64直接下载二进制包,尝试直接从源码编译也报了一些奇怪的错。看来华为还是对arm64做了一些开发适配工作的,参考v2ex的讨论。

基于redroid自建云服务的方案
其实,运行云手机最正统的方案应当还是在开了硬件虚拟化的 arm 服务器里直接跑 kvm+qemu ,从而直接采用成熟的开源虚拟机解决方案。更进一步的,可以把虚拟化出的虚拟机用docker+k8s进行控制,更加方便的进行管理。

redroid 就是一个基于此种架构的开源方案,支持 x86 和 arm 两种cpu架构,并通过 docker 镜像打包 kvm+qemu+android 的形式提供部署方案。客户端再通过 scrcpy 进行远程控制。项目整体的扩展性很好,我们可以很容易的自己构建自定义ROM。

ReDroid (Remote anDroid) is a GPU accelerated AIC (Android In Container) solution. You can boot many instances in Linux host (Docker, podman, k8s etc.). ReDroid supports both arm64 and amd64 architectures. ReDroid is suitable for Cloud Gaming, VMI (Virtual Mobile Infurstrure), Automation Test and more.
作者是目前在趋势科技做 AiC(Android in Container) 相关工作的 zhouziyang 。

经过测试,redroid 在 x86 上能稳定运行,但是即使在刷了 libndk_translator 的情况下,运行有arm so的apk还是容易闪退。不过如果直接在arm机器上跑redroid,则一切都没有问题:

稍微麻烦的是redroid的镜像默认使用的是开源的 aosp,如果需要应对反爬策略、精简系统、提高执行效率,则需要再对rom进行一下针对性的二次开发。不过从目前看来,这套方案的稳定性、可用性、扩展性都比较好,可以优先进行部署。

关于ARM云服务器,百度云预计要2022年上半年才会推出可用的arm云服务器,腾讯云目前已经有一些内测的鲲鹏(后续无持续供货了)和安培的服务器可先供测试。

另外,和redroid类似的也有另一个安卓虚拟机方案 dock-droid,这个方案采用 vnc 而不是 scrcpy 进行远程控制,不过默认没有支持arm服务器。

养号管理方案
猫池
根据现有的经验,在管理SIM卡的时候,把SIM卡分散插在不同的手机里会很难管理。因此我们希望有一套设备能统一管理多个SIM卡,支持收发短信就行。

业界一般将这种设备叫做猫池,例如深圳市亿纬信息提供的这种短信猫池,可以方便进行集中式的SIM卡管理。基于此进行二次开发,我们可以将短信验证码的收发功能做成服务化,更加方便我们进行调度使用。

参考资料
如何搭建云手机

Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验

KVM文档

Comments are closed.