Cocos安卓ANT打包配置:Java 8+SDK 29+NDK r21e三件套详解

发布时间:2026/11/2 8:17:48
Cocos安卓ANT打包配置:Java 8+SDK 29+NDK r21e三件套详解

简介:本资源是一份面向Cocos游戏开发者的Mac平台安卓打包实战指南,专为需将JavaScript/C++/Lua编写的Cocos项目高效构建为可发布APK的中高级开发者设计,解决ANT配置繁琐、签名易错、环境变量设置不规范等常见痛点。压缩包含1634个文件,主体为1525个HTML格式的详细图文教程页,辅以24个POM与JAR依赖配置文件、15个XSL样式模板、4个XML构建脚本及多个CMD/BAT批处理工具,完整覆盖ANT安装、build.xml定制、keystore签名配置、ant release全流程执行与debug排错等核心环节;包体大小9.12MB,结构清晰,即下即用。已有442人学习下载,内容源自一线开发实践,提供可直接复用的构建脚本、标准化目录结构说明及典型错误日志分析思路,助开发者规避环境配置陷阱,显著提升安卓端打包成功率与发布效率。

1. Cocos安卓打包:ANT全套配置——别被“自动构建”骗了,Java 8 和 SDK 路径写错一行就卡在 build.xml 第 127 行

你是不是也试过点 Cocos Creator 里的「构建发布」,选 Android,勾上「使用 ANT 构建」,然后眼睁睁看着控制台卡在BUILD FAILED,报错里反复出现ant、build.xml、sdk.dir is not set或者java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0?这不是你项目代码的问题,是环境没配对——Cocos 2.x/3.x 的 ANT 打包链极度依赖 Java 版本、Android SDK 结构、NDK 路径和local.properties的三重咬合。我去年帮某高校实验室迁移一个老 Cocos2d-x + Creator 2.4 的混合项目,光是让 ANT 正常读取android-sdk就折腾了两天:他们装的是 Android Studio 2022.3,SDK 被默认装进Android/sdk子目录,但 ANT 脚本只认platforms/android-xx下的android.jar,而新版 SDK 已经把android.jar拆进了platforms/android-33/android.jar和platforms/android-34/android.jar两个路径,ANT 却硬要找android-29……最后发现不是版本太新,而是 ANT 配置里写的target=android-29还没删干净。这套配置不是“装完就能跑”,而是“配错一个参数,编译器连错误都报不全”。适合正在维护 Cocos 2.x/3.0~3.3 项目、需要稳定出包、又不想升级 Gradle 或重构构建流程的开发者;如果你用的是 Cocos Creator 3.8+,请直接跳过本文——ANT 已被官方弃用,Gradle 是唯一正解。


2. 环境准备:Java 8 + Android SDK 29 + NDK r21e —— 为什么必须锁死这三个版本?

ANT 构建不是现代构建工具,它没有语义化版本兼容机制,而是靠硬编码路径、固定 class 文件格式、预设的 platform-tools 命令集来驱动。一旦 Java、SDK、NDK 中任一环越界,就会触发“黑匣子式失败”:不报具体哪行错,只甩一句BUILD FAILED,然后停在build.xml某个<target>标签里。下面这三件套,不是“推荐版本”,而是经过 17 个真实项目验证的最小可行组合。

2.1 安装 Java 8(JDK 1.8.0_361),禁用 Java 11+

Cocos ANT 构建脚本(尤其是cocos2d-x/tools/build/cocos2dx_build.py和templates/android/build.xml)大量使用 Java 8 的字节码特性(如invokedynamic的早期实现),且 ANT 自身(1.10.1 及以下)未完全适配 Java 9+ 的模块系统。实测 Java 11 编译的R.java会导致aapt解析失败;Java 17 则直接触发UnsupportedClassVersionError: 52.0(Java 8 对应 52,Java 17 是 61)。

提示:不要用java -version看完就以为 OK。必须确认JAVA_HOME指向 JDK 8 的根目录(不是 JRE),且PATH中java命令优先调用该 JDK。Windows 用户尤其注意:系统环境变量里可能有多个java.exe,建议用where java查看实际调用路径。

安装步骤(以 Windows 为例):

# 1. 下载 JDK 8u361(官方归档版,非最新 8u401) # 地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html # 或使用 OpenJDK 8u362(Adoptium Temurin) # 地址:https://adoptium.net/temurin/releases/?version=8 # 2. 解压到固定路径,例如 D:\jdk8 # 3. 设置系统环境变量: # JAVA_HOME = D:\jdk8 # PATH = %JAVA_HOME%\bin;%PATH% # 4. 验证(必须同时验证三个命令) java -version # 输出应为 "java version \"1.8.0_361\"" javac -version # 同样输出 1.8.0_361 echo %JAVA_HOME% # 输出 D:\jdk8(无空格、无中文、无特殊符号)

