Gradle构建流程分析(一)- 初始化与Task创建
基于AGP3.4.2版本进行分析
获取源码
在build.gradle中添加implementation 'com.android.tools.build:gradle:3.4.2'
Sync后即可看到源码
插件入口
获取到源码后,看/META-INF/gradle-plugins/com.android.application.properties文件内容为
1 | implementation-class=com.android.build.gradle.AppPlugin |
可以看出插件“com.android.application”对应为AppPlugin.java,在同级目录下的com.android.library.properties文件
1 | implementation-class=com.android.build.gradle.LibraryPlugin |
可以看出插件“com.android.library”为LibraryPlugin.java
核心逻辑
AppPlugin
与LibraryPlugin
中并没有实现Plugin#apply()
方法,该方法是由其父类BasePlugin
实现
1 | //BasePlugin#apply() |
pluginSpecificApply
为一个抽象方法,供子类在apply()
方法中添加自定义功能。AppPlugin
中为空实现,在LibraryPlugin
中添加了一个assembleDefault
的Task。
1 | //LibraryPlugin#pluginSpecificApply() |
basePluginApply
方法为核心方法,其中处理了整个插件的初始化工作,Gradle版本、依赖检查、预设build任务完成后的清理工作等。其中最重要的是设置Extension与创建Task
1 | // BasePlugin#basePluginApply() |
其中需要重点关注3个方法configureProject()
,configureExtension()
,createTasks()
。
配置环境 - configureProject()
configureProject
中创建了下文所需的androidBuilder
、globalScope
核心类
1 | // BasePlugin#configureProject() |
创建Extension - configureExtension()
在configureExtension
中创建了Extension
,使得我们可以在build.gradle中的使用这样的代码块
1 | android{ |
Extension
详解可以参照官方文档:Gradle Plugin
1 | // BasePlugin#configureExtension() |
在configureExtension方法中,首先配置了我们经常在build.gradle中看到的一些参数,例如signingConfigs、productFlavors等,并通过whenObjectAdded
监听将填入的数据收集到variantManager中的map中。在抽象方法createExtension
中会根据子类的不同进行创建不同的Extension
。具体都是直接调用project.getExtensions().create("android",getExtensionClass(),xxxxxx)
方法进行创建,AppPlugingetExtensionClass()
返回的是BaseAppModuleExtension.class
,LibraryPlugin方法返回的是LibraryExtension.class
。
1 | // AppPlugin#getExtensionClass() |
同时,也创建了createTasks
方法中所需的参数:taskManager、variantManager。
创建Task列表-createTasks()
1 | private void createTasks() { |
在taskManager.createTasksBeforeEvaluate()
中,创建了preBuild
、lint相关的task。构建核心task是在createAndroidTasks方法中创建的。
1 |
|
1 | public List<VariantScope> createAndroidTasks() { |
1 | public void createTasksForVariantData(final VariantScope variantScope) { |
1 | // ApplicationTaskManager#createTasksForVariantScope() |
Gradle构建流程分析(一)- 初始化与Task创建