Gradle系列之Groovy基础
Gradle系列之Gradle基础
Gradle系列之自定义插件
Android构建流程(Android Plugin)源码解析系列一:主流程
前言
首先,不了解groovy语言,gradle基础以及编写gradle插件基础的,请先前往这个系列之前的文章补充基础,不然下面看起来会吃力。
本篇文章会从android编译插件的源码进行分析然后得出其工作原理。前面文章提到:我们编写android应用程式采用的插件是’com.android.application’,而我们编写android library采用的插件是’com.android.library’;而这两个插件分别对应的实现类是AppPlugin和LibraryPlugin(关于如何对应起来,可以查看前面的”编写自定义gradle插件”),而他们都继承自BasePlugin,因为很多核心功能,他们是相同的。
注意:本篇文章的源码是2.3.0版本,最新版本是3.0,流程有了一些变化,后面会更新3.0的变化点。
官方流程图
主流程源码解析
查看一个gradle plugin的源码,从其入口函数apply()看起就可以,下面来看BasePlugin的代码
protected void apply(@NonNull Project project) {
.......
// recode()只是记录下面方法的路径和执行的时间点,真正执行的方法是最后一个参数
// 配置项目,注册一些gradle编译过程的回调函数,以供执行具体的业务操作
threadRecorder.record(
ExecutionType.BASE_PLUGIN_PROJECT_CONFIGURE,
project.getPath(),
null,
this::configureProject);
// 配置扩展项,也就是根据当前build.gradle中配置的android{}配置项中解析出配置的数据,以供后面createTasks()使用(如果定义plugin的extension在自定义插件中有讲到)
threadRecorder.record(
ExecutionType.BASE_PLUGIN_PROJECT_BASE_EXTENSION_CREATION,
project.getPath(),
null,
this::configureExtension);
// 创建task,我们熟知的assemble、assembleDebug、assembleRelease等都是在这里创建的
threadRecorder.record(
ExecutionType.BASE_PLUGIN_PROJECT_TASKS_CREATION,
project.getPath(),
null,
this::createTasks);
......
}
主流程主要是configureProject(注册) -> configureExtension -> createTasks
下面对每个过程进行详细的分析。
configureProject()流程
private void configureProject() {
extraModelInfo = new ExtraModelInfo(project);
checkGradleVersion();
AndroidGradleOptions.validate(project);
sdkHandler = new SdkHandler(project, getLogger());
// 注册 项目评估完成的回调函数 : dependencies依赖的下载
project.afterEvaluate(p -> {
// TODO: Read flag from extension.
if (!p.getGradle().getStartParameter().isOffline()
&& AndroidGradleOptions.getUseSdkDownload(p)) {
SdkLibData sdkLibData =
SdkLibData.download(getDownloader(), getSettingsController());
dependencyManager.setSdkLibData(sdkLibData);
sdkHandler.setSdkLibData(sdkLibData);
}
});
// 创建androidBuilder,后面会用到
androidBuilder = new AndroidBuilder(
project == project.getRootProject() ? project.getName() : project.getPath(),
creator,
new GradleProcessExecutor(project),
new GradleJavaProcessExecutor(project),
extraModelInfo,
getLogger(),
isVerbose());
// dataBingding会用到
dataBindingBuilder = new DataBindingBuilder();
d