Cocos Creator Android打包踩坑记录:Gradle配置与常见问题解决
这篇文章整理我在2021年使用Cocos Creator进行Android打包时遇到的各种坑和解决方案。当时Android Studio和Gradle版本升级频繁,很多配置都需要手动调整。
Gradle配置升级踩坑记录
修改setting.gradle配置
Android Studio升级后,setting.gradle需要修改,否则会出现模块找不到的错误。
文件路径:
1 | jsb-default/frameworks/runtime-src/proj.android-studio/setting.gradle |
修改前:
1 | include ':libcocos2dx',':game', ':instantapp' |
修改后:
1 | include ':libcocos2dx' |
说明:移除game和instantapp模块,这些是给Google Instant使用的,如果不需要可以直接屏蔽对应模块。
修改CocosAndroid.mk
文件路径:
1 | jsb-default/frameworks/runtime-src/proj.android-studio/jni/CocosAndroid.mk |
修改前:
1 | LOCAL_MODULE := cocos2djs_shared |
修改后:
1 | LOCAL_MODULE := cocos2djs |
原因:Android Studio Build时可能报错,提示找不到target “cocos2djs”。
修改app/build.gradle
修改前:
1 | android.applicationVariants.all { variant -> |
修改后(Gradle 5+写法):
1 | android.applicationVariants.all { variant -> |
关键改动:
- 将
variant.mergeAssets.doLast改为variant.mergeAssetsProvider.get().doLast - 将
into "${outputDir}/xxx"改为into outputDir.dir("xxx")
资源复制问题修复
解决Android Studio运行APK不采用最新构建内容
遇到过运行APK时未使用最新构建的Cocos内容,需要修改app/build.gradle中的删除逻辑。
原代码:
1 | delete "${buildDir}/intermediates/merged_assets/${variant.dirName}" |
改为:
1 | delete variant.mergeAssets.outputDir |
Gradle 5+写法:
1 | delete variant.mergeAssetsProvider.get().outputDir |
Lua脚本加密配置
cocos.bat路径配置
在build.gradle中配置cocos.bat的完整路径:
1 | if (OperatingSystem.current().isWindows()) { |
添加assets目录配置
1 | sourceSets.main { |
Lua编译加密配置
1 | android.applicationVariants.all { variant -> |
Gradle命令行打包
查看编译状态
1 | gradlew --status |
根据查询到的进程ID,判断是否需要终止进程。
打印详细日志
1 | gradlew assembleDebug --stacktrace |
日志文件位置
- CocosCreator.log:
C:\Users\Administrator\.CocosCreator\logs- Creator构建时的日志 - native.log: 同上目录 - 编译时的详细日志
常见问题与解决方案
Program type already present错误
错误信息:
1 | Program type already present: android.support.v4.os.ResultReceiver |
解决方案: 在gradle.properties中添加:
1 | android.useAndroidX=true |
android.support.v4.content.FileProvider报错
问题: 使用了androidx库时不小心间接使用了旧库
解决方案: 将AndroidManifest.xml中的引用修改为:
1 | // 修改前 |
库冲突排除
如果aar文件中包含重复引入的group,导致库冲突:
1 | configurations { |
Text must not be null or empty
解决方案:
- 重启Android Studio
- 选择左下角Build Variants,切换Active Build Variant(如从debug切换为release)
命令行打包时遇到:
1 | java.net.SocketException: Connection reset |
解决方案: 打开Android Studio重新同步项目后再次尝试打包。
Could not read entry错误
问题: 缓存文件被设为只读
解决方案:
- 定位到
.bin文件,取消只读属性 - 或删除项目
.gradle文件夹下所有内容,然后Clean项目
Expiring Daemon JVM heap space耗尽
在gradle.properties中添加:
1 | org.gradle.jvmargs=-Xmx2096m -XX:MaxPermSize=1048m |
Several variant outputs使用相同文件名
解决方案: 搜索xxxxx文件并删除,然后重新打包。
Disable offline mode
解决方案: 选择右侧边栏Gradle -> Toggle Offline Mode
NDK路径过长问题
错误: cocos2dx_static/scripting/js-bindings/jswrapper/v8/debugger/inspector_socket_server.o.d No such file or directory
解决方案: 将编译目录放到盘符根目录(如C盘),避免路径过长。
环境变量配置
必需的环境变量
| 变量名 | 示例值 |
|---|---|
| ANDROID_SDK_ROOT | E:\adt-bundle-windows-x86_64-20140702\sdk |
| ANDROID_NDK_HOME | C:\Users\Administrator\AppData\Local\Android\Sdk\ndk\20.0.5594570 |
| NDK_ROOT | E:\android-ndk-r9d |
| JAVA_HOME | C:\Program Files\Java\jdk1.8.0_301 |
设置特定NDK版本
如果遇到CMake版本相关问题,在app/build.gradle中移除android{ndkVersion}配置,改为通过环境变量指定。
这些是我踩过的坑,希望对你有帮助。如果遇到其他问题,可以在评论区留言,我会尽力解答。