下载源码
源码放在目录/media/zen/material/android-studio-dev里
$ mkdir studio-master-dev
$ cd studio-master-dev
$ repo init -u https://android.googlesource.com/platform/manifest -b studio-master-dev
$ repo sync -c -j4 -q
编译Gradle Plugin
所有项目都在一个多模块Gradle项目设置中构建在一起,Gradle Plugin项目根目录是tools /。
执行如下命令
$ ./gradlew :publishAndroidGradleLocal
包的版本号在tools/buildSrc/base/version.properties定义,有的包用baseVersion,比如com.android.tools; 有的包用buildVersion,比如com.android.tools.build:gradle。
com.android.tools.build:gradle 对应的 out/repo/com/android/tools/build/gradle目录下,即有个 4.1.1/ gradle-4.1.1.jar,其代码在tools/base/build-system/gradle-core。
buildscript {
repositories {
maven { url '/media/zen/material/android-studio-dev/out/repo' }
google()
jcenter()
}
dependencies {
//classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'com.android.tools.build:gradle:4.1.1'
}
}
allprojects {
repositories {
maven { url '/media/zen/material/android-studio-dev/out/repo' }
google()
jcenter()
}
}
Task 分析
./src/main/java/com/android/build/gradle/tasks
./src/main/java/com/android/build/gradle/internal/tasks
关注下面两个方法的调用:
fun computeTaskName(prefix: String, suffix: String): String
fun computeTaskName(prefix: String): String
这两个方法定义tools/base/build-system/gradle-core
src/main/java/com/android/build/api/component/impl/ComponentPropertiesImpl.kt
//or
src/main/java/com/android/build/gradle/internal/component/BaseCreationConfig.kt
src/main/java/com/android/build/gradle/internal/tasks/factory/TaskActions.kt
AppPlugin / LibraryPlugin BasePlugin.apply BasePlugin.basePluginApply com/android/build/gradle/internal/plugins/BasePlugin.createTasks / BasePlugin<,>.runAfterEvaluate TransformManager.createAndroidTasks TransformManager.createTasks
TransformManager.createPostCompilationTasks / LibraryTaskManager.doCreateTasksForVariant TransformManager.addTransform -> TaskConfigAction.configure
Plugin 声明
[Java Gradle Plugin] (docs.gradle.org/current/use…)
tools/base/build-system/gradle-core/build.gradle
apply plugin: 'java-gradle-plugin'
gradlePlugin {
testSourceSets sourceSets.apiTest
plugins {
androidApplication {
id = 'com.android.application'
implementationClass = 'com.android.build.gradle.AppPlugin'
}
}
}
... ...
group = 'com.android.tools.build'
archivesBaseName = 'gradle'
version = rootProject.ext.buildVersion
- tools/base/build-system/gradle-core/src/main/resources/META-INF/gradle-plugins/android-library.properties implementation-class=com.android.build.gradle.LibraryPlugin
- tools/base/build-system/gradle-core/src/main/resources/META-INF/gradle-plugins/com.android.library.properties implementation-class=com.android.build.gradle.LibraryPlugin
| Plugin | Class | Properties |
|---|---|---|
| com.android.library | com.android.build.gradle.LibraryPlugin | android-library.properties |
| com.android.library | com.android.build.gradle.internal.plugins.LibraryPlugin | com.android.internal.library.properties |
| com.android.application | com.android.build.gradle.internal.plugins.AppPlugin | com.android.internal.application.properties |
| com.android.application | com.android.build.gradle.AppPlugin | com.android.application.properties android.properties |
其实com.android.build.gradle.LibraryPlugin 和 com.android.build.gradle.AppPlugin 并没有实现Plugin的具体功能,而是把plugin分别委托给 com.android.internal.library 和 com.android.internal.application plugin,即com.android.internal.library.properties 和 com.android.internal.application.properties 指定的plugin。
- Class 目录
tools/base/build-system/gradle-core/src/main/java/ - 编译的 properties 在目录
out/build/base/build-system/gradle-core/build/resources/main/META-INF/gradle-plugins/
当在module使用 apply plugin: 'com.android.application' 的时候会通过上面properties中定义的implementation-class的值找到com.android.build.gradle.AppPlugin,之后调用其中的void apply(Project project);此处对于android项目,会把MethodTimerTransform注册到project中,你在当前的Module中的Tasks中可以找到 apply plugin->plugin properties->apply()->transfor()
com.android.ide.common.gradle.model.level2.IdeLibraryFactory
org.gradle.api.Plugin
- BasePlugin.apply
- BasePlugin.basePluginApply
- BasePlugin.configureExtension
- AppPlugin.registerModelBuilder
- com.android.build.gradle.internal.ide.ModelBuilder::buildAndroidProject
BasePlugin.configureProject
... ...
// Apply the Java plugin
project.getPlugins().apply(JavaBasePlugin.class);
dslServices =
new DslServicesImpl(
projectServices,
new DslVariableFactory(syncIssueReporter),
sdkComponentsBuildService);
... ...
| Plugin | TaskManager |
|---|---|
| com.android.build.gradle.internal.plugins.AppPlugin | com/android/build/gradle/internal/tasks/ApplicationTaskManager.kt |
| com.android.build.gradle.internal.plugins.LibraryPlugin | com/android/build/gradle/internal/LibraryTaskManager.java |
ApplicationTaskManager 和 LibraryTaskManager 继承 com.android.build.gradle.internal.TaskManager.
Task
ManifestMerger2 合并 app 和 库的Androidmanifest.xml 文件。
build-system/gradle-core/src/main/java/com/android/build/gradle/internal/plugins/BasePlugin.java
public final void apply(@NonNull Project project)
private void basePluginApply(@NonNull Project project)
private void createTasks()
final void createAndroidTasks()
build-system/gradle-core/src/main/java/com/android/build/gradle/internal/TaskManager.java
public void createTasks()
private void createTasksForVariant(
@NonNull ComponentInfo<VariantT, VariantPropertiesT> variant,
@NonNull List<ComponentInfo<VariantT, VariantPropertiesT>> variants)
build-system/gradle-core/src/main/java/com/android/build/gradle/internal/tasks/ApplicationTaskManager.kt
override fun doCreateTasksForVariant(
variant: ComponentInfo<ApplicationVariantImpl, ApplicationVariantPropertiesImpl>,
allVariants: MutableList<ComponentInfo<ApplicationVariantImpl, ApplicationVariantPropertiesImpl>>
)
build-system/gradle-core/src/main/java/com/android/build/gradle/internal/AbstractAppTaskManager.java
protected void createCommonTasks(
@NonNull ComponentInfo<VariantT, VariantPropertiesT> variant,
@NonNull List<ComponentInfo<VariantT, VariantPropertiesT>> allComponentsWithLint)
build-system/gradle-core/src/main/java/com/android/build/gradle/internal/TaskManager.java
createMergeManifestTasks
build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ProcessApplicationManifest.kt
doFullTaskAction
build-system/gradle-core/src/main/java/com/android/build/gradle/internal/tasks/manifest/ManifestHelper.kt
mergeManifestsForApplication
public MergingReport merge() throws MergeFailureException {
}
build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ProcessLibraryManifest.kt
ProcessLibRunnable.run
build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ProcessMultiApkApplicationManifest.kt
processVariantOutput