预备知识
- 理解 gradle 的基本开发
- 了解 gradle task 和 plugin 使用及开发
- 了解 android gradle plugin 的使用
看完本文可以达到什么程度
- 了解 android gradle plugin 的构建流程
- 了解 android gradle plugin 的主要 task 的实现
- 学会 hook android 构建流程,添加自己想要的功能
阅读前准备工作
- 项目添加 android gradle plugin 依赖
compile 'com.android.tools.build:gradle:3.0.1'
通过这种方式,可以直接依赖 plugin 的源码,读起来比较方便。
2. 官方对照源码地址 android gradle plugin 源码地址
大家可以直接 clone EasyGradle 项目,把 android-gradle-plugin-source/build.gradle 里的 implementation ‘com.android.tools.build:gradle:3.0.1’ 注释打开就可以了。
com.android.application 主要有下面几个流程:
一、插件启动的准备工作
在前面讲解自定义插件的时候说到过,要定义一个 xxx.properties 文件,里面声明插件的入口类,而 xxx 就是 apply plugin 时候使用的 id,这里要知道 android gradle plugin 的入口类,看 com.android.application.properties 文件就可以,内容如下:
implementation-class=com.android.build.gradle.AppPlugin
这里定义了入口是 AppPlugin,AppPlugin 继承自 BasePlugin。
AppPlugin 里没有做太多的操作,主要是重写了 createTaskManager 和 createExtension,剩下的大部分工作还是在 BasePlugin 里做的。
插件准备工作中主要做的事情:
- 检查插件版本
// method: BasePlugin.apply()
checkPluginVersion();
- 检查 module 是否重名
// method: BasePlugin.apply()
// 方法中会遍历所有子项目,判断是否有重复的 id
this.checkModulesForErrors();
- 初始化插件信息
// method: BasePlugin.apply()
PluginInitializer.initialize(project, this.projectOptions);
// 创建 Profiler 文件
ProfilerInitializer.init(project, this.projectOptions);
// profiler 信息中写入 plugin 版本
ProcessProfileWriter.getProject(project.getPath()).setAndroidPluginVersion(Version.ANDROID_GRADLE_PLUGIN_VERSION).setAndroidPlugin(this.getAnalyticsPluginType()).setPluginGeneration(PluginGeneration.FIRST);
二、配置项目
配置项目这一阶段主要做的事情:
- 检查 gradle 版本是否匹配
// method: BasePlugin.configureProject()
this.checkGradleVersion();
- 创建 AndroidBuilder和 DataBindingBuilder
- 引入 java plugin 和 jacoco plugi