Unity Gradle编译

导语
从Unity 5.5开始,Unity Android已经开始支持Gradle构建,并逐步取代原有的Internal方式。Unity Gradle提供了更加灵活、丰富的编译配置。本文基于对Unity Gradle编译的实践上总结了相应了经验供大家参考。

Unity Gradle编译

在Unity中使用Gradle进行编译是一个常见的做法,特别是当你需要构建Android应用时。Gradle提供了更强大的构建配置和依赖管理功能,相比于Unity的默认构建系统(Internal Build System),它更灵活和可扩展。

为什么使用Gradle编译

  1. 依赖管理:Gradle可以轻松管理和集成第三方库和插件。
  2. 构建配置:Gradle提供了强大的DSL(领域特定语言)来配置构建过程。
  3. 多渠道打包:可以方便地配置和生成不同渠道的APK文件。
  4. 扩展性:可以通过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构建脚本。

主要作用

  1. 自定义构建配置:通过Gradle模板,你可以添加或修改构建配置,例如依赖库、编译选项、签名配置等。
  2. 集成第三方库:你可以在Gradle模板中添加第三方库的依赖,使其在构建过程中自动下载和集成。
  3. 配置多渠道打包:通过Gradle模板,你可以配置多渠道打包,以便生成不同版本的APK文件。
  4. 添加自定义任务:你可以在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模板

  1. 在Unity编辑器中,打开Edit -> Project Settings -> Player
  2. 选择Android平台。
  3. 展开Publishing Settings
  4. 勾选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(领域特定语言)编写构建脚本。

主要功能
  1. 构建自动化:Gradle可以自动化执行编译、测试、打包等构建任务。
  2. 依赖管理:Gradle可以管理项目的依赖库,自动下载和集成所需的库。
  3. 多项目构建:Gradle支持多项目构建,可以在一个构建中管理多个子项目。
  4. 任务管理: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项目的特定需求。

主要功能
  1. Android项目配置:提供配置Android项目的DSL,包括设置应用ID、版本号、SDK版本等。
  2. 资源处理:处理Android项目中的资源文件,如布局、字符串、图像等。
  3. 编译和打包:管理Android项目的编译和打包过程,包括生成APK文件和AAB文件。
  4. 签名和发布:支持应用签名和发布到Google Play等应用商店。
  5. 多渠道打包:支持多渠道打包,生成不同版本的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'
}

区别

  1. 功能范围

    • Gradle:是一个通用的构建工具,适用于各种类型的项目(Java、Kotlin、Groovy等)。
    • Android Gradle插件:是一个专门为Android项目设计的插件,扩展了Gradle的功能以支持Android项目的特定需求。
  2. 配置和DSL

    • Gradle:使用通用的Gradle DSL来配置项目和任务。
    • Android Gradle插件:提供了特定的DSL来配置Android项目,如android块中的配置项。
  3. 任务和功能

    • Gradle:提供了通用的任务和功能,如编译、测试、打包等。
    • Android Gradle插件:提供了特定的任务和功能,如资源处理、APK生成、签名和发布等。

联系

  1. 依赖关系

    • Android Gradle插件依赖于Gradle来执行构建任务。它扩展了Gradle的功能,使其能够处理Android项目的特定需求。
  2. 集成使用

    • 在Android项目中,Gradle和Android Gradle插件通常一起使用。Gradle负责管理构建过程,而Android Gradle插件提供了处理Android项目所需的特定功能。
  3. 版本兼容性

    • 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是兼容的组合。

如何检查和解决版本兼容性问题

  1. 参考官方文档

    • Android Gradle插件的官方文档和发布说明通常会列出与每个插件版本兼容的Gradle版本。确保查阅这些文档以选择正确的版本组合。
  2. 使用Gradle Wrapper

    • 使用Gradle Wrapper可以确保项目使用特定版本的Gradle,而不依赖于开发环境中安装的Gradle版本。这样可以避免版本不兼容问题。
  3. 更新到最新版本

    • 如果遇到版本不兼容问题,尝试更新到最新的兼容版本。通常,较新的版本会包含错误修复和性能改进。
  4. 查看错误信息

    • 如果构建失败,查看错误信息通常可以帮助你确定是哪个版本不兼容。错误信息中通常会包含有关版本不兼容的详细说明。

总结

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项目。

步骤:
  1. 打开Unity项目。
  2. 导航到 File > Build Settings
  3. 选择 Android 平台,然后点击 Switch Platform
  4. Build Settings 窗口中,选择 Build SystemGradle (new)
  5. 点击 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的版本,可以将源码独立到库工程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值