栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

Unity打包安卓apk时遇到“build gradle project”失败的问题

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity打包安卓apk时遇到“build gradle project”失败的问题

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也设置完成了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/897779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号