深度探索 Gradle 自动化构建技术(一、Gradle 核心配置篇)

  • 1)、Full Build:全量构建,即从0开始构建。
  • 2)、Incremental build java change:增量构建Java改变,修改源代码后的构建,且之前构建过。
  • 3)、Incremental build resource change:修改资源文件后的构建,且之前构建过。

在 Gradle 4.10 版本之后便默认使用了增量编译,它会测试自上次构建以来是否已更改任何 gradle task 任务输入或输出。如果还没有,Gradle 会将该任务认为是最新的,因此跳过执行其动作。由于 Gradle 可以将项目的依赖关系分析精确到类级别,因此,此时仅会重新编译受影响的类。如果在更老的版本需要启动增量编译,可以使用如下配置:

tasks.withType(JavaCompile) {
options.incremental = true
}

15、使用循环进行依赖优化(🔥)

在 Awesome-WanAndroid 项目的 app moudle 的 build.gradle 中,有将近几百行的依赖代码,如下所示:

dependencies {
implementation fileTree(include: [‘*.jar’], dir: ‘libs’)

// 启动器
api files(‘libs/launchstarter-release-1.0.0.aar’)

//base
implementation rootProject.ext.dependencies[“appcompat-v7”]
implementation rootProject.ext.dependencies[“cardview-v7”]
implementation rootProject.ext.dependencies[“design”]
implementation rootProject.ext.dependencies[“constraint-layout”]

annotationProcessor rootProject.ext.dependencies[“glide_compiler”]

//canary
debugImplementation (rootProject.ext.dependencies[“leakcanary-android”]) {
exclude group: ‘com.android.support’
}
releaseImplementation (rootProject.ext.dependencies[“leakcanary-android-no-op”]) {
exclude group: ‘com.android.support’
}
testImplementation (rootProject.ext.dependencies[“leakcanary-android-no-op”]) {
exclude group: ‘com.android.support’
}

有没有一种好的方式不在 build.gradle 中写这么多的依赖配置?

有,就是 使用循环遍历依赖。答案似乎很简单,但是要想处理在依赖时遇到的所有情况,并不简单。下面,我直接给出相应的适配代码,大家可以直接使用。

首先,在 app 下的 build.gradle 的依赖配置如下所示:

// 处理所有的 aar 依赖
apiFileDependencies.each { k, v -> api files(v)}

// 处理所有的 xxximplementation 依赖
implementationDependencies.each { k, v -> implementation v }
debugImplementationDependencies.each { k, v -> debugImplementation v }
releaseImplementationDependencies.each { k, v -> releaseImplementation v }
androidTestImplementationDependencies.each { k, v -> androidTestImplementation v }
testImplementationDependencies.each { k, v -> testImplementation v }
debugApiDependencies.each { k, v -> debugApi v }
releaseApiDependencies.each { k, v -> releaseApi v }
compileOnlyDependencies.each { k, v -> compileOnly v }

// 处理 annotationProcessor 依赖
processors.each { k, v -> annotationProcessor v }

// 处理所有包含 exclude 的依赖
implementationExcludes.each { entry ->
implementation(entry.key) {
entry.value.each { childEntry ->
exclude(group: childEntry)
}
}
}
debugImplementationExcludes.each { entry ->
debugImplementation(entry.key) {
entry.value.each { childEntry ->
exclude(group: childEntry.key, module: childEntry.value)
}
}
}
releaseImplementationExcludes.each { entry ->
releaseImplementation(entry.key) {
entry.value.each { childEntry ->
exclude(group: childEntry.key, module: childEntry.value)
}
}
}
testImplementationExclude.each { entry ->
testImplementation(entry.key) {
entry.value.each { childEntry ->
exclude(group: childEntry.key, module: childEntry.value)
}
}
}
androidTestImplementationExcludes.each { entry ->
androidTestImplementation(entry.key) {
entry.value.each { childEntry ->
exclude(group: childEntry.key, module: childEntry.value)
}
}
}

然后,在 config.gradle 全局依赖管理文件中配置好对应名称的依赖数组即可。代码如下所示:

dependencies = [
// base
“appcompat-v7” : “com.android.support:appcompat-v7:${version[“supportLibraryVersion”]}”,

]

annotationProcessor = [
“glide_compiler” : “com.github.bumptech.glide:compiler:${version[“glideVersion”]}”,

]

apiFileDependencies = [
“launchstarter” :“libs/launchstarter-release-1.0.0.aar”
]

debugImplementationDependencies = [
“MethodTraceMan” : “com.github.zhengcx:MethodTraceMan:1.0.7”
]

implementationExcludes = [
“com.android.support.test.espresso:espresso-idling-resource:3.0.2” : [
‘com.android.support’ : ‘support-annotations’
]
]

具体的代码示例可以在 Awesome-WanAndroid 的 build.gradleconfig.gradle 上进行查看。

三、Gradle 常用命令

1、Gradle 查询命令

1)、查看主要任务