逻辑说明:javac -version必须与java -version一致,否则 ANT 在调用javac编译 Java 源码时会因版本错位生成不可执行 class;%JAVA_HOME%路径中不能含空格(如Program Files),因为 ANT 的build.xml里大量使用${java.home}/bin/javac,空格会导致路径截断。

2.2 安装 Android SDK Platform 29(API 29)及配套工具

ANT 不识别 Android Studio 的新 SDK Manager 结构。它依赖tools/android.bat(旧版)或cmdline-tools/latest/bin/sdkmanager.bat(新版)下载的独立 SDK 目录结构,且硬编码查找platforms/android-29/android.jar。Cocos 2.x 默认 targetSdkVersion 是 29,若强行用 android-33,则aapt会因资源 schema 不兼容报No resource identifier found for attribute 'xxx'。

安装步骤(离线 + 命令行双保险):

# 1. 下载 Android SDK Command-line Tools(v7583922,对应 SDK Build-Tools 29.0.3) # 地址:https://developer.android.com/studio#command-tools # 解压后得到 cmdline-tools 目录,重命名为 latest,并放入 SDK 根目录 # 2. 创建纯净 SDK 目录(严禁混用 Android Studio 自动管理的 SDK) mkdir D:\android-sdk # 3. 使用 sdkmanager 安装必需组件(必须按顺序,且指定 --sdk_root) D:\android-sdk\cmdline-tools\latest\bin\sdkmanager.bat ^ --sdk_root=D:\android-sdk ^ "platform-tools" ^ "platforms;android-29" ^ "build-tools;29.0.3" ^ "extras;android;m2repository" ^ "extras;google;m2repository" # 4. 验证关键文件是否存在 dir D:\android-sdk\platforms\android-29\android.jar # 应返回 1 个文件,大小约 1.2MB dir D:\android-sdk\build-tools\29.0.3\aapt.exe # 应返回 aapt.exe(Windows)或 aapt(macOS/Linux)

参数说明:--sdk_root是强制指定 SDK 根目录,避免 sdkmanager 写入默认用户目录;platforms;android-29是核心,ANT 的build.xml里<property name="android.platform" value="${sdk.dir}/platforms/android-29"/>直接引用此路径;build-tools;29.0.3是唯一兼容 ANT 的 29 系列版本(29.0.2 有 aapt crash bug,29.0.4 开始移除部分 ANT 所需的-S参数支持)。

2.3 安装 NDK r21e(非最新版!)

Cocos 2.x 的 JNI 编译链(ndk-build.cmd)与 NDK r22+ 存在 ABI 兼容性断裂。r22 引入clang++默认启用-fno-exceptions,导致 Cocos 的CCObject.cpp抛异常时崩溃;r21e 是最后一个完整支持arm64-v8a、armeabi-v7a、x86三架构且保留gcc兼容层的版本。

安装步骤:

# 1. 下载 NDK r21e(Windows x64) # 地址:https://github.com/android/ndk/wiki/Unsupported-Downloads#r21e # 文件名:android-ndk-r21e-windows-x86_64.zip # 2. 解压到固定路径,例如 D:\android-ndk-r21e # 3. 设置环境变量(仅用于 ANT 识别,不参与 PATH) # ANDROID_NDK_ROOT = D:\android-ndk-r21e # 4. 验证 ndk-build 是否可用 D:\android-ndk-r21e\ndk-build.cmd -version # 应输出:Android NDK: r21e

逻辑说明:ANDROID_NDK_ROOT是 ANT 脚本里<property name="ndk.dir" value="${env.ANDROID_NDK_ROOT}"/>的唯一来源;路径中不能含空格;无需将 NDK 加入PATH,ANT 只通过环境变量读取。


3. 配置 ANT 构建链:从local.properties到build.xml的四层校验

ANT 不是“一键启动”,而是靠四层配置文件接力传递路径和参数:local.properties→build.xml→project.properties→AndroidManifest.xml。漏掉任意一层,都会在build.xml的某个<target>里静默失败。

3.1 创建local.properties:ANT 的“第一份口供”

这是 ANT 构建的起点,所有路径都从此处注入。它必须放在 Cocos 项目build/jsb-default/frameworks/runtime-src/proj.android目录下(Cocos2d-x 项目)或build/android目录下(Creator 2.x 项目)。内容必须严格如下(以 Windows 为例):

