如何理解Gradle?在构建过程中的作用

本文介绍了Gradle构建工具的基本概念及其优点,展示了如何通过Gradle脚本来定义和执行任务,包括任务依赖、动态任务和守护进程等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是Gradle?

gradle是一个项目构建工具,是google官方推荐的Android项目编译工具。什么是构建工具呢?构建工具是可以让开发者以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。这个交付的软件可以是一个ZIP文件,比如,它可以被发布到某一个运行环境中。简单来讲:把源代码生成可执行程序

2.Gradle的优点

  1. 灵活性
  2. 完全控制
  3. 目标链
  4. 依赖管理
  5. 约定优于配置
  6. 多模块项目
  7. 插件扩展

Gradle构建脚本是声明式的,可读的,并且清晰地表达它们的意图。用Groovy而不是XML写代码,挥洒着Gradle基于约定构建的哲理,大大地降低构建脚本的大小而且易读。

3.开始使用Gradle

每个Gradle构建都是以一个脚本开始的,构建脚本默认的名字是build.gradle,当在shell中执行gradle命令时,Gradle会寻找名字是build.gradle的文件,如果找不到就会显示一个帮助信息。

下面我们在一个项目根目录下的build.gradle下实践:



在文件中,定义一个独立的原子性工作,在上面的例子中:task在Gradle就是一个任务,而上面的任务就是将hello world打印出来。下面在Terminal 执行gradle hello:

注意:要配置gradle路径请自行网上的方法

从上面的结果可以看出,当运行脚本时,就会看到输出“hello world”

另外,我们可以使用gradle -q hello命令来加快运行速度:


通过-q定义可选命令行选项quiet,告诉Gradle只输出task相关的信息。

task和action是groovy这门语言的重要元素,名字为doLast的action几乎自表达了它的含义。它是task执行的最后一个action。Gradle还允许使用一种更为精简的方式来指定相同的逻辑。使用左移符号<<来简单地代表doLast。


下面使用更高级的特性


代码中引用了关键字dependsOn来说明task之间的依赖。Gradle会确保被依赖的task总会在定义该依赖的task之前执行。实际上,dependsOn是task的一个方法,另外Gradle有一个特性就是很好地和Ant去集成,因为拥有对Groovy语言特性的完全访问权,所以用write()方法来打印信息 ,这个方法非常方便在task中使用,每个脚本都带有一个ant属性赋予了直接访问Ant任务的能力,在上面的例子中,可以使用Ant的任务echo去打印"Gradle"。

另外Gradle提供的一个特性就是定义动态task,就是指可以在运行中指定任务的名字。在上诉列子中,使用了Groovy的times方法创建了3个task。Groovy自动暴露一个隐式变量it来指定循环迭代的次数,可以使用这个计数器来构建task的名字,对于第一次的循环task就叫做mGradle0。

下面运行gradle groupTherapy:


从上面结果可以看出:


4.使用Gradle的命令行

1.执行gradle -q tasks :列出项目中所有可用的task


这时候会有疑问,在构建脚本中定义的其他task去哪了。

2.执行gradle -q tasks --all列出项目内所有的task信息

在Other tasks中在这里可以找到groupTherapy,mGradle0,mGradle1,mGradle2和startTaskone


5.任务的执行

在上诉例子中,都是通过命令gradle添加一个参数来执行指定的任务,Gradle的命令行实现会确保任务和它们的所有依赖都被执行,自己也可以在命令行通过参数定义,一次执行多个任务,例如:执行gradle mGradle0 groupTherapy会先执行mGradle0,然后执行groupTherapy。


任务都是通常只执行一次,无论是在命令行中指定还是作为另一个任务的依赖。

任务名字缩写

gradle另外一个特性就是能以驼峰式的缩写在命令行上运行任务,例如在上诉例子中:执行gradle mG0 gT即可得到上诉运行的结果。


在上面的截图中可得知是没问题的。

*注意

如果定义两个缩写都相同的task的时候就会出错 例如:

在build.gradle多定义一个task名为gouTest


现在运行gradle mG0 gT:

导致下面的错误:


执行时排除任务

有时候想要在构建运行时排除一个指定任务,这时候可以通过命令行-x来实现。假设现在需要排除mGradle0:


命令行选项

gradle xxxx -is 或者gradle xxxx-i-s :打印出在执行期间发生错误时的堆栈踪迹信息

gradle xxxxx --help:打印出所有可用的命令行选项,描述信息

