本文发自 http://www.binss.me/blog/run-azurlaneautoscript-on-arm64/,转载请注明出处。
最近在同事的安利下入坑碧蓝航线,发现这个游戏太 tm 肝了,每天重复劳动超过一小时,为此 github 上搜寻了一番挂机脚本,发现了 https://github.com/LmeSzinc/AzurLaneAutoScript (后简称 ALAS) ,根据 文档 ,我选择了在 x86 windows PC 上运行夜神模拟器 + 脚本的方式,试用完后一阵狂喜,彻底解放了生产力。
但我的 PC 由于功耗过高,一般只有在打游戏的时候开启,其他时间处于睡眠状态。而挂机需要 24h 不间断,因此 PC 不是合适的选择。左右环顾,手头上常年开机的只有一台群晖 DS918(x86) 和一台日常主力机 Mac Studio (arm64)。于是我开始了我的折腾。
ARM64 运行模拟器
首先在群晖上运行安卓模拟器毫无疑问是不可行的,因为 j3455 带不动。所以我选择在 Mac Studio 上跑模拟器。不幸的是,在 Apple Silicon 下,几乎所有的安卓模拟器都不支持,包括当年经常用的老朋友 genymotion 。幸运的是,官方的 Andriod Studio 内带的 device emulator 能支持。安装之:
brew install --cask android-studio
装完后启动应用,在首页 - More Actions - Virtual Device Manager ,可以创建设备
我用了如下配置供参考,注意安卓版本不要太高,太高会导致启动碧蓝航线的时候黑屏,不知道为啥。
创建完设备后启动,安装游戏即可:
x86 运行 ALAS
由于 AzurLaneAutoScript 项目没有 ARM64 的 build ,为了省事考虑还是考虑构建 x86 的版本。AzurLaneAutoScript 项目提供了 Dockerfile ,于是我直接根据 https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/Installation_en_docker 进行构建。
不幸的是,服务挂了。于是我加入了 AzurLaneAutoScript 开发者群,在群里大佬的指导下,发现是跑 mxnet core 了,报了 Illegal instruction 。作为一个 C++ API Boy 对这个很熟悉了,一般是运行了 SIMD 指令但机器不支持。对于 mxnet 这种机器学习库显然不会错过用 SIMD 来加速。而对于 Mac Studio ,根据 https://developer.apple.com/documentation/apple-silicon/about-the-rosetta-translation-environment 显然不支持:
Rosetta translates all x86_64 instructions, but it doesn’t support the execution of some newer instruction sets and processor features, such as AVX, AVX2, and AVX512 vector instructions. If you include these newer instructions in your code, execute them only after verifying that they are available. For example, to determine if AVX512 vector instructions are available, use the sysctlbyname function to check the hw.optional.avx512f attribute.
一番搜索,解决办法很简单,项目依赖的是 mxnet==1.6.0 ,在所有依赖装完后把 mxnet 卸载掉,安装最新版即可,目测是 USE_SSE 选项在 1.6.0 里被打开了。
image 构建完成后,启动容器:
docker run -it -e TZ=Asia/Shanghai --volume=/Users/binss/Desktop/AzurLaneAutoScript:/app/AzurLaneAutoScript:rw -p 22267:22267 --name azurlaneautoscript azurlaneautoscript
ALAS 连接模拟器
容器中的 AzurLaneAutoScript 需要连接 host 上的安卓模拟器,host 可以通过 host.docker.internal 访问,而端口需要在 host 上看看:
$ lsof -iTCP -sTCP:LISTEN -n -P | grep qemu
qemu-syst 43049 binss 42u IPv4 0xbccf4cd072e9da6f 0t0 TCP 127.0.0.1:5555 (LISTEN)
qemu-syst 43049 binss 43u IPv6 0xbccf4cd06cecd9f7 0t0 TCP [::1]:5555 (LISTEN)
qemu-syst 43049 binss 44u IPv4 0xbccf4cd072c96f8f 0t0 TCP 127.0.0.1:63524 (LISTEN)
qemu-syst 43049 binss 45u IPv6 0xbccf4cd06cecfc57 0t0 TCP [::1]:63524 (LISTEN)
qemu-syst 43049 binss 46u IPv4 0xbccf4cd071adda6f 0t0 TCP 127.0.0.1:5554 (LISTEN)
qemu-syst 43049 binss 47u IPv6 0xbccf4cd06ced60d7 0t0 TCP [::1]:5554 (LISTEN)
qemu-syst 43049 binss 54u IPv6 0xbccf4cd06ced6e97 0t0 TCP 127.0.0.1:8554 (LISTEN)
qemu-syst 43049 binss 65u IPv4 0xbccf4cd072e3c4af 0t0 TCP 127.0.0.1:65358 (LISTEN)
根据官方文档,5555 即为 adb 端口,因此在 ALAS 的 模拟器 Serial
填入 host.docker.internal:5555
arm64 运行 ALAS
然而,在 Mac Studio 上以模拟 x86 的方式运行 ALAS 性能并不理想。最典型的就是自动委托界面文字的 OCR,识别完成需要十几秒。另一方面,运行过程 CPU 占用较高,高峰时达到了 200%,而 native 的安卓模拟器只占不到 90% 。
那么能否让 ALAS 在 arm64 下 native 运行呢?为了实现这个想法,我整整折腾了一天。
主要拦路虎还是 mxnet ,即使是最新版,对 arm64 的支持也是很差的。根据 https://github.com/apache/incubator-mxnet/issues/19234 ,需要去安装一个 ArmPL ,但它是 OS Specify 的,我尝试装了几个版本都没能跑起来。无奈之下,考虑自己编译。
arm64 编译 mxnet
编译 mxnet 是一件浪费时间且令人心累的过程,建议等官方支持,或直接安装我编译好的 wheel
- 安装依赖:apt-get install -y build-essential git ninja-build ccache libopenblas-dev libopencv-dev cmake
- clone 代码:git clone --recursive https://github.com/apache/incubator-mxnet mxnet ,checkout 到 1.9.1 branch
- make
编译过程需要大量的内存,一开始给 docker 分配了 8g 结果 OOM 了,后来调到 20G,四核编译了半小时)呵呵。
编译完后,通过 pip 安装 mxnet 目录下的 python 目录,当然在此之前,记得把已安装的 mxnet 1.6.0 卸载掉:
pip uninstall mxnet
pip install --user -e ./python
其他依赖
针对 arm64,我重新写了个 Dockerfile :
# First arm64 version
FROM continuumio/anaconda3:2021.11
# Set remote and local dirs
WORKDIR /app
# Install the base conda environment
# Cannot find python 3.7.6 for arm64, so use 3.7.10
ENV PYROOT=/app/pyroot
RUN conda create --prefix $PYROOT python==3.7.10 -y
# CV2 requires libGL.so.1
RUN apt-get update && apt-get install -y libgl1 adb libatlas-base-dev libopencv-dev build-essential && rm -rf /var/lib/apt/lists/*
# Install the requriements to the conda environment
COPY ./requirements.txt /app/requirements.txt
RUN $PYROOT/bin/pip install -r /app/requirements.txt
COPY ./mxnet-1.9.1-py3-none-any.whl /app/mxnet-1.9.1-py3-none-any.whl
RUN $PYROOT/bin/pip uninstall mxnet -y && $PYROOT/bin/pip install /app/mxnet-1.9.1-py3-none-any.whl
ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/app/pyroot/mxnet/"
# When running the image, mount the ALAS folder into the container
CMD $PYROOT/bin/python /app/AzurLaneAutoScript/gui.py
其依赖于 requirements.txt :
adbutils==0.11.0
scipy
pillow
opencv-python
imageio
lz4
tqdm
uiautomator2==2.16.7
retrying
cnocr==1.2.2
jellyfish
pyyaml
inflection
pywebio==1.5.2
starlette==0.14.2
anyio==1.3.1
uvicorn[standard]==0.17.6
aiofiles
wrapt==1.13.1
prettytable==2.2.1
pypresence==4.2.1
alas-webapp==0.3.7
rich==11.0.0
zerorpc
atomicwrites
和 mxnet-1.9.1-py3-none-any.whl
或直接用我的 image :binss/azurlaneautoscript:arm64
换用 arm64 版本后,ALAS 性能提升明显,OCR 耗时显著降低,CPU 占用降低到 50% 左右。
1F SkyHua 2 years, 5 months ago 回复
感谢大佬制作的docker
我在运行docker pull binss/azurlaneautoscript:arm64的时候出现了问题
感谢大佬制作的docker!!!
我在运行时出现了/app/pyroot/bin/python: can't open file '/app/AzurLaneAutoScript/gui.py': [Errno 2] No such file or directory导致无法打开,请教下如何解决这个问题
请教一下应该要如何处理
2F binss MOD 2 years, 5 months ago 回复
回复 [1F] SkyHua:需要把项目clone下来,然后挂载到容器里,比如 -v /User/binss/Desktop/AzurLaneAutoScript:/app/AzurLaneAutoScript:rw 是把 /User/binss/Desktop/AzurLaneAutoScript 挂载进去
3F Nico 2 years, 5 months ago 回复
回复 [2F] binss:大佬,请教下您这边能用minitouch和aScreenCap嘛,我看它会去找20000-20999的端口但是找不到,不知如何解决
4F binss MOD 2 years, 5 months ago 回复
回复 [3F] Nico:aScreenCap支持的安卓版本太老了,没搞。minitouch 依赖于 atx-agent,目前项目里自动安装的版本是 32 位的启动不了。自己到 https://github.com/openatx/atx-agent 下载 arm64 的 release 上传到模拟器里的目录比如 /data/local/tmp/atx-agent ,然后通过 /data/local/tmp/atx-agent server -d 启动即可
5F poi~ 2 years, 3 months ago 回复
感谢docker制作,我有一台树莓派4b,arm64v8处理器,装了64位的kali,想用来做挂alas,挂载了alas本体之后报错Illegal instruction (core dumped)
看了一下错误代码是exit code 132,应该是4+128,某个指令不支持了,不知能没不能看到进一步的log
是不是因为指令集不支持的原因呢?请问一下你用的是什么版本的arm处理器呢?
6F binss MOD 2 years, 3 months ago 回复
回复 [5F] poi~:Illegal instruction 就是运行了不支持的指令。一般是 core 在 python import mxnet ,可以直接对它 gdb 排查。
我的是 m1 max
7F cat 2 years, 3 months ago 回复
大佬,rss 失效啦
8F Feelinger 2 years, 2 months ago 回复
你好,请教一下alas运行用的python在什么位置啊,最近的一次更新增加了onepush的依赖,直接pip安装貌似安装的不是alas用的python😂
9F binss MOD 2 years, 2 months ago 回复
回复 [8F] Feelinger:/app/pyroot
10F Torala 1 year, 11 months ago 回复
给大佬点赞,自己摸索了好几天没有整成功,在大佬教程下马上就弄好了。
2022.12.08在这里给后来者提个醒,M1芯片用docker部署命令为(要先安装小蓝鲸docker arm版):
1、docker pull binss/azurlaneautoscript:arm64
2、docker run -it -e TZ=Asia/Shanghai --volume=你自己放alas的文件夹:/app/AzurLaneAutoScript:rw -p 22267:22267 --name azurlaneautoscript binss/azurlaneautoscript:arm64
3、启动后再docker里面进入到命令行(Terminal),输入cd /app/pyroot/bin && ./pip install onepush==1.2.0 #(这个版本根据requirements.txt里面的版本进行变化)
4、alas里面模拟器截图方案设置为:ADB_nc,模拟器控制方案设置为:Hermit,模拟器 Serial设置为:host.docker.internal:5555
5、模拟器里面会提示开启hermit的权限,根据提示开启即可。
11F a 1 year, 6 months ago 回复
回复 [10F] Torala:请问你avd里的镜像是用的什么版本的,我用hermit,atlas会反复开启hermit的权限,但是就是不会成功
12F 克儿 1 year, 6 months ago 回复
同hermit启动不了,打开开关之后弹出对话框要下滑就卡住了,手动打开hermit提示HermitError: Accessibility service already enable but get error
13F ashe 1 year, 6 months ago 回复
大佬你好!请问一下你会不会遇到alas点击太快导致漏点的情况?比如说收菜只能收油,金币和经验书直接漏掉。明明游戏里的光标对点击做出反应了,但就是无法触发。
14F 小蓝鲸arm版本 1 year, 6 months ago 回复
博主,想请问下,现在我经历了一下步骤
1.拉取源代码
2.docker pull docker镜像
3docker run 挂载到容器里面
4.终端更新onepush
5重启打开网页版alas,一切可以正常使用,但是唯独无法更新,点开会提示应用内部发生错误(TypeError: 'NoneType' object is not iterable)
6.docker上一直提示
sh: 1: /app/AzurLaneAutoScript/toolkit/Git/mingw64/bin/git.exe: not found
2023-05-07 21:58:04 INFO 2023-05-07 21:58:04.242 │ [ allowed failure ], error_code: 32512
2023-05-07 21:58:04 WARNING 2023-05-07 21:58:04.247 │ Git fetch failed
2023-05-07 22:03:04 INFO 2023-05-07 22:03:04.266 │
可我已经安装了git的。如何处理呢?求助
15F binss MOD 1 year, 6 months ago 回复
回复 [13F] ashe:没遇到过,可以尝试别的模拟点击方式。可能不是点击太快,而是模拟器执行速度太慢
16F binss MOD 1 year, 6 months ago 回复
回复 [14F] 小蓝鲸arm版本:我没使用过内置的更新,因为如果存在什么依赖上的更新,可能会导致下次无法运行。所以我在做容器的时候是将将代码目录挂载从 host 的 /Users/binss/Desktop/AzurLaneAutoScript 挂载到容器内,这样更新代码可以在 host 上直接 cd 的这个目录去 git pull
17F lan 1 year, 4 months ago 回复
有大佬碰到这种情况吗,有时候hermit会自动关闭。即使我手动启动了,再启动alas,又弹出hermit界面让我启动了(hermit显示是关闭的)
18F xiaoyuren 1 year, 4 months ago 回复
大佬如何在doker上执行更新代码?
19F binss MOD 1 year, 4 months ago 回复
回复 [18F] xiaoyuren:起容器的时候是将代码目录挂载进去了的。可以在容器内、也可以在容器外 git pull 。注意更新后可能某些依赖变了,需要手动装下
20F yyr 1 year, 3 months ago 回复
总是在跑一段时间后自动断开adb连结,请问博主怎么弄得
21F yyr 1 year, 3 months ago 回复
回复 [12F] 克儿:用maatouch,不要用hermit
22F yyr 1 year, 3 months ago 回复
弄好了,更换模拟器版本为安卓10和操作方式为adb即可
23F 呆毛 1 year, 1 month ago 回复
请问下运行需要多大内存呢?我有个8g内存的macmini 不知道内存足够?
24F binss MOD 1 year, 1 month ago 回复
回复 [23F] 呆毛:要求不高,可以试试
25F 菜狗 1 year ago 回复
docker run我会报错
日志是:sh: 1: /app/AzurLaneAutoScript/toolkit/Git/mingw64/bin/git.exe: not found
INFO 2023-10-11 15:16:52.771 │ [ allowed failure ], error_code: 32512
WARNING 2023-10-11 15:16:52.774 │ Git fetch failed
没学过docker,这咋解决啊,pull完run就这样了
26F 卤虾油 1 year ago 回复
你们的模拟器运行几天后会出现没网络的情况吗。
27F 呆毛 1 year ago 回复
“CD 的这个目录去 git pull” 的这个目录去 git pull更新文件怎么用?更新完还需要重新挂载么
28F lx 10 months, 3 weeks ago 回复
有大佬用avd玩国际服碧蓝航线吗?avd内自带play store的机型没办法修改分辨率和内存之类的,请问如何给自己配置的机型添加play store呢?
29F 五五开 10 months, 3 weeks ago 回复
大佬,我想问一下,你的m1 max使用alas和安卓模拟器合计的gpu、cpu、内存占用有多少呢,因为我这边有个rk3588的板子,我想alas和碧蓝都挂在上面,但是我怕性能不够
30F ColorfulBeach 10 months, 2 weeks ago 回复
回复 [29F] 五五开:rk3588的性能估计是过剩的,我也有点想用rk3588折腾alas,就等你测试了。测试完记得回来发下评论(
31F ColorfulBeach 10 months, 2 weeks ago 回复
回复 [29F] 五五开:我是从github这个仓库顺藤摸瓜到这里的:
https://github.com/linwei5d/AzurLaneAutoScript-Docker-Arm64
作者这折腾得挺好的。
32F 消费 10 months ago 回复
大佬666
33F Shiro 10 months ago 回复
用820/835和845一跑就报Illegal instruction (core dumped)
34F hkhh 9 months, 3 weeks ago 回复
回复 [33F] Shiro:手机吧,我也是这样
35F hbk 9 months, 2 weeks ago 回复
回复 [28F] lx:设备右侧三个点图标,show on disk,对着有play store版本的改config.ini文件就可以用自定义设备启动play store了,具体如图https://i.stack.imgur.com/Jv3dl.png
36F Shiro 9 months, 1 week ago 回复
回复 [34F] hkhh:重新编译了一个mxnet 好了,方式可以参考树莓派编译mxnet
37F Cloth 8 months, 1 week ago 回复
有没有大佬遇到这个问题,使用android 10系统,碧蓝航线进入游戏后,每次大更新的动画界面都必卡死,然后AVD闪退,但是如果没有更新动画的版本就能正常运行。有没有什么可能的解决方法?
38F ran 6 months, 4 weeks ago 回复
最近几次更新以后,alas就启动不了,有各种依赖问题,我尝试手动安装也不行。有大佬遇到过知道怎么解决嘛
39F ran 6 months, 4 weeks ago 回复
回复 [38F] ran:突然想到按照requirement里的版本安装pydantic就好了。。前面没有指定版本搞出一堆问题,头大
/app/pyroot/bin/pip install pydantic==1.10.2
40F yzufo 3 months, 2 weeks ago 回复
最新版本如果遇到Hermit无法使用的情况需要将这个atx-agent 推送进 /data/local/tmp
https://github.com/openatx/atx-agent/releases/download/0.10.0/atx-agent_0.10.0_linux_arm64.tar.gz
41F yzufo 3 months, 2 weeks ago 回复
回复 [40F] yzufo:同时使用 DroidCast_raw 截图和 MaaTouch 点击
42F KK 3 months, 1 week ago 回复
回复 [29F] 五五开:大佬大佬,rk3588,alas+碧蓝成功了吗,我也有这个想法折腾了两天又回到起点了,过来取取经
43F 空桑 3 months, 1 week ago 回复
根据我的测试,arm上使用redroid和wayroid似乎无法进入碧蓝航线,x86的反而可以,非常奇怪
44F KK 3 months, 1 week ago 回复
回复 [43F] 空桑:我在香橙派5plus上,redroid成功运行了碧蓝航线,参照这个大佬的 这两篇运行的,现在卡在了alas上,还在研究中https://www.nyanners.moe/post/rk3588-orangep5plus-starrailcopilot.html,https://www.nyanners.moe/post/fix-rk3588-redroid-azur-lane-crash.html