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参数来逐步跟进的,踩了很多坑

 

posted @ 2022-07-24 01:01  zhou_guobao  阅读(90)  评论(0编辑  收藏  举报