./gradlew tasks

2)、查看所有任务,包括缓存任务等等

./gradlew tasks --all

2、Gradle 执行命令

1)、对某个module [moduleName] 的某个任务[TaskName] 运行

./gradlew :moduleName:taskName

3、Gradle 快速构建命令

Gradle 提供了一系列的快速构建命令来替代 IDE 的可视化构建操作,如我们最常用的 clean、build 等等。需要注意的是,build 命令会把 debug、release 环境的包都构建出来。

1)、查看构建版本

./gradlew -v

2)、清除 build 文件夹

./gradlew clean

3)、检查依赖并编译打包

./gradlew build

4)、编译并安装 debug 包

./gradlew installDebug

5)、编译并打印日志

./gradlew build --info

6)、编译并输出性能报告,性能报告一般在构建工程根目录 build/reports/profile 下

./gradlew build --profile

7)、调试模式构建并打印堆栈日志

./gradlew build --info --debug --stacktrace

8)、强制更新最新依赖,清除构建后再构建

./gradlew clean build --refresh-dependencies

9)、编译并打 Debug 包

./gradlew assembleDebug

简化版命令,取各个单词的首字母

./gradlew aD

10)、编译并打 Release 的包

./gradlew assembleRelease

简化版命令,取各个单词的首字母

./gradlew aR

4、Gradle 构建并安装命令

1)、Release 模式打包并安装

./gradlew installRelease

2)、卸载 Release 模式包

./gradlew uninstallRelease

3)、debug release 模式全部渠道打包

./gradlew assemble

5、Gradle 查看包依赖命令

1)、查看项目根目录下的依赖

./gradlew dependencies

2)、查看 app 模块下的依赖

./gradlew app:dependencies

3)、查看 app 模块下包含 implementation 关键字的依赖项目

./gradlew app:dependencies --configuration implementation

四、使用 Build Scan 诊断应用的构建过程

在了解 Build Scan 之前,我们需要先来一起学习下旧时代的 Gradle build 诊断工具 Profile report。

1、Profile report

通常情况下,我们一般会使用如下命令来生成一份本地的构建分析报告:

./gradlew assembleDebug --profile

这里,我们在 Awesome-WanAndroid App的根目录下运行这个命令,可以得到四块视图。下面,我们来了解下。

1)、Summary

Gradle 构建信息的概览界面,用于 查看 Total Build Time、初始化(包含 Startup、Settings and BuildSrc、Loading Projects 三部分)、配置、任务执行的时间。如下图所示:

image

2)、Configuaration

Gradle 配置各个工程所花费的时间,我们可以看到 All projects、app 模块以及其它模块单个的配置时间。如下图所示:

image

3)、Dependency Resolution

Gradle 在对各个 task 进行依赖关系解析时所花费的时间。如下图所示:

image

4)、Task Execution

Gradle 在执行各个 Gradle task 所花费的时间。如下图所示:

image

需要注意的是,Task Execution 的时间是所有 gradle task 执行时间的总和,实际上 多模块的任务是并行执行的

2、Build Scan

Build Scan 是官方推出的用于诊断应用构建过程的性能检测工具,它能分析出导致应用构建速度慢的一些问题。在项目下使用如下命令即可开启 Build Scan 诊断:

./gradlew build --scan

如果你使用的是 Mac,使用上述命令时出现

zsh: permission denied: ./gradlew

可以加入下面的命给 gradlew 分配执行权限:

chmod +x gradlew

执行完 build --scan 命令之后,在命令的最后我们可以看到如下信息:

image

可以看到,在 Publishing build scan 点击下面的链接就可以跳转到 Build Scan 的诊断页面。

需要注意的是,如果你是第一次使用 Build Scan,首先需要使用自己的邮箱激活 Build Scan。如下图界面所示:

image

这里,我输入了我的邮箱 chao.qu521@gmail.com,点击 Go!之后,我们就可以登录我们的邮箱去确认授权即可。如下图所示:

image

直接点击 Discover your build 即可。

授权成功后,我们就可以看到 Build Scan 的诊断页面了。如下图所示:

image

可以看到,在界面的右边有一系列的功能 tab 可供我们选择查看,这里默认是 Summary 总览界面,我们的目的是要查看 应用的构建性能,所以点击右侧的 Performance tab 即可看到如下图所示的构建分析界面:

image

从上图可以看到,Performance 界面中除了 Build、Configuration、Dependency resolution、Task execution 这四项外,还有 Daemon、Network activity、Settings and suggestions