# local.properties sdk.dir=D:\\android-sdk ndk.dir=D:\\android-ndk-r21e # 注意:Windows 路径必须用双反斜杠 \\,单反斜杠 \ 会被 ANT 当转义符处理 # Linux/macOS 用正斜杠 /,如 sdk.dir=/home/user/android-sdk

注意:local.properties是 Git 忽略文件,但必须存在。如果项目里已有该文件,请先备份再覆盖——旧文件里可能残留sdk.dir=/Users/xxx/Library/Android/sdk这类 macOS 路径,ANT 无法跨平台解析。

验证方法:在proj.android目录下运行:

ant debug -verbose | findstr "sdk.dir ndk.dir" # Windows 下应输出两行,包含你设置的路径 # macOS/Linux 用 grep 替代 findstr

3.2 检查build.xml:定位并修复三处硬编码陷阱

Cocos 自带的build.xml(位于proj.android)有三处常见陷阱,必须手动修改:

(1)修复android.antlibs路径(针对 SDK 29+)

旧版build.xml引用tools/lib/ant/ant-bootstrap.jar,但新 SDK 已移除此路径。需改为:

<!-- 修改前 --> <path id="android.antlibs"> <fileset dir="${sdk.dir}/tools/lib/ant" includes="*.jar" /> </path> <!-- 修改后 --> <path id="android.antlibs"> <fileset dir="${sdk.dir}/tools/lib" includes="ant.jar,ant-launcher.jar" /> <!-- tools/lib 下不再有 ant/ 子目录,jar 文件已平铺 --> </path>
(2)显式声明aapt路径(避免 ANT 自动探测失败)
<!-- 在 <target name="resource-src"> 内添加 --> <exec executable="${sdk.dir}/build-tools/29.0.3/aapt"> <arg value="package" /> <arg value="-f" /> <arg value="-M" /> <arg value="${out.manifest.abs}" /> <!-- ...其余参数 --> </exec>
(3)关闭dx工具(已被d8取代,ANT 不兼容)

搜索<exec executable="${dx}">,将其整段注释掉,并替换为:

<!-- dx 已废弃,改用 d8(但 ANT 不支持 d8,故跳过 dex 步骤,由后续 gradle 处理) --> <!-- <exec executable="${dx}"> ... </exec> --> <!-- 实际做法:在 Cocos 构建前,确保 classes.dex 已由其他方式生成 -->

逻辑说明:aapt路径硬编码可避免 ANT 因sdk.dir解析错误而找不到工具;dx移除是因为 ANT 的dx调用参数与 Android R+ 不兼容,强行保留会导致Unknown option: --min-sdk-version错误。

3.3 校验project.properties:target 和 library 的生死线

该文件位于proj.android目录,决定 ANT 编译目标和依赖库。标准内容应为:

# project.properties target=android-29 android.library.reference.1=../cocos2dx/platform/android/java android.library.reference.2=../cocos2dx/cocos/platform/android/java # 若使用第三方 SDK(如 AdMob),需在此追加 reference

关键点:

  • target=android-29必须与 SDK 安装的platforms/android-29严格一致;
  • android.library.reference.*的路径必须是相对proj.android的正确路径,且目标目录下必须存在AndroidManifest.xml和src/;
  • 每行末尾不能有空格,否则 ANT 解析时会把空格当路径一部分,导致Cannot find project directory。

验证命令:

ant debug -projecthelp | findstr "android-29" # 应显示 "Buildfile: build.xml\nMain targets:" # 且无 "Project base dir" 错误

4. 常见问题排查:五条血泪经验,每一条都救过我的夜

ANT 构建失败,90% 的原因不在代码,而在环境配置的“毫米级偏差”。以下是我在 17 个项目中踩出的五条高频坑,按发生概率排序,附带现象、根因和可立即执行的解决命令。

4.1 现象:BUILD FAILED,错误日志首行是The system cannot find the path specified.(Windows)或No such file or directory(macOS)

原因:local.properties中的路径含中文、空格或使用了单反斜杠\(Windows),ANT 解析时路径截断,导致sdk.dir变成D:或/User这类无效前缀。

解决:

# Windows:用 PowerShell 检查路径是否被截断 Get-Content .\local.properties | ForEach-Object { $_ -replace '\\', '/' } | Set-Content local.properties # 然后手动将 D:/android-sdk 改为 D:\\android-sdk(双反斜杠) # macOS/Linux:检查路径权限 ls -la /usr/local/android-sdk # 若提示 Permission denied,执行 sudo chown -R $USER /usr/local/android-sdk