gradle -b xxx.gradle:可以执行一个特定的名字的构建脚本

gradle xxxx --offline:离线模式运行构建,仅仅在本地缓存检查依赖是否存在

守护进程

当你日常工作都要跟Gradle打交道的时候,你会发现你需要不断的重复构建,这时候你发现效率是极其重要,每次初始化一个构建时,JVM都要启动一次,Gradle的依赖都要载入到类加载器中,而且还要建立项目对象模型,这个过程需要一段时间,这时候Gradle守护进程就是为了解决这个问题

什么是Gradle守护进程呢?

Gradle守护进程就是以后台的方式运行Gradle,gradle命令就会在后续的构建之中重用之前创建的进程,以避免启动时造成的开销。

如何启动守护进程呢?

在运行gradle命令时加上 -- daemon选项。一旦启动你可以去看系统进程表:

Max OS X和linux:在shell中运行命令ps | grep gradle

windows:通过打开任务管理器去查看

这时候实践一下:

gradle mG0 gT --daemon


这时候查看任务管理器:


可以发现守护进程在进行中,注意:守护进程会在3小时空闲时间自动过期。任何时候你都可以选择执行构建不使用守护进程,加上--no--daemon即可。如果手动停止守护进程,执行gradle --stop命令即可。


下面展示如何在构建apk中,在AndroidManifest.xml添加meta-data,用Gradle脚本来自动完成:


第一种方法:

在app下的build.gradle编写:

提前导入:

import groovy.xml.*


然后在Terminal下输入:


打包后查看AndroidManifest.xml


即可成功。

第二种方法:

导入impor这两个类:
import com.android.build.gradle.api.ApplicationVariant

import groovy.xml.XmlUtil


同样也是可以的

