让李逍遥在 Android 14 上奔跑——SDLPAL 引擎构建现代化手记 “十年一剑情如梦,再向苍天问仙踪。”1995 年,大宇资讯在台湾发布了《仙剑奇侠传》。那一年,Windows 95 刚刚问世,互联网对普通人还是科幻概念,李逍遥、赵灵儿、林月如的故事,装在几张软盘里,跑在 DOS 系统上,却成了整整一代玩家心中永远的白月光。三十一年过去了。DOS 已成博物馆里的展品,软盘变成了怀旧文创,当年通宵打仙剑的少年们如今已为人父母。但仙剑还是那个仙剑—— thanks to SDLPAL,这个开源的仙剑奇侠传重制引擎,让经典得以在新时代的设备上延续。缘起:为什么还要折腾一个老引擎?SDLPAL 是基于 SDL 的仙剑奇侠传开源引擎实现,支持 Windows / Linux / macOS / Android / iOS / 甚至 3DS 和 PSP。它本身不包含任何游戏资源——你只需要把自己合法获得的仙剑游戏文件丢进去,就能在现代系统上重温经典。但 SDLPAL 的 Android 构建配置停留在了一个尴尬的年代:AGP 8.9、Gradle 8.11、NDK 23、proguard-android.txt(已废弃)…… 跑是能跑,但每次 Android Studio 升级都弹一堆兼容性警告,新机器上也时有怪异崩溃。是时候给它做一次彻底的现代化了。本文记录这次改造的全过程,包括构建工具链升级、启用混淆压缩、以及一个让人哭笑不得的闪退 Bug 的排查——希望能帮到同样在折腾老项目 Android 构建的你。一、构建工具链升级1.1 升级概览组件升级前升级后AGP (Android Gradle Plugin)8.9.19.2.0Gradle8.11.19.4.1NDK23.1.777962027.0.12077973compileSdk3636minSdk2121targetSdk3636ABIarmeabi-v7a, arm64-v8aarm64-v8a only砍掉armeabi-v7a是经过考量的:现在 arm64 设备占比已超过 99%,32 位 ARM 的维护成本(NDK 库体积翻倍、测试矩阵膨胀)远大于收益。1.2 踩坑一:AGP 9 不再认 sourceSets 里的软链接SDLPAL 的 Android 工程有个特殊设计:SDL 的 Java 源码(org.libsdl.app.SDLActivity等)位于3rd/SDL/android-project/app/src/main/java/下,需要"引入"到 app 模块。旧版通过sourceSets指向那个目录:sourceSets{main.java.srcDirs+='src/main/java'}但旧版还在android/app/src/main/java/org/libsdl/app放了一个git symlink指向 SDL 源码。AGP 9 对符号链接的处理变了——构建时直接报 “package org.libsdl.app not found”。解决方案:用 Windows 的NTFS Junction(目录联接)替代 symlink。Junction 是文件系统级别的硬链接,AGP 和 Gradle 都能正确识别。@echo off REM build-scripts/setup-junction.bat set SDLPAL_ROOT=%~dp0.. set JUNCTION_PATH=%SDLPAL_ROOT%\android\app\src\main\java\org\libsdl\app set SDL_JAVA_SRC=%SDLPAL_ROOT%\3rd\SDL\android-project\app\src\main\java\org\libsdl\app if exist "%JUNCTION_PATH%\SDLActivity.java" ( echo [OK] Junction already exists. exit /b 0 ) if not exist "%SDLPAL_ROOT%\android\app\src\main\java\org\libsdl" ( mkdir "%SDLPAL_ROOT%\android\app\src\main\java\org\libsdl" ) mklink /J "%JUNCTION_PATH%" "%SDL_JAVA_SRC%" echo [OK] Junction created同时在.gitignore里忽略这个 junction 路径(它不该入仓):# SDL Java source junction (created by scripts/setup-junction.bat) android/app/src/main/java/org/libsdl/app/1.3 踩坑二:NDK 27 链接器命令行过长升级到 NDK 27 后,链接libmain.so时报一个诡异的错误:Error 87: The parameter is incorrectError 87是 Windows 的ERROR_INVALID_PARAMETER。排查后发现是链接器命令行长度超过 Windows 的 32767 字符限制——SDLPAL 的Android.m