在 Build 界面中,共有三个子项目,即 Total build time、Total garbage collection time、Peak heap memory usage,Total build time 里面的配置项前面我们已经分析过了,这里我们看看其余两项的含义,如下所示:

  • Total garbage collection time:总的垃圾回收时间。
  • Peak heap memory usage:最大堆内存使用。

对于 Peak heap memory usage 这一项来说,还有三个子项,其含义如下:

  • 1)、PS Eden Space:Young Generation 的 Eden(伊甸园)物理内存区域。程序中生成的大部分新的对象都在 Eden 区中。
  • 2)、PS Survivor Space:Young Generation 的 Eden 的 两个Survivor(幸存者)物理内存区域。当 Eden 区满时,还存活的对象将被复制到其中一个 Survivor 区,当此 Survivor 区满时,此区存活的对象又被复制到另一个 Survivor 区,当这个 Survivor 区也满时,会将其中存活的对象复制到年老代。
  • 3)、PS Old Gen:Old Generation,一般情况下,年老代中的对象生命周期都比较长。

由于我们的目的是关注项目的 build 时间,所以,我们直接关注到 Task execution 这一项。如下图所示:

image

可以看到,Awesome-WanAndroid 项目中所有的 task 都是 Not cacheable 的。此时,我们往下滑动界面,可以看到所有 task 的构建时间。如下所示:

image

如果,我们想查看一个 tinyPicPluginSpeedRelease 这一个 task 的执行详细,可以点击 :app:tinyPicPluginSpeedRelease 这一项,然后,就会跳转到 Timeline 界面,显示出 tinyPicPluginSpeedRelease 相应的执行信息。如下图所示:

image

此外,这里我们点击弹出框右上方的第一个图标:Focus on task in timeline 即可看到该 task 在整个 Gradle build 时间线上的精确位置,如下图所示:

image

至此,我们可以看到 Build Scan 的功能要比 Profile report 强大不少,所以我强烈建议优先使用它进行 Gradle 构建时间的诊断与优化。

五、总结

Gradle 每次构建的运行时间会随着项目编译次数越来少,因此为了准确评估 Gradle 构建提速的优化效果,我们可以在优化前后分别执行以下命令进行对比分析,如下所示:

gradlew --profile --recompile-scripts --offline --rerun-tasks assembleDebug

参数含义如下:

  • profile:开启性能检测。
  • recompile-scripts:不使用缓存,直接重新编译脚本。
  • offline:启用离线编译模式。
  • return-task:运行所有 gradle task 并忽略所有优化。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

image

七大模块学习资料:如NDK模块开发、Android框架体系架构…

image

2021大厂面试真题:

image

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

[外链图片转存中…(img-jAlny9fs-1712470206956)]

七大模块学习资料:如NDK模块开发、Android框架体系架构…

[外链图片转存中…(img-ps1qlDgH-1712470206956)]

2021大厂面试真题:

[外链图片转存中…(img-dEnFSUm8-1712470206956)]

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置Maven或Gradle构建工具,可以根据以下步骤进行: ### 配置Maven 1. 下载并安装Maven,官网下载地址:https://maven.apache.org/download.cgi。 2. 配置Maven环境变量。 在系统环境变量中配置:`MAVEN_HOME`为Maven安装目录,例如`D:\apache-maven-3.6.3`;将`%MAVEN_HOME%\bin`添加到系统环境变量中的`Path`中。 3. 创建Maven项目。 在命令行中,进入到项目目录,执行以下命令: ``` mvn archetype:generate -DgroupId=com.example -DartifactId=example-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ``` 其中,`-DgroupId`指定项目的groupId,`-DartifactId`指定项目的artifactId,`-DarchetypeArtifactId`指定项目使用的模板,`-DinteractiveMode=false`表示不需要交互模式。 4. 在项目中添加依赖项。 在项目的`pom.xml`文件中,添加需要的依赖项。例如: ```xml <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> </dependencies> ``` 5. 构建项目。 在命令行中,进入到项目目录,执行以下命令: ``` mvn clean package ``` 这将编译并打包项目。 ### 配置Gradle 1. 下载并安装Gradle,官网下载地址:https://gradle.org/install/。 2. 配置Gradle环境变量。 在系统环境变量中配置:`GRADLE_HOME`为Gradle安装目录,例如`D:\gradle-6.5`;将`%GRADLE_HOME%\bin`添加到系统环境变量中的`Path`中。 3. 创建Gradle项目。 在命令行中,进入到项目目录,执行以下命令: ``` gradle init ``` 这将创建一个新的Gradle项目。 4. 在项目中添加依赖项。 在项目的`build.gradle`文件中,添加需要的依赖项。例如: ```gradle dependencies { implementation 'org.apache.poi:poi:4.1.2' implementation 'org.apache.poi:poi-ooxml:4.1.2' } ``` 5. 构建项目。 在命令行中,进入到项目目录,执行以下命令: ``` gradle build ``` 这将编译并打包项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值