Android Gradle相关
Gradle
它是一个通用的构建工具,运行在JVM上,其内部核心模型是由各个TASK组成的有向无环图
通俗一些:我就是一个框架,你们大家可以借助创建Plugin来告诉我具体的编译任务。Android Gradle Plugin就是其中一个典型的例子
1. Android Gradle Plugin
简称AGP,由Android Google团队开发和维护,借助实现一个Gradle-Plugin的方式,来完成将Android项目的源码编译成APK
2. Gradle的生命周期
可以分为三个阶段,初始化,配置,任务执行
也可以分为五个阶段,具体见源码Stage
private enum Stage { LoadSettings, Configure, TaskGraph, RunTasks, Finished; }
关于各个阶段干了什么事情,
- 可以在网上搜索一些文章,总结的比较详细;
- 也可以借助org.gradle.api.invocation.Gradle#addBuildListener,在各个阶段增加日志输出,再结合--info,也比较容易推断出各阶段的工作内容;这个代码最好放在$user/.gradle/init.gradle中,因为初始化的起点是这里
3. Gradle Wrapper
这个是每个Gradle项目都包涵的,我理解它是一个包装器。
我们在运行Gradle的时候是需要下载对应的Gradle压缩包的,体积较大约100M+。
借助wrapper,我们只需要告知version和url等信息,就可以在第一次运行的时候自信下载对应版本的gradle包
4. 关于Gradle Properties
定义参数用的。
相关Properties文件:
- $user/.gradle/gradle.properties 作用域全部项目,自动加载
- project/gradle.propertie 作用域当前项目,自动加载
- project/local.properties 需要额外开发代码加载,通常由Android Studio创建,不进入git管理
- 命令中加参数 - P 作用域当前项目,自动加载
5. 依赖库的版本号
gradle项目中支持依赖第三方库,很容易出现不同的组件依赖了一个组件的不同版本号
它在编译过程中,获取调整依赖的版本号。选择的策略是版本号最大的优先,除非项目中添加了一些force的策略
默认情况下,it will select the highest one
一些小技巧
1. 如何禁用Transform
Transform,是AGP提供的一种可以修改编译数据(class文件、Jar包)的方式,它会被转化成对应的TASK。
而每个TASK都会有独立的输入目录和输出目录,即使你不做任何修改,也会导致编译数据拷贝一份。
在编译速度优化中这个是重要的优化点。
在无法避免apply的情况下,如何禁用呢? 具体策略是通过反射修改BaseExtension内部变量_transforms,
_transforms,它是一个集合,其内部保存了当前Project在初始化过程中加载的所有Transform。将目标从集合中移除即可
代码示例 实践可用
2. 动态修改Properties参数
这个值,已经在project/gradle.properties中存在了,但是你想要在某种变体中修改它。
关键的地方是在什么时机修改它和如何修改它
// 根目录下的build.gradle中添加 allprojects { ext["Resources222"] = true }
这其中涉及到的具体原因的话,其实是需要梳理一下properties文件是在什么时候加载的?加载之后如何获取到?
我这边之前是在跟踪android.precompileDependenciesResources参数来逐步跟进的,踩了很多坑