Asroads'Blog 君子不器
Cocos Creator Android原生项目升级gradle版本
发布于: 2021-01-04 更新于: 2022-11-26 分类于: game 阅读次数: 

Cocos Creator 默认打出的安卓原生包 gradle 版本是4.10.3,gradle插件版本是3.2.0,官网文档写了不要升级版本,但是很多第三方sdk 推荐的gradle 版本都比这个高,现在已经升级到2.4.3官方一直也没有升级,那么只能自己升级,当然了,正如官网文档说的,升级报错,接下来就说说如何修改,才能正确的解决这个问题。

开发环境

  • Cocos Creator 2.4.3
  • Android Studio 4.1
  • Mac环境

gradle 版本

原来版本 :4.10.3(插件3.2.0

升级后版本: 5.6.4(插件3.6.3

gradle路径:jsb-default/frameworks/runtime-src/proj.android-studio/gradle/wrapper/gradle-wrapper.properties

插件路径:jsb-default/frameworks/runtime-src/proj.android-studio/build.gradle

1
2
3
4
5
6
#Fri Oct 27 10:18:28 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

插件路径:jsb-default/frameworks/runtime-src/proj.android-studio/build.gradle

1
2
3
4
5
6
7
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'


// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}

修改后 可以通过 File–>Project Structure 查看

image-20210106182021197

image-20210106182038185

修改文件

setting.gradle 修改

原因:构建失败

路径:

1
jsb-default/frameworks/runtime-src/proj.android-studio/setting.gradle

修改前 :

1
include ':libcocos2dx',':game', ':instantapp'

修改后:

1
include ':libcocos2dx'

修改原因:不需要game,用不到 这个模块是给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

修改原因:构架报错,找不到target “cocos2djs”

app/build.gradle(资源复制丢失)

原因:构建失败

路径:

1
jsb-default/frameworks/runtime-src/proj.android-studio/app/build.gradle

修改前 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"

variant.mergeAssets.doLast {
def sourceDir = "${buildDir}/../../../../.."

copy {
from "${sourceDir}/assets"
into "${outputDir}/assets"
}

copy {
from "${sourceDir}/src"
into "${outputDir}/src"
}

copy {
from "${sourceDir}/jsb-adapter"
into "${outputDir}/jsb-adapter"
}

copy {
from "${sourceDir}/main.js"
from "${sourceDir}/project.json"
into outputDir
}
}
}

修改后:(这个方案经原作者提醒 应该改成下面的最新方案)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"

//修改 报警错误 API 'variant.getMergeAssets()' is obsolete and has been replaced with 'variant.getMergeAssetsProvider()'.It will be removed at the end of 2019.
// variant.mergeAssets.doLast {
variant.mergeAssetsProvider.get().doLast{
def sourceDir = "${buildDir}/../../../../.."
copy {
from "${sourceDir}/assets"
into "${outputDir}/assets"
into outputDir.dir("assets")
}

copy {
from "${sourceDir}/src"
into "${outputDir}/src"
into outputDir.dir("src")
}

copy {
from "${sourceDir}/jsb-adapter"
into "${outputDir}/jsb-adapter"
into outputDir.dir("jsb-adapter")
}

copy {
from "${sourceDir}/main.js"
from "${sourceDir}/project.json"
into outputDir
}
}
}

修改原因:基本上就是把 into “${outputDir}/x” 改成 into outputDir.dir(“x”)

2021-08-30 日更新

修改后:原参考文章作者 指出了最后的修改方案 这边做个搬运 大家可以按照这个方式 尝试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
copy {

        from "${sourceDir}"

        include "assets/**"

        include "res/**"

        include "src/**"

        include "jsb-adapter/**"

        into outputDir

}

作者:居安up
链接:https://www.jianshu.com/p/866f2798b98c

测试效果

App构建设置

image-20210106181230592

App预览效果

image-20210106180939738

按钮点击输出日志

image-20210106180653074

PS 如果 gradle 下载失败 可以参考我的另外一篇博客:CocosCreator导出Android项目采坑指南

相关链接: gradle 官方release版本

错误解决

如果上面一切顺利,则下面错误可以无视跳过,下面的是我本地环境遇到的问题 可能和软件版本有关系。

警告API ‘variant.getMergeAssets()’ is obsolete and has been replaced with ‘variant.getMergeAssetsProvider()’.

解决方法:variant.mergeAssets.doLast 替换为 variant.mergeAssetsProvider.get().doLast

错误:Error: Invoke-customs are only supported starting with Android O (–min-api 26)

将代码添加到app的build.gradle的android节点下

1
2
3
4
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

升级完 打release包出现的错误

1
Error:Execution failed for task ':app:lintVitalRelease'. > Invalid main APK outputs : BuildOutput{apkInfo={type=MAIN, versionCode=0, filters=[]}, path=/Users/junan/Desktop/svnall/android/youcai_android/app/release/.DS_Store, properties=}

解决方法1:

参考 Android studio 4.0 update is giving lint infrastructure error, when used with gradle 6.1.1

Android Studio Build APK没有报错,但是Generate signed apk报错

appbuild.gradle文件中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
android { 
compileSdkVersion 28
...
}

//Invoke-customs are only supported starting with Android O (--min-api 26)
android{
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
}

解决方法2:

参考 Caused by: java.lang.reflect.InvocationTargetException

解决方法:删除release目录下所有文件(这个其实是打出包的地方,因为我用了自定义修改名字,以前是支持多个包同时存在)

这样重新打包,正常出包。网上有人说打release包前,先打个debug包就好了,这个我没有测试,大家自己可以试试看。

里面并没有报是哪行代码或者哪些配置出错,搞得一脸懵。

搜索了下,基本上都是提示Java反射异常,What???之前打包都没问题,而且近期没有新增 Java 反射代码。

真是无从入手。

后面仔细看了异常日志,发现还报了这个异常:

1
2
3
4
5
6
7
8
9
10
Caused by: java.lang.RuntimeException: Invalid main APK outputs : 
EarlySyncBuildOutput(type=com.android.build.gradle.internal.scope.InternalArtifactType$APK@1c0767aa,
apkType=MAIN, filtersData=[], version=0,
output=/Users/bujinshidemao/Desktop/release/.DS_Store),
EarlySyncBuildOutput(type=com.android.build.gradle.internal.scope.InternalArtifactType$APK@1c0767aa,
apkType=MAIN, filtersData=[], version=0,
output=/Users/bujinshidemao/Desktop/release/灵感.apk),
EarlySyncBuildOutput(type=com.android.build.gradle.internal.scope.InternalArtifactType$APK@1c0767aa,
apkType=MAIN, filtersData=[], version=0,
output=/Users/bujinshidemao/Desktop/release/灵感_正式_26.apk)

初步看了下,是输出 Apk 的时候报的异常,并且关联到了之前的打包版本,于是,我采取了以下操作:

  • 删除输出路径
  • 重新打包

打包成功!

参考

--- 本文结束 The End ---