Gradle 日志

前面我们讲了 Gradle 在项目组件化中的运用。这节我们学习 Gradle 的日志。日志是我们日常开发中排查问题非常重要的一个信息。如果我们打包时出现报错,我们需要通过分析构建日志从而排查问题。通过这节课的学习我们能够了解 Gradle 的日志信息有哪些级别?打包时 Gradle 报错我么那如何去查看?及一些常见错误的处理方法。

1. Gradle 的日志级别

我们在开发 Android 时我们系统有个日志输出工具类 android.util.Log,我们开发过程中调试或是排查问题可以使用这个类帮我们输出日志信息,提升我们的开发效率。为了我们能够快速的定位问题,我们知道日志信息分为不同的级别,一般我们经常用到的有 Debug , Error , Warning , Info 四个等级。同样 Gradle 的日志也是分为以下几个级别,它的各个级别对应的功能如下:

Level 主要用途
DEBUG 调试信息
INFO 信息性的消息
LIFECYCLE 进度信息
WARNING 警告信息
QUITE 重要信息
ERROR 错误信息
我们看到 Gradle 的日志信息有两个不怎么常见的级别 LIFECYCLEQUITE ,这两个日志级别一般是用于告诉我们项目构建的进度详情。我们打包时看到的控制台输出的日志信息,一些就是这两个级别的信息。

2. 过滤 Gradel 日志

我们日常开发过中编译时,在控制台看到的日志并不是所有的编译日志。我们看到的日志是 LIFECYCLE 级别及级别在它之上所有日志信息。我们执行gradle asR命令打 Release 包的日志,如下所示:

图片描述
如果我们编译时要过滤日志,我们就需要在执行命令的时候在 gradle 后面加上不同的选项,具体如下表所示:

命令 输出日志的级别
没有任何 输出 LIFECYCLE 及更高
-q 输出 QUIET 及更高
-i 输出 INFO 及更高
-d 输出 DEBUG 及更高

3. 打印自己的 Gradle 日志

如果我们要打印编译日志,我们要怎么做呢?Gradle 也为我们提供了一个 logger 属性,它是一个 Logger 实例。我们在 build.gradle 中定义一个名为 logTest 的任务,打印不同级别的日志。如下所示:

task logTest{
    doLast{
        logger.debug("This is Debug Log Message")
        logger.info("This is Info Log Message")
        logger.warn("This is Warn Log Message")
        logger.lifecycle("This is Lifecycle Log Message")
        logger.quiet("This is Quiet Log Message")
        logger.error("This is Erroe Log Message")
    }
}

我们按照上面所降到的 我们不添加任何的额外命令,直接执行gradle logTest 我们看下输出,我们会发现只输出了 LIFECYCLE 级别以上的日志:

$ gradle logTest

> Configure project :order
WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html

> Task :app:logTest
This is Warn Log Message
This is Lifecycle Log Message
This is Quiet Log Message
This is Erroe Log Message

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

那么下面我们在 gradle 后依次添加 -q 、-i 、-d 命令来过滤不同级别的日志。

3.1 gradle -q logTest

我们执行gradle -q logTest我们看到只输出了 QUIET 和 ERROR 级别的日志。如下图所示:
图片描述

3.2 gradle -i logTest

我们执行gradle -i logTest我们从下图可以看到比上一次输出了很多日志,有除了我们 定义的 DEBUG 日志没有答应别的日志都打印了,也打印了不少系统编译的日志。如下图所示:
图片描述

3.3 gradle -d logTest

我们执行gradle -d logTest这个命令可以看到控制台输出了无数的日志,绝大部分都是 DEBUG 级别的,如果不仔细,都找不到我们所需要的日志信息。这就是为什么我们需要设置日志的级别,因为我们这样可以过滤掉很多无用的日志。
图片描述

4. AS 如何查看编译报错信息

我们在编译时经常会遇到一些报错信息,但是有时候会排查很久才知道原因所在。其实编译时的信息在 Gradle 日志中我们都可以看到。当我们编译时,在 AndroidStudio 的左下角会看到如下一个 Build 按钮:
图片描述
当我们点击 Build 按钮,我们点击这个按钮就会看到具体的日志信息。

图片描述
我们就可以看到具体的错误日志了,具体我们可以搜FAILURE: Build failed with an exception.这句后面接着的就是具体的错误信息,包括出错文件及原因。我们这里看到说图片文件的名称只能是数字和小写字母,这里包含了 A 这个大写字母,所以编译的时候抛出了异常。

Tips: 当我们遇到编译报错时,我们可以在 Build 这个窗口中输入 FAILURE: Build failed with an exception. 搜索到这句信息的位置,后面紧接着的就是具体的错误信息。

5. 小结

这一节我们主要学习了 Gradle 的日志,包括 Gradle 的日志级别,Gradle 日志过滤的命令,以及如何在项目中查查看具体的报错信息。学会怎么查看 Gradle 的报错信息非常重要,可以帮助我们节省很多不必要的时间,提升我们工作中的开发效率。我们也可以通过这节的学习,在项目中加入一些自己的日志。后面我们将学习 Gradle 在 AS 中如何配置多渠道打包。