编译Android Gradle Plugin

1,038 阅读2分钟

下载源码

源码放在目录/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
  1. tools/base/build-system/gradle-core/src/main/resources/META-INF/gradle-plugins/android-library.properties implementation-class=com.android.build.gradle.LibraryPlugin
  2. tools/base/build-system/gradle-core/src/main/resources/META-INF/gradle-plugins/com.android.library.properties implementation-class=com.android.build.gradle.LibraryPlugin
PluginClassProperties
com.android.librarycom.android.build.gradle.LibraryPluginandroid-library.properties
com.android.librarycom.android.build.gradle.internal.plugins.LibraryPlugincom.android.internal.library.properties
com.android.applicationcom.android.build.gradle.internal.plugins.AppPlugincom.android.internal.application.properties
com.android.applicationcom.android.build.gradle.AppPlugincom.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。

  1. Class 目录
    tools/base/build-system/gradle-core/src/main/java/
  2. 编译的 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

  1. BasePlugin.apply
    1. BasePlugin.basePluginApply
    2. BasePlugin.configureExtension
      1. AppPlugin.registerModelBuilder
      2. 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);
... ...
PluginTaskManager
com.android.build.gradle.internal.plugins.AppPlugincom/android/build/gradle/internal/tasks/ApplicationTaskManager.kt
com.android.build.gradle.internal.plugins.LibraryPlugincom/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