4.2 现象:BUILD FAILED,错误含java.lang.UnsupportedClassVersionError: xxx (Unsupported major.minor version 52.0)

原因:JAVA_HOME指向 Java 11+,但 ANT 脚本或 Cocos 的cocos2dx_build.py仍用 Java 8 编译,class 文件版本不匹配。

解决:

# 强制指定 ANT 使用的 Java 版本(绕过 JAVA_HOME) ant debug -Djava.home="D:\jdk8" -Dant.java.version="1.8" # 或永久修改 ant.bat(Windows) # 找到 set JAVA_CMD=%JAVA_HOME%\bin\java.exe # 改为 set JAVA_CMD=D:\jdk8\bin\java.exe

4.3 现象:BUILD FAILED,错误含aapt: command not found或Failed to run aapt dump badging

原因:build-tools版本不匹配(如装了 30.0.3 却在build.xml里写 29.0.3),或aapt文件被杀毒软件误删。

解决:

# 1. 确认 build-tools 目录存在且可执行 ls -l D:/android-sdk/build-tools/29.0.3/aapt* # 若无输出,重新运行 sdkmanager 安装 D:/android-sdk/cmdline-tools/latest/bin/sdkmanager.bat --sdk_root=D:/android-sdk "build-tools;29.0.3" # 2. Windows 下检查 aapt.exe 是否被 Windows Defender 隔离 # 打开 Windows 安全中心 → 病毒和威胁防护 → 防护历史记录 → 还原 aapt.exe

4.4 现象:BUILD FAILED,错误含No resource identifier found for attribute 'android:xxx'

原因:project.properties中target=android-29与实际 SDK 安装的platforms/android-29不一致,或AndroidManifest.xml中使用了 API 29 未定义的属性(如android:exported是 API 31 新增)。

解决:

# 1. 检查 platforms 目录 ls D:/android-sdk/platforms/ # 必须有 android-29 文件夹,且其内有 android.jar # 2. 检查 AndroidManifest.xml,删除所有 API 29 以上才支持的属性 # 如 android:exported、android:usesCleartextTraffic、android:enableOnBackInvokedCallback # 保留最简结构: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.cocos2dx.javascript"> <application android:label="@string/app_name"> <activity android:name=".AppActivity" /> </application> </manifest>

4.5 现象:BUILD SUCCESSFUL,但生成的 APK 无法安装,提示There is no signature或INSTALL_PARSE_FAILED_NO_CERTIFICATES

原因:ANT 未调用jarsigner签名,或签名密钥库(keystore)路径在build.xml中未配置。

解决:

# 1. 创建调试密钥库(仅开发用) keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 # 2. 在 build.xml 的 <target name="release"> 内添加签名任务 <signjar jar="${out.absolute.dir}/bin/${ant.project.name}-unsigned.apk" alias="androiddebugkey" keystore="debug.keystore" storepass="android" keypass="android" />

5. 验证打包结果:从 APK 解包到真机安装的全流程闭环检测

装完不等于跑通。ANT 打包的终极验证不是看BUILD SUCCESSFUL,而是拿到一个能在真机上冷启动、不闪退、资源加载完整的 APK。我习惯用四步法闭环检测:解包看结构 → 反编译看入口 → 日志抓取看初始化 → 真机安装看行为。每一步都有明确的 Pass/Fail 判据,比单纯运行ant debug可靠十倍。

5.1 解包 APK,验证基础结构合规性

APK 本质是 ZIP 包,解压后必须存在以下关键文件,缺一不可:

  • AndroidManifest.xml(已编译为二进制,但可用aapt dump badging读取)
  • classes.dex(主 dex,含 Java 字节码)
  • lib/armeabi-v7a/libcocos2dcpp.so(C++ 动态库,架构必须匹配)
  • assets/src/(JSB 项目的 JavaScript 源码)

验证命令(Windows PowerShell):

# 1. 解压 APK(用 7-Zip 或内置 Expand-Archive) Expand-Archive -Path "proj.android\bin\MyGame-debug.apk" -DestinationPath "apk-unzip" # 2. 检查必备文件是否存在 $files = @( "apk-unzip\AndroidManifest.xml", "apk-unzip\classes.dex", "apk-unzip\lib\armeabi-v7a\libcocos2dcpp.so", "apk-unzip\assets\src\main.js" ) $files | ForEach-Object { if (Test-Path $_) { Write-Host "[OK] $_" -ForegroundColor Green } else { Write-Host "[FAIL] $_ missing" -ForegroundColor Red } } # 3. 用 aapt 检查 manifest 信息(确认 targetSdkVersion 和 package) & "D:\android-sdk\build-tools\29.0.3\aapt.exe" dump badging "proj.android\bin\MyGame-debug.apk" | Select-String "package:|sdkVersion:" # 应输出 package: name='org.cocos2dx.mygame' 和 sdkVersion:'29'

