导语
从Unity 5.5开始,Unity Android已经开始支持Gradle构建,并逐步取代原有的Internal方式。Unity Gradle提供了更加灵活、丰富的编译配置。本文基于对Unity Gradle编译的实践上总结了相应了经验供大家参考。
Unity Gradle编译
在Unity中使用Gradle进行编译是一个常见的做法,特别是当你需要构建Android应用时。Gradle提供了更强大的构建配置和依赖管理功能,相比于Unity的默认构建系统(Internal Build System),它更灵活和可扩展。
为什么使用Gradle编译
- 依赖管理:Gradle可以轻松管理和集成第三方库和插件。
- 构建配置:Gradle提供了强大的DSL(领域特定语言)来配置构建过程。
- 多渠道打包:可以方便地配置和生成不同渠道的APK文件。
- 扩展性:可以通过Gradle插件和自定义任务扩展构建过程。
设置Unity使用Gradle编译
1. 打开Unity项目
首先,打开你的Unity项目。
2. 打开Build Settings
导航到 File > Build Settings,选择 Android 平台,然后点击 Switch Platform。
3. 配置Player Settings
在 Build Settings 窗口中,点击 Player Settings,然后在 Player Settings 窗口中进行以下配置:
- Package Name:设置你的应用包名,例如
com.example.myapp。 - Minimum API Level:选择你需要支持的最低API级别。
- Target API Level:选择你希望应用运行的目标API级别。
4. 选择Gradle作为构建系统
在 Build Settings 窗口中,找到 Build System 选项,然后选择 Gradle (new)。
5. 导出项目
点击 Export 按钮,将项目导出为Gradle项目。选择一个导出路径,然后点击 Export。
使用Gradle编译导出的项目
导出完成后,你会在指定的路径下看到一个Gradle项目。接下来,你可以使用Gradle命令行工具来编译这个项目。
1. 打开终端或命令行
导航到导出的Gradle项目的根目录。
2. 编译项目
运行以下命令来编译项目:
./gradlew assembleRelease
这个命令将会编译项目并生成一个Release版本的APK文件。如果你需要生成Debug版本,可以运行:
./gradlew assembleDebug
自定义Gradle构建脚本
导出的Gradle项目包含一些默认的构建脚本文件,你可以根据需要进行自定义。
1. build.gradle(项目级别)
这个文件包含项目级别的配置和依赖管理。
2. app/build.gradle(模块级别)
这个文件包含模块级别的配置和依赖管理。你可以在这里添加自定义的依赖和构建配置。
示例:添加依赖
假设你需要添加一个第三方库依赖,可以在 app/build.gradle 文件中添加:
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
// 添加其他依赖
}
示例:自定义构建类型
你可以在 app/build.gradle 文件中自定义构建类型,例如添加一个新的构建类型:
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
}
staging {
initWith debug
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
debuggable true
}
}
}
处理依赖冲突
在使用Gradle进行编译时,可能会遇到依赖冲突的问题。你可以通过以下方式解决:
1. 强制使用特定版本
在 app/build.gradle 文件中,可以通过 resolutionStrategy 强制使用特定版本的依赖:
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:28.0.0'
}
}
2. 排除冲突的依赖
你可以通过 exclude 关键字排除冲突的依赖:
dependencies {
implementation('com.example:library:1.0.0') {
exclude group: 'com.android.support', module: 'support-v4'
}
}
处理依赖冲突
3. 使用dependencyInsight任务
Gradle提供了一个有用的任务dependencyInsight,可以帮助你分析依赖关系并找出冲突的根源。你可以在项目根目录下运行以下命令:
./gradlew :app:dependencyInsight --configuration compileClasspath --dependency <conflicting-dependency-name>
将<conflicting-dependency-name>替换为你怀疑有冲突的依赖名称。这个命令会输出详细的依赖树,帮助你识别冲突的来源。
优化Gradle构建
为了提高构建速度和效率,你可以对Gradle构建进行一些优化:
1. 启用并行构建
在gradle.properties文件中添加以下配置以启用并行构建:
org.gradle.parallel=true
2. 启用Gradle守护进程
Gradle守护进程可以在构建之间保持活跃,从而减少启动时间。在gradle.properties文件中添加:
org.gradle.daemon=true
3. 启用配置缓存
配置缓存可以显著减少构建时间,特别是在大型项目中。在gradle.properties文件中添加:
org.gradle.configuration-cache=true
4. 使用增量编译
确保在build.gradle中启用增量编译选项:
android {
...
compileOptions {
incremental true
}
}
常见问题和解决方案
1. 构建失败:找不到符号
如果在构建过程中遇到“找不到符号”错误,通常是因为缺少依赖或依赖版本不匹配。检查build.gradle文件中的依赖配置,确保所有必要的库都已正确添加。
2. 版本不兼容
如果遇到版本不兼容问题,检查build.gradle文件中的依赖版本,并参考官方文档以确保使用兼容的版本组合。
3. 资源冲突
资源冲突通常是由于不同的库使用了相同的资源名称。你可以通过在build.gradle中使用resConfigs来指定资源配置:
android {
...
defaultConfig {
resConfigs "en", "fr"
}
}
Unity Gradle编译设置
熟悉Unity编译环境的同学,这一步就可以忽略了。关于Unity Gradle编译在IDE上有两个可以只的地方:Build Setting和Player Setting。前者主要用于选择编译方式,是传统的Internal还是新的Gradle编译方式;后者用于配置mainTemplate.gradle文件,用于自定义主工程的gradle文件。不同的Unity版本,配置mainTemplate.gradle地方可能不同。
默认情况下,Unity引擎会自带mainTemplate和libTemplate,用于生成Gradle工程。mainTemplate用于配置主工程,包括基本的applicationId,minSdkVersion,buildTools,maven仓库等。libTemplate主要用于配置库工程,也就是早期ANT格式的目录。另外一个比较简单的文件是settingsTemplate,用于配置Unity工程的sub project。这些文件可以在如下目录中找到:
/Applications/Unity{versions}/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates
自定义Gradle模板
在Gradle构建过程中,可以通过修改模板的方式改变Gradle打包配置。简单的方式就是直接到引擎的模板目录修改,但这样会破坏Unity的默认环境,可能导致一些环境破坏的问题。考虑构建环境的安全灵活,一般会选择自定义模板的方式,也就是自己写mainTemplate.gradle,并放置到工程目录,从而使得每个工程使用不同的mainTemplate。
在Player Setting中,当选中Custom Gradle Template后,Unity引擎会自动生成mainTemplate.gradle文件,并放置到Assets/Plugins/Android目录。修改这个文件的内容,就能够控制Gradle的构建。
unity引擎Gradle模板的作用
在Unity引擎中,Gradle模板主要用于自定义和配置Android项目的构建过程。Unity在导出Android项目时,会生成一个默认的Gradle构建脚本,但有时你可能需要对这个构建脚本进行自定义,以满足特定的需求。通过使用Gradle模板,你可以灵活地修改和扩展Unity生成的Gradle构建脚本。
主要作用
- 自定义构建配置:通过Gradle模板,你可以添加或修改构建配置,例如依赖库、编译选项、签名配置等。
- 集成第三方库:你可以在Gradle模板中添加第三方库的依赖,使其在构建过程中自动下载和集成。
- 配置多渠道打包:通过Gradle模板,你可以配置多渠道打包,以便生成不同版本的APK文件。
- 添加自定义任务:你可以在Gradle模板中添加自定义的Gradle任务,以便在构建过程中执行特定的操作,例如代码混淆、资源优化等。
如何使用Gradle模板
1. 启用Gradle构建
首先,你需要确保Unity项目的Android构建设置中启用了Gradle构建。可以在File -> Build Settings中选择Android平台,然后点击Build System下拉菜单,选择Gradle。
2. 创建Gradle模板文件
在Unity项目的Assets/Plugins/Android目录下创建一个名为mainTemplate.gradle的文件。如果该目录不存在,你需要手动创建。
3. 编辑Gradle模板文件
在mainTemplate.gradle文件中,你可以根据需要添加或修改Gradle配置。以下是一个示例模板:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion '29.0.3'
defaultConfig {
applicationId 'com.example.myapp'
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName '1.0'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
// 添加其他依赖
}
// 添加自定义任务
task customTask {
doLast {
println 'Executing custom task...'
}
}
preBuild.dependsOn customTask
4. 配置Unity使用Gradle模板
在Unity编辑器中,打开Edit -> Project Settings -> Player,选择Android平台,然后展开Publishing Settings。勾选Custom Gradle Template选项,这样Unity在构建时会使用你提供的mainTemplate.gradle文件。
示例:添加第三方库
假设你需要在项目中添加一个第三方库,例如Retrofit,你可以在dependencies块中添加相应的依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
}
示例:配置多渠道打包
你可以在android块中添加多渠道打包的配置:
android {
...
flavorDimensions "default"
productFlavors {
free {
dimension "default"
applicationIdSuffix ".free"
versionNameSuffix "-free"
}
paid {
dimension "default"
applicationIdSuffix ".paid"
versionNameSuffix "-paid"
}
}
}
总结
通过使用Gradle模板,Unity开发者可以灵活地自定义Android项目的构建过程。无论是添加第三方库、配置多渠道打包,还是添加自定义任务,Gradle模板都提供了强大的支持。只需在Assets/Plugins/Android目录下创建并编辑`mainTemplate.gradle
Gradle Android 配置
不同的Unity引擎,使用了不同的Gradle版本和Gradle Android版本
引擎 Gradle版本 Gradle Android版本 备注
引擎 Gradle版本 Gradle Android版本
Unity 5.x 2.x Unity 5.x Gradle版本较低,建议升级
Unity 2017 4.0.1 2.3.0 注意使用默认版本的Gradle,升级可能有Bug
Unity 2018 4.2.1 3.0.1 无
Unity 2019 4.6.0 3.0.1 无
由于Gradle版本是Unity引擎自带,较难升级,因此,相应的Gradle Android版本也受到限制。如下,可以针对不同引擎配置不同的Android Gradle
dependencies {
// Unity 2018
classpath ‘com.android.tools.build:gradle:3.0.1’
// Unity 2017
// classpath ‘com.android.tools.build:gradle:2.3.0’
// Unity 5.x
// classpath ‘com.android.tools.build:gradle:2.1.2’
}
版本问题
在Unity引擎中,不同版本的Unity可能会使用不同版本的Gradle和Android Gradle插件。这是因为Unity会随着时间的推移更新其内部的构建工具,以支持最新的Android SDK和构建系统。了解这些版本的变化对于确保项目的兼容性和构建成功非常重要。
如何查看和修改Gradle版本和Android Gradle插件版本
1. 查看当前使用的版本
当你在Unity中构建Android项目时,Unity会生成一个Gradle构建脚本。你可以通过查看生成的build.gradle文件来了解当前使用的Gradle版本和Android Gradle插件版本。
2. 修改Gradle版本和Android Gradle插件版本
你可以通过自定义Gradle模板文件来修改这些版本。以下是如何在mainTemplate.gradle文件中指定特定的Gradle版本和Android Gradle插件版本的示例。
示例:自定义Gradle模板文件
假设你希望使用Gradle 6.5和Android Gradle插件 4.0.1,你可以在mainTemplate.gradle文件中进行如下配置:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion '29.0.3'
defaultConfig {
applicationId 'com.example.myapp'
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName '1.0'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
// 添加其他依赖
}
// 添加自定义任务
task customTask {
doLast {
println 'Executing custom task...'
}
}
preBuild.dependsOn customTask
配置Unity使用自定义Gradle模板
- 在Unity编辑器中,打开
Edit -> Project Settings -> Player。 - 选择
Android平台。 - 展开
Publishing Settings。 - 勾选
Custom Gradle Template选项。
不同Unity版本的Gradle和Android Gradle插件版本
以下是一些常见的Unity版本及其默认使用的Gradle和Android Gradle插件版本:
-
Unity 2019.4 LTS
- Gradle: 5.6.4
- Android Gradle插件: 3.6.0
-
Unity 2020.3 LTS
- Gradle: 6.1.1
- Android Gradle插件: 4.0.1
-
Unity 2021.1
- Gradle: 6.8.3
- Android Gradle插件: 4.1.0
-
Unity 2021.2
- Gradle: 6.8.3
- Android Gradle插件: 4.1.0
-
Unity 2022.1
- Gradle: 7.0.2
- Android Gradle插件: 4.2.0
请注意,这些版本可能会随着Unity的更新而变化。你可以在Unity的发布说明或官方文档中找到最新的信息。
总结
在Unity中,不同版本的引擎可能会使用不同的Gradle和Android Gradle插件版本。通过自定义Gradle模板文件,你可以灵活地指定和修改这些版本,以确保项目的兼容性和构建成功。了解和管理这些版本对于Unity开发者来说是非常重要的。
Gradle版本和Android Gradle插件版本不同会导致什么问题
在使用Gradle和Android Gradle插件进行构建时,Gradle版本和Android Gradle插件版本之间的不兼容可能会导致各种问题。这些问题可能会影响构建过程、项目的稳定性以及功能的正常运行。以下是一些常见的问题及其原因:
1. 构建失败
原因
- 版本不兼容:某些版本的Android Gradle插件需要特定版本的Gradle。如果使用了不兼容的版本组合,构建过程可能会失败。
示例错误
The specified Gradle distribution 'https://services.gradle.org/distributions/gradle-6.1.1-all.zip' does not support the Android Gradle plugin version 4.2.0.
2. 插件加载失败
原因
- 插件依赖问题:Android Gradle插件依赖于特定版本的Gradle API。如果Gradle版本过低或过高,插件可能无法正确加载。
示例错误
Plugin [id: 'com.android.application', version: '4.2.0'] was not found in any of the following sources.
3. 构建脚本语法错误
原因
- API变化:Gradle和Android Gradle插件的API会随着版本更新而变化。如果构建脚本使用了不再支持的API或方法,可能会导致语法错误。
示例错误
Could not find method implementation() for arguments [com.android.support:appcompat-v7:28.0.0] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
4. 任务执行失败
原因
- 任务依赖问题:不同版本的Gradle和Android Gradle插件可能会对任务的执行顺序和依赖关系进行调整。如果任务之间的依赖关系不正确,可能会导致任务执行失败。
示例错误
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
5. 性能问题
原因
- 优化差异:不同版本的Gradle和Android Gradle插件在性能优化方面可能存在差异。如果使用了不兼容的版本组合,可能会导致构建时间变长或资源消耗增加。
6. 功能缺失或异常
原因
- 功能支持问题:某些功能或特性可能仅在特定版本的Gradle和Android Gradle插件中可用。如果版本不兼容,可能会导致这些功能无法正常使用或出现异常。
如何解决版本不兼容问题
1. 检查版本兼容性
在选择Gradle和Android Gradle插件版本时,首先要检查它们的兼容性。可以参考官方文档或发布说明来确定兼容的版本组合。
2. 更新Gradle和Android Gradle插件
确保使用最新的兼容版本。你可以在build.gradle文件中指定所需的版本:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
在gradle-wrapper.properties文件中指定Gradle版本:
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
3. 使用Gradle Wrapper
使用Gradle Wrapper可以确保项目使用特定版本的Gradle,而不依赖于开发环境中安装的Gradle版本。这样可以避免版本不兼容问题。
4. 参考官方文档和社区资源
如果遇到版本不兼容问题,可以参考官方文档、社区论坛和问题跟踪系统,寻找解决方案和最佳实践。
总结
Gradle版本和Android Gradle插件版本之间的不兼容可能会导致构建失败、插件加载失败、构建脚本语法错误、任务执行失败、性能问题以及功能缺失或异常。通过检查版本兼容性、更新到最新的兼容版本、使用Gradle Wrapper以及参考官方文档和社区资源,可以有效解决这些问题,确保项目的稳定性和构建成功。
Android Gradle插件和Gradle之间的区别和联系
Gradle和Android Gradle插件是Android项目构建过程中两个关键的工具,它们各自有不同的角色和功能,但又紧密联系在一起。理解它们之间的区别和联系对于有效地管理和构建Android项目至关重要。
Gradle
定义
Gradle是一个开源的构建自动化工具,主要用于项目的构建、依赖管理和项目生命周期的管理。它基于Groovy和Kotlin DSL(领域特定语言)编写构建脚本。
主要功能
- 构建自动化:Gradle可以自动化执行编译、测试、打包等构建任务。
- 依赖管理:Gradle可以管理项目的依赖库,自动下载和集成所需的库。
- 多项目构建:Gradle支持多项目构建,可以在一个构建中管理多个子项目。
- 任务管理:Gradle允许定义和配置自定义任务,以便在构建过程中执行特定操作。
示例
一个简单的Gradle构建脚本示例:
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
task hello {
doLast {
println 'Hello, Gradle!'
}
}
Android Gradle插件
定义
Android Gradle插件是一个专门为Android项目设计的Gradle插件,提供了构建和打包Android应用所需的特定功能和任务。它扩展了Gradle的功能,使其能够处理Android项目的特定需求。
主要功能
- Android项目配置:提供配置Android项目的DSL,包括设置应用ID、版本号、SDK版本等。
- 资源处理:处理Android项目中的资源文件,如布局、字符串、图像等。
- 编译和打包:管理Android项目的编译和打包过程,包括生成APK文件和AAB文件。
- 签名和发布:支持应用签名和发布到Google Play等应用商店。
- 多渠道打包:支持多渠道打包,生成不同版本的APK文件。
示例
一个简单的Android Gradle构建脚本示例:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.0'
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
}
区别
-
功能范围:
- Gradle:是一个通用的构建工具,适用于各种类型的项目(Java、Kotlin、Groovy等)。
- Android Gradle插件:是一个专门为Android项目设计的插件,扩展了Gradle的功能以支持Android项目的特定需求。
-
配置和DSL:
- Gradle:使用通用的Gradle DSL来配置项目和任务。
- Android Gradle插件:提供了特定的DSL来配置Android项目,如
android块中的配置项。
-
任务和功能:
- Gradle:提供了通用的任务和功能,如编译、测试、打包等。
- Android Gradle插件:提供了特定的任务和功能,如资源处理、APK生成、签名和发布等。
联系
-
依赖关系:
- Android Gradle插件依赖于Gradle来执行构建任务。它扩展了Gradle的功能,使其能够处理Android项目的特定需求。
-
集成使用:
- 在Android项目中,Gradle和Android Gradle插件通常一起使用。Gradle负责管理构建过程,而Android Gradle插件提供了处理Android项目所需的特定功能。
-
版本兼容性:
- Android Gradle插件的某些版本需要特定版本的Gradle才能正常工作。确保这两者之间的版本兼容性是构建成功的关键。通常,Android Gradle插件的发布说明中会明确指出所需的Gradle版本。
版本兼容性示例
假设你使用的是Android Gradle插件版本4.2.0,那么你需要确保使用兼容的Gradle版本。以下是一个示例配置:
build.gradle(项目级别)
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
在这个示例中,Android Gradle插件4.2.0与Gradle 6.8.3是兼容的组合。
如何检查和解决版本兼容性问题
-
参考官方文档:
- Android Gradle插件的官方文档和发布说明通常会列出与每个插件版本兼容的Gradle版本。确保查阅这些文档以选择正确的版本组合。
-
使用Gradle Wrapper:
- 使用Gradle Wrapper可以确保项目使用特定版本的Gradle,而不依赖于开发环境中安装的Gradle版本。这样可以避免版本不兼容问题。
-
更新到最新版本:
- 如果遇到版本不兼容问题,尝试更新到最新的兼容版本。通常,较新的版本会包含错误修复和性能改进。
-
查看错误信息:
- 如果构建失败,查看错误信息通常可以帮助你确定是哪个版本不兼容。错误信息中通常会包含有关版本不兼容的详细说明。
总结
Gradle和Android Gradle插件在Android项目的构建过程中扮演着不同但互补的角色。Gradle是一个通用的构建工具,负责管理构建过程和依赖,而Android Gradle插件扩展了Gradle的功能,提供了处理Android项目所需的特定功能和任务。
理解它们之间的区别和联系,以及如何确保它们的版本兼容性,对于成功构建和管理Android项目至关重要。通过参考官方文档、使用Gradle Wrapper、更新到最新版本以及查看错误信息,你可以有效地解决版本不兼容问题,确保项目的稳定性和构建成功。
Unity Gradle源码编译是如何拷贝源码和依赖项的
在Unity中使用Gradle进行源码编译时,Unity会将项目的源码和依赖项拷贝到导出的Gradle项目中。这个过程涉及多个步骤,包括资源和库的复制、Gradle构建脚本的生成等。以下是详细的步骤和机制:
1. 导出Unity项目为Gradle项目
首先,你需要在Unity中将项目导出为Gradle项目。这个过程会生成一个包含所有必要文件和配置的Gradle项目。
步骤:
- 打开Unity项目。
- 导航到
File > Build Settings。 - 选择
Android平台,然后点击Switch Platform。 - 在
Build Settings窗口中,选择Build System为Gradle (new)。 - 点击
Export按钮,选择导出路径,然后点击Export。
2. 生成Gradle项目结构
Unity会在指定的导出路径下生成一个Gradle项目结构。这个结构通常包括以下文件和目录:
build.gradle:项目级别的Gradle构建脚本。settings.gradle:包含项目设置的文件。gradle.properties:Gradle属性文件。app/:包含应用模块的目录。src/:包含应用源码的目录。libs/:包含本地库文件(如.jar和.aar文件)的目录。build.gradle:模块级别的Gradle构建脚本。
3. 拷贝源码和资源
Unity会将项目的源码和资源拷贝到导出的Gradle项目中。具体来说,Unity会将以下内容复制到app/src/main/目录下:
- 源码:Unity会将C#脚本编译为DLL文件,并将这些DLL文件复制到
app/src/main/assets/bin/Data/Managed/目录下。 - 资源:Unity会将项目中的资源文件(如图像、音频、预制件等)复制到
app/src/main/assets/目录下。 - Android资源:如果项目中包含Android资源(如
res目录中的XML文件、图像资源等),Unity会将这些资源复制到app/src/main/res/目录下。
4. 拷贝依赖项
Unity会将项目中使用的所有依赖项(如第三方库、插件等)复制到导出的Gradle项目中。具体来说,Unity会将以下内容复制到app/libs/目录下:
- .jar文件:如果项目中使用了任何
.jar文件,这些文件会被复制到app/libs/目录下。 - .aar文件:如果项目中使用了任何
.aar文件,这些文件会被复制到app/libs/目录下。
5. 生成Gradle构建脚本
Unity会生成适当的Gradle构建脚本,以确保项目可以正确编译和打包。以下是app/build.gradle文件的一个示例:
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
// 添加其他依赖
}
6. 自定义Gradle构建脚本
你可以根据需要自定义生成的Gradle构建脚本。例如,你可以在app/build.gradle文件中添加额外的依赖、配置构建类型、设置签名配置等。
示例:添加额外的依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.google.firebase:firebase-analytics:18.0.0'
}
示例:配置签名
android {
...
signingConfigs {
release {
keyAlias 'myKeyAlias'
keyPassword 'myKeyPassword'
storeFile file('myKeystore.jks')
storePassword 'myStorePassword'
```groovy
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.release
}
}
}
7. 编译和打包
完成所有配置后,你可以使用Gradle命令行工具来编译和打包项目。
编译Debug版本
在项目根目录下运行以下命令:
./gradlew assembleDebug
编译Release版本
在项目根目录下运行以下命令:
./gradlew assembleRelease
8. 处理依赖冲突和优化
在实际项目中,你可能会遇到依赖冲突或需要进一步优化构建过程。以下是一些常见的处理方法和优化技巧:
处理依赖冲突
如果遇到依赖冲突,可以使用resolutionStrategy来强制使用特定版本的依赖:
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:28.0.0'
}
}
排除冲突的依赖
你可以通过exclude关键字排除冲突的依赖:
dependencies {
implementation('com.example:library:1.0.0') {
exclude group: 'com.android.support', module: 'support-v4'
}
}
使用dependencyInsight任务
使用dependencyInsight任务来分析依赖关系并找出冲突的根源:
./gradlew :app:dependencyInsight --configuration compileClasspath --dependency <conflicting-dependency-name>
优化Gradle构建
启用并行构建、Gradle守护进程和配置缓存来提高构建速度:
# gradle.properties
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configuration-cache=true
确保在build.gradle中启用增量编译:
android {
...
compileOptions {
incremental true
}
}
总结
通过上述步骤,Unity会将项目的源码和依赖项拷贝到导出的Gradle项目中,并生成适当的Gradle构建脚本。你可以根据需要自定义这些脚本,以满足项目的特定需求。处理依赖冲突和优化构建过程将有助于你更高效地管理和编译项目。了解这些机制和技巧将帮助你更好地利用Gradle的强大功能来构建和打包Unity项目。
Unity的构建过程。在Unity构建Andorid的过程中,标准目录如下所示:
主要包括:AndroidManifest.xml,assets,libs和Library等几个特殊目录。其中AndroidManifest.xml是主工程的清单文件,当没有该文件时,Unity则使用自己默认的清单文件,并将库工程的清单文件向该文件合并。
如果工程中放置了AndroidManifest.xml,则该文件将作为默认的主工程清单文件。
assets、res、libs分别用于存放资源和jar文件,这与Android工程类似,不同之处在于Android工程有源码目录,而Unity Android工程没有源码目录。Unity会搜索非特定目录,将其中的java文件拷贝到Temp/gradleOut/src/main/java目录中,并根据Java文件所在的包名创建新的目录,用于存放源码文件:
radleOut目录已经是一个完整的Android Gradle工程,可以通过Android Studio打开。
对于库工程,也就是Assets/Plugins/Android目录的子目录,并且子目录中包含AndroidManifest.xml以及project.properties文件的目录,Unity没有并不做特殊处理,而是拷贝库工程模板到库工程目录,并重命名为build.gradle,然后将整个目录拷贝到gradleOut,作为gradle构建的sub project。如果库工程中已经包含该文件,则Unity不做任何处理,保证Gradle构建的时候使用库工程自定义的build.gradle文件。
库工程的完整拷贝也给Unity Gradle工程一个编译源码的机会,而不需要考虑Unity版本的问题。对于低于Unity 2018.2的版本,可以将源码独立到库工程:

255

被折叠的 条评论
为什么被折叠?



