Unity在打包安卓apk时经常会遇到build gradle project失败的情况,现将目前遇到的情况整理如下:
情况一:打包一会过后显示打包失败,并报如下错:
情况二:打包时一直卡在“build gradle project”,纹丝不动(在等待若干个小时后依然卡着,极少概率下可能打包成功)
导致这种情况出现的原因:网络不稳定,在下载Gradle版本或者该项目依赖的库文件时由于网络速度过慢导致下载失败,从而无法正常打包
解决办法: 1.主动更新Gradle版本:不同的Unity版本使用的Gradle plugin版本不一样,并且在打Android包时由于项目中某些新导入的Plugins或库文件的要求,如TopOn SDK等,需要将Gradle plugin升级到指定版本,如3.5.4及以上,此时为避免打包时网络不稳定导致打包失败,故主动升级Gradle plugin版本。
一、首先需要更改当前项目使用的gradle plugin版本:Unity2018:在Player Setting ->Publishing Settings中勾选“Custom Gradle Template”后会在“AssetsPluginsAndroid”中生成“mainTemplate.gradle”文件
打开该mainTemplate.gradle:
将以上改为目标gradle plugin版本。如本项目中要求的gradle plugin版本为3.5.4及以上,故修改这里为“3.5.4”即可。
Unity2019及以上:在Player Setting -> Publishing Settings中勾选“Custom Launcher Gradle Template” 和 “Custom Base Gradle Template”即可生成该项目的“launcherTemplate.gradle”,“baseProjectTemplate.gradle”
和Unity2018的“mainTemplate.gradle”一样,修改文件中的“com.android.tools.build:gradle:3.2.0”为“com.android.tools.build:gradle:3.5.4”即可。
PS:“com.android.tools.build:gradle:3.2.0”是当前Unity版本默认的Gradle plugin版本,随着Unity版本升级,后续的Gradle Plugin有可能也会随之改变,并非一定是“3.2.0”
二、替换Unity默认使用的Gradle版本:首先下载该gradle plugin对应的Gradle版本:
Gradle plugin与Gradle的对应关系:https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
然后下载该Gradle: Gradle | Releases
点击Complete进行下载:
下载完成后进行解压:
然后开始替换Unity默认使用的Gradle版本:
找到Unity的安装目录:EditorDataPlaybackEnginesAndroidPlayerToolsgradle
先将Unity安装目录下的lib文件夹删除,然后将之前下载的Gradle解压之后得到的lib文件夹复制粘贴在本路径下。
如此Unity默认使用的Gradle就升级完成了,在打包时则不需要再重新下载gradle plugin“3.5.4”对应的gradle。如此可以避免因为gradle升级导致的打包失败
2.检查项目的依赖项和maven地址: 打包时需要下载当前项目使用的依赖库文件,因网络问题导致下载失败首先需要查找到当前项目的依赖项:
Unity2018.4.1f1:使用自定义的“Custom Gradle Template”后可以直接在“AssetsPluginsAndroidmainTemplate.gradle”中查找到依赖项:
解析依赖:由于Unity引擎内部设置,其实会自动将依赖关系解析入“mainTemplate.gradle”中。
但也可以手动解析依赖关系:
首先确保“Patch mainTemplate.gradle”被勾选:在Assets菜单下
然后开始解析依赖:在“Assets”菜单下,
此时会将当前项目需要用到的依赖项和maven仓库添加到“mainTemplate.gradle”中:
如上在mainTemplate.gradle中添加了相关的maven仓库和依赖implementation。在打包时会自动下载该依赖库。如果网络过慢则会一直卡在“build gradle project”中。
注意:当前网络可以访问google、youtube,也并不代表可以下载对应的依赖库。有可能会因为网络或其他原因而无法下载
解决办法:将mainTemplate.gradle中的maven库全部替换成国内阿里云的镜像地址
阿里云仓库Guide:仓库服务
maven仓库替换:1.buildscript 和 allprojects 模块中的maven地址替换:
2.依赖项的maven地址替换:
例如项目中如果导入了“GooglePlayGamesPlugin-0.10.14.unitypackage”或“GoogleMobileAds-v7.0.0.unitypackage”等插件,在解析依赖完成后,自定义的mainTemplate.gradle中可能会添加新的maven仓库,为了避免打包失败或卡在“build gradle project”界面,要将新添加的google maven仓库也替换成阿里云maven地址
修改前:
修改后:
但是并非一定需要修改这里的“maven {url "https://maven.google.com"}”。例如当导入的插件是“AnyThinkUnityAds.unitypackage”时,解析依赖后:
该依赖项“com.unity3d.ads:unity-ads:4.0.0”纵然没有修改“maven {url "https://maven.google.com"}” 为“maven {url "https://maven.aliyun.com/repository/google/"}”,在国内网络中依然可以正常打包。所以是否需要修改依赖项中的maven地址则根据具体情况而定
替换后的mainTemplate.gradle完整文件如下:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
maven{ url 'https://maven.aliyun.com/repository/google/'}
maven{ url 'https://maven.aliyun.com/repository/public/'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin/'}
//google()
//jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
**BUILD_SCRIPT_DEPS**}
}
allprojects {
repositories {
maven{ url 'https://maven.aliyun.com/repository/google/'}
maven{ url 'https://maven.aliyun.com/repository/public/'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin/'}
//google()
//jcenter()
flatDir {
dirs 'libs'
}
}
}
// Android Resolver Repos Start
([rootProject] + (rootProject.subprojects as List)).each {
ext {
it.setProperty("android.useAndroidX", true)
it.setProperty("android.enableJetifier", true)
}
}
([rootProject] + (rootProject.subprojects as List)).each { project ->
project.repositories {
def unityProjectPath = $/file://$.replace("\", "/")
maven {
url "https://maven.aliyun.com/repository/google/"
}
maven {
url (unityProjectPath + "/Assets/GeneratedLocalRepo/GooglePlayGames/Editor/m2repository") // Assets/GooglePlayGames/Editor/GooglePlayGamesPluginDependencies.xml:11
}
mavenLocal()
jcenter()
mavenCentral()
}
}
// Android Resolver Repos End
apply plugin: 'com.android.application'
**APPLY_PLUGINS**
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Android Resolver Dependencies Start
implementation 'com.google.games:gpgs-plugin-support:0.10.14' // Assets/GooglePlayGames/Editor/GooglePlayGamesPluginDependencies.xml:11
implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
// Android Resolver Dependencies End
**DEPS**}
// Android Resolver Exclusions Start
android {
packagingOptions {
exclude ('/lib/arm64-v8a/*' + '*')
exclude ('/lib/armeabi/*' + '*')
exclude ('/lib/mips/*' + '*')
exclude ('/lib/mips64/*' + '*')
exclude ('/lib/x86_64/*' + '*')
}
}
// Android Resolver Exclusions End
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
multiDexEnabled true //添加此配置,是为了当代码行数超过64k的时候设置的
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]
}**SIGN**
buildTypes {
debug {
minifyEnabled **MINIFY_DEBUG**
useProguard **PROGUARD_DEBUG**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
jniDebuggable true
}
release {
minifyEnabled **MINIFY_RELEASE**
useProguard **PROGUARD_RELEASE**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
}
}**PACKAGING_OPTIONS****SPLITS**
**BUILT_APK_LOCATION**
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = true
}
}
}**SPLITS_VERSION_CODE****REPOSITORIES****SOURCE_BUILD_SETUP**
maven仓库替换完成后即可正常打包了
PS: 如何修改Unity的默认gradleTemplate?为了将Unity默认的gradle中maven库全部替换成阿里云镜像地址,彻底解决因为网络问题而导致的build失败,因此可以直接修改Unity的gradleTemplate
Unity2018:安装目录地址:EditorDataPlaybackEnginesAndroidPlayerToolsGradleTemplates
改成如下形式:
除了替换maven仓库外,还可以将gradle plugin版本修改(修改gradle plugin后也需要将gradle版本升级,可以参考上面“主动更新Gradle”的方法)。
另外可以根据需要添加如下:
如此,Unity2018的默认gradleTemplate就修改完成了。
注意:Unity安装目录下的gradleTemplate作用 —— 当在Player Setting -> Publishing Setting中勾选“Custom Gradle Template”后,Unity会自动以安装目录下“mainTemplate.gradle”为模板创建新的gradleA文件,内容与模板一致。在解析依赖关系后,会将项目中的依赖项以及maven仓库加入新创建的gradleA中。在打包时build程序会以gradleA文件为模板在项目根目录下“TempgradleOutbuild.gradle”生成build.gradle文件,打包时以build.gradle中的设置为标准。
这跟自定义c#脚本模板scriptTemplate是一样的。
如果没有自定义mainTemplate.gradle,那么打包时会以安装目录下的gradleTemplate/mainTemplate.gradle为模板将项目中的依赖项添加进来,然后全部写入新生成的build.gradle中来进行打包(安装目录下的mainTemplate.gradle并不会改变)。
所以可以将一些通用的设置直接写入gradleTemplate中,避免每次都需要重新设置,如阿里云maven仓库
Unity2018的gradleTemplate/mainTemplate.gradle修改完成后:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
maven{ url 'https://maven.aliyun.com/repository/google/'}
maven{ url 'https://maven.aliyun.com/repository/public/'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin/'}
//google()
//jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
**BUILD_SCRIPT_DEPS**}
}
allprojects {
repositories {
maven{ url 'https://maven.aliyun.com/repository/google/'}
maven{ url 'https://maven.aliyun.com/repository/public/'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin/'}
//google()
//jcenter()
flatDir {
dirs 'libs'
}
}
}
apply plugin: 'com.android.application'
**APPLY_PLUGINS**
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
multiDexEnabled true //添加此配置,是为了当代码行数超过64k的时候设置的
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]
}**SIGN**
buildTypes {
debug {
minifyEnabled **MINIFY_DEBUG**
useProguard **PROGUARD_DEBUG**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
jniDebuggable true
}
release {
minifyEnabled **MINIFY_RELEASE**
useProguard **PROGUARD_RELEASE**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
}
}**PACKAGING_OPTIONS****SPLITS**
**BUILT_APK_LOCATION**
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = true
}
}
}**SPLITS_VERSION_CODE****REPOSITORIES****SOURCE_BUILD_SETUP**
Unity2019:
安装目录:EditorDataPlaybackEnginesAndroidPlayerToolsGradleTemplates
虽然Unity2019中GradleTemplate下文件过多,但仔细查看内容后发现其实只是将Unity2018中mainTemplate.gradle的内容拆分成了:
baseProjectTemplate.gradle —— 负责buildscript,repositories
launcherTemplate.gradle —— 负责apply plugin: 'com.android.application'
mainTemplate.gradle —— 负责apply plugin: 'com.android.library'
由于修改的maven地址位于“allprojects”内,因此只需要修改“baseProjectTemplate.gradle”中的maven地址即可。
如果Unity2019项目中导入新的插件,在自定义的gradle文件中添加了新的依赖项和maven仓库,则同样查找对应的gradle文件,将新添加的maven地址替换成阿里云maven—— 只针对阿里云maven中当前已拥有的仓库,如果阿里云中没有则不要替换。阿里云maven:仓库服务
如此Unity2019的gradleTemplate也设置完成了。