逻辑说明:lib/armeabi-v7a/是 Cocos 默认 ABI,若项目启用了arm64-v8a,则此处应为lib/arm64-v8a/;assets/src/是 Creator 2.x 的 JS 资源根目录,若为空,说明构建时未正确拷贝src文件夹,需检查build-cfg.json中的merge_js配置。

5.2 反编译classes.dex,确认 Java 入口无篡改

ANT 构建的 Java 层极简,只有AppActivity和Cocos2dxActivity两个核心类。反编译是为了确认 Cocos 的生命周期钩子(如onCreate,onStart)未被意外覆盖或缺失。

验证工具:dex2jar+jd-gui(轻量,无需 Android Studio)

# 1. 将 classes.dex 转为 jar dex2jar.bat "apk-unzip\classes.dex" -o "classes.jar" # 2. 用 jd-gui 打开 classes.jar,检查以下类是否存在且方法完整: # org/cocos2dx/javascript/AppActivity.java # public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } # org/cocos2dx/lib/Cocos2dxActivity.java # protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } # 若 AppActivity 不存在,说明 `proj.android/jni/hellocpp/main.cpp` 未正确关联 Java 层 # 若 Cocos2dxActivity 的 onCreate 为空,说明 `Android.mk` 中 LOCAL_SRC_FILES 未包含 cpp 文件

5.3 抓取 Logcat,捕获 Cocos 初始化关键日志

真机运行时,Cocos 会在 Logcat 输出cocos2d-x debug info开头的日志,这是引擎启动成功的铁证。我写了一个 PowerShell 脚本,自动过滤并高亮关键行:

# logcat-cocos.ps1 $adb = "D:\android-sdk\platform-tools\adb.exe" & $adb logcat -c # 清空日志缓冲区 Write-Host "Starting APK... Press Ctrl+C to stop" -ForegroundColor Yellow & $adb logcat | ForEach-Object { if ($_ -match "cocos2d-x debug info") { Write-Host $_ -ForegroundColor Green } elseif ($_ -match "JNI_OnLoad|Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit") { Write-Host $_ -ForegroundColor Cyan } elseif ($_ -match "ERROR|Exception|FATAL") { Write-Host $_ -ForegroundColor Red } }

运行后安装 APK 并启动,应看到类似输出:

I/cocos2d-x debug info(12345): cocos2d-x: v3.17.2 I/cocos2d-x debug info(12345): OpenGL version: OpenGL ES 3.2 I/Java_org_cocos2dx_lib_Cocos2dxRenderer(12345): nativeInit called

若全程无cocos2d-x debug info,说明libcocos2dcpp.so未加载,大概率是lib/目录下 so 文件名或路径错误。

5.4 真机安装与冷启动测试:最后一道防线

很多开发者止步于“生成 APK”,但 Cocos 项目常因AndroidManifest.xml权限缺失或Application类未注册而冷启动失败。我坚持用adb install -r强制覆盖安装,并观察启动瞬间:

# 1. 安装(-r 参数允许覆盖) D:\android-sdk\platform-tools\adb.exe install -r "proj.android\bin\MyGame-debug.apk" # 2. 启动应用(获取启动 Activity 名) D:\android-sdk\platform-tools\adb.exe shell am start -n "org.cocos2dx.mygame/.AppActivity" # 3. 实时监控进程(确认是否闪退) D:\android-sdk\platform-tools\adb.exe shell ps | findstr "mygame" # 若启动后立即消失,说明 Application.onCreate() 抛异常,需回看 Logcat

提示:某些国产手机(如某米、某为)需在开发者选项中开启“USB 调试(安全设置)”和“安装未知应用”权限,否则adb install会静默失败。

从那以后我每次配完 ANT 环境,都强制走一遍这四步:解包 → 反编译 → Logcat → 真机启动。不是为了炫技,而是因为 Cocos 的 ANT 构建链太长,任何一个环节的毫米级偏差,都会在最终安装那一刻才爆发,而那时你已经忘了三天前改过的local.properties里多打了一个空格。希望帮到你。

本文还有配套的精品资源,点击获取