<think>我们正在解决旧版Unity(如5.x)中调试Gradle构建过程的问题。由于Unity 5.x使用的是较老的Gradle版本(如2.14.1),且构建过程较为封闭,因此需要一些特殊手段来调试。 关键思路:通过获取详细的构建日志来定位问题,并可能通过命令行手动执行Gradle构建来调试。 步骤: 1. **启用详细日志输出** 在Unity中,我们可以通过修改构建命令来获取更详细的日志。但是Unity 5.x并没有直接提供图形界面的开关,因此我们需要通过命令行参数或环境变量来设置。 在构建之前,设置环境变量`GRADLE_OPTS`来增加日志级别: ```bash # 对于Windows set GRADLE_OPTS="-Dorg.gradle.logging.level=debug" # 对于macOS/Linux export GRADLE_OPTS="-Dorg.gradle.logging.level=debug" ``` 然后启动Unity,再进行构建。这样Gradle构建日志会非常详细。 2. **查看Unity控制台日志** Unity构建过程中,Gradle的日志会输出到Unity控制台。但是默认情况下,Unity只会显示部分日志。我们可以通过以下方式查看完整日志: - 在Unity编辑器中,打开控制台窗口(Window > Console) - 构建失败时,控制台会显示错误信息,点击错误信息下方的“详细信息”按钮可以展开完整日志。 3. **手动执行Gradle构建(推荐)** 如果Unity构建失败,我们可以尝试手动执行Gradle构建,这样更容易看到错误信息。 步骤: - 在Unity的Build Settings中,勾选“Export Project”,然后点击“Export”按钮,导出一个Android Studio工程。 - 打开命令行,进入导出的工程目录。 - 运行Gradle命令(注意:要使用之前配置的Gradle 2.14.1): ```bash # 进入工程目录 cd <导出路径> # 清理构建 gradlew clean # 构建Debug包 gradlew assembleDebug ``` 如果构建过程中出现错误,命令行会输出详细的错误信息。 4. **分析Gradle构建扫描报告(适用于Gradle 2.14.1)** 虽然Gradle 2.14.1不支持现代的构建扫描(Build Scan)功能,但我们可以通过生成HTML报告来查看依赖关系等: ```bash gradlew dependencies > dependencies.txt gradlew tasks > tasks.txt ``` 通过分析这些报告,可以查看依赖冲突和任务执行顺序。 5. **使用Android Studio导入工程(可选)** 将导出的工程用Android Studio打开(注意使用较老的Android Studio版本,如2.3.3),然后使用Android Studio的Gradle面板执行构建,并查看错误。 6. **常见错误及解决** - **依赖冲突**:在`mainTemplate.gradle`中添加排除规则: ```gradle configurations { all*.exclude group: 'com.android.support', module: 'support-v4' } ``` - **内存不足**:在`gradle.properties`中增加内存设置: ```properties org.gradle.jvmargs=-Xmx1024m ``` 7. **调试Unity调用Gradle的启动参数** 在Unity中,可以通过修改`mainTemplate.gradle`来打印更多的系统信息: ```gradle println "Java home: " + System.getProperty('java.home') println "Gradle version: " + gradle.gradleVersion ``` 注意事项: - 确保环境变量`JAVA_HOME`指向JDK 8的安装路径。 - 确保Gradle路径没有空格或特殊字符。 通过以上步骤,可以逐步定位Gradle构建失败的原因。 相关问题: 1. 如何解决旧版Unity构建Android时的内存溢出问题? 2. 在Unity 5.x中如何正确配置ProGuard混淆? 3. Unity 5.x支持的最低Android Gradle插件版本是多少?</think>### Unity 5.x 调试 Gradle 构建过程的方法 在旧版 Unity(5.x)中调试 Gradle 构建过程,需要手动启用详细日志并分析关键输出。以下是完整解决方案: #### 核心调试步骤 1. **启用详细日志模式** 在构建前设置环境变量(Windows): ```bat :: 设置 Gradle 调试模式 set GRADLE_OPTS="-Dorg.gradle.logging.level=debug" :: 设置 Unity 详细日志 set UNITY_ANDROID_LOG_LEVEL=verbose ``` macOS/Linux 使用 `export` 替代 `set`[^1] 2. **捕获完整构建日志** 在 Unity 编辑器控制台中执行: ```csharp // 添加至编辑器脚本 public class BuildDebugger : MonoBehaviour { [MenuItem("Build/Debug Android")] static void Build() { PlayerSettings.Android.keystorePass = "your_password"; BuildPipeline.BuildPlayer( scenes, "build_output.apk", BuildTarget.Android, BuildOptions.ShowBuiltPlayer | BuildOptions.Development ); } } ``` 构建完成后: - Windows:日志路径 `%USERPROFILE%\AppData\Local\Unity\Editor\Editor.log` - macOS:`~/Library/Logs/Unity/Editor.log` 3. **关键日志分析点** 在日志中搜索以下关键字段: ```log [GRADLE] > Task :app:processDebugResources FAILED // 资源处理失败 [GRADLE] FAILURE: Build failed with an exception. // 异常堆栈 [GRADLE] * What went wrong: // 根本原因 [GRADLE] Execution failed for task ':app:mergeDebugResources' // 资源合并错误 ``` #### 手动调试技巧 1. **命令行直接执行 Gradle** 导出 Android 工程后手动构建: ```bash cd [导出路径] # 清理构建缓存 gradlew clean --stacktrace --debug # 仅执行失败任务 gradlew :app:assembleDebug --dry-run ``` 2. **依赖树分析** 生成依赖关系图定位冲突: ```bash gradlew androidDependencies > dep.txt ``` 检查冲突提示: ```diff +--- com.android.support:appcompat-v7:23.0.0 ---- com.android.support:support-v4:25.0.0! // 版本冲突 ``` 3. **模板文件调试** 在 `Assets/Plugins/Android/mainTemplate.gradle` 中添加调试代码: ```gradle android { applicationVariants.all { variant -> println("### 构建变体: " + variant.name) variant.outputs.each { output -> println("输出文件: " + output.outputFile) } } } ``` #### 常见问题诊断表 | 错误特征 | 解决方案 | |---------|---------| | `> Failed to notify build listener` | 在 `gradle.properties` 添加:`org.gradle.jvmargs=-Xmx1024m` | | `Unsupported class file major version` | 确认使用 JDK 8 而非更高版本[^1] | | `Multiple dex files define` | 在 `mainTemplate.gradle` 中添加:`multiDexEnabled true` | | `Resource linking failed` | 检查 `res/` 目录中的非法文件名(如大写字母或空格) | > ⚠️ 终极提示:对于持续失败的构建,可尝试在 `Build Settings` 中关闭 **Export Project** 选项,回退到旧版 Internal 构建系统。 --- ### 相关问题 1. 如何解析 Gradle 构建中的 `:app:transformClassesWithDexForDebug` 错误? 2. 在 Unity 5.x 中如何强制使用特定版本的 Android 支持库? 3. 旧版 Unity 构建 Android 时出现 `JNI_OnLoad` 错误如何解决? [^1]: Unity官方文档:Android插件冲突解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值