gpt回答的。
当初 Android 版国际象棋 AI 不是直接拿桌面版 Linux 的 Stockfish 文件跑的。MAS 这里的棋局逻辑本身还是 python-chess,AI 是通过 subprocess.Popen 启动 Stockfish,再走 UCI 文本协议通信。
Android 移植时主要做了这些:
准备 Android ABI 对应的 Stockfish 二进制:
旧方案是把它释放到:
- /data/user/0/and.sirp.masmobile/files/game/mod_assets/games/chess/...
然后 chmod 755 再 subprocess.Popen。
但 Android 10 / API 29 以后,app 可写目录里的二进制不能可靠执行,会撞 WX 限制。所以后来改成把 Stockfish 放进 APK 的 jniLibs:
- lib/arm64-v8a/libmas_stockfish.so
- lib/armeabi-v7a/libmas_stockfish.so
RAPT/Gradle 里还要开:
- jniLibs.useLegacyPackaging = true
这样 Android 会把 native lib 解压到真实文件路径。
运行时在 chess.rpy 里判断 Android SDK:
- API 29+:从 nativeLibraryDir/libmas_stockfish.so 启动
- API 28-:保留旧的释放文件 + chmod 路径
所以关键点不是“把 Linux 文件替换成 Android 文件”这么简单,而是:Android 需要 Android ABI 的 ELF,并且新系统上要从 nativeLibraryDir 这种可执行位置启动。
iOS 这边大概率不能照搬。macOS 的 Stockfish 二进制不能在 iOS 上跑,iOS 也不像 Android 那样适合从游戏目录里 subprocess 拉一个外部可执行文件。比较靠谱的方向可能是:
- 编译 iOS arm64 版本的 Stockfish;
- 不把它当外部进程跑,而是做成静态库/原生模块,再从 Ren'Py/Python 层通过桥接调用;
- 或者换成纯 Python/内置逻辑的弱一些的引擎,避免 iOS 原生执行限制。
如果只是问 Android 当时怎么做,仓库里可以看 docs/android-stockfish-native-lib-summary.md,核心代码在 game/chess.rpy 和 game/0mobile.rpy。