Gradle的Task和Transform

在android打包的过程中,会发现有Task也有Transform,那么他们是什么区别呢?

Task

一个 TaskGradle 里项目构建的原子执行单元,Gradle 通过将一个个Task串联起来完成具体的构建任务,每个 Task 都属于一个 Project
Gradle在构建的过程中,会构建一个TaskGraph,Task依赖图,这个依赖图会保证各个Task的执行顺序关系。

Transform

我们编译Android项目时,如果我们想拿到编译时产生的Class文件,并在生成Dex之前做一些处理,我们可以通过编写一个Transform来接收这些输入(编译产生的Class文件),并向已经产生的输入中添加一些东西。
我们可以通过Gradle插件来注册我们编写的Transform。注册后的Transform会被Gradle包装成一个Gradle Task,这个TransForm Task会在java compile Task执行完毕后运行。
也就是说,android在编译的过程中,已经将task都指定好了默认的依赖关系和执行顺序,如果想自定义task和transform则需要通过提供的register方法进行注册,这些register执行的位置是固定的,如果想要修改其他task执行之后之前的action,则直接增加doFirst 或者doLast。
Transform的使用场景
一般我们使用Transform会有下面两种场景

  • 我们需要对编译class文件做自定义的处理。
  • 我们需要读取编译产生的class文件,做一些其他事情,但是不需要修改它。

比如我们会生成或者修改代码,比如我们自己的app的插件化框架中会修改 superclass为特定的class,在插件化框架的include脚本中会做剔除操作,都是使用transform来做的,具体transform的自定义,可以参照网上其他教程,此文只简单介绍。

那我们来看下一次编译过程中有哪些task在执行

name:        preBuild 
name:        extractProguardFiles 
name:        preReleaseBuild 
name:        compileReleaseAidl 
name:        compileReleaseRenderscript 
name:        checkReleaseManifest 
name:        generateReleaseBuildConfig 
name:        prepareLintJar 
name:        mainApkListPersistenceRelease 
name:        generateReleaseResValues 
name:        generateReleaseResources 
name:        mergeReleaseResources 
name:        createReleaseCompatibleScreenManifests 
name:        processReleaseManifest 
name:        splitsDiscoveryTaskRelease 
name:        processReleaseResources 
name:        generateReleaseSources 
name:        javaPreCompileRelease 
name:        compileReleaseJavaWithJavac 
name:        compileReleaseNdk 
name:        compileReleaseSources 
name:        lintVitalRelease 
name:        mergeReleaseShaders 
name:        compileReleaseShaders 
name:        generateReleaseAssets 
name:        mergeReleaseAssets 
name:        extractTryWithResourcesSupportJarRelease 
name:        transformClassesWithStackFramesFixerForRelease 
name:        transformClassesWithDesugarForRelease 
name:        processReleaseJavaRes 
name:        transformResourcesWithMergeJavaResForRelease 
name:        transformClassesAndResourcesWithProguardForRelease 
name:        transformClassesWithMultidexlistForRelease 
name:        transformClassesWithDexForRelease 
name:        mergeReleaseJniLibFolders 
name:        transformNativeLibsWithMergeJniLibsForRelease 
name:        validateSigningRelease 
name:        packageRelease 
name:        assembleRelease 

发现从某一步开始 task变成了transform开头的,为啥呢?
其实,我们在增加自定义transform的时候,会主动转成Task,具体代码逻辑如下:

public <T extends Transform> Optional<AndroidTask<TransformTask>> addTransform(
            @NonNull TaskFactory taskFactory,
            @NonNull TransformVariantScope scope,
            @NonNull T transform,
            @Nullable TransformTask.ConfigActionCallback<T> callback) {
        
        ...

        transforms.add(transform);

        // create the task...
        AndroidTask<TransformTask> task =
                taskRegistry.create(
                        taskFactory,
                        new TransformTask.ConfigAction<>(
                                scope.getFullVariantName(),
                                taskName,
                                transform,
                                inputStreams,
                                referencedStreams,
                                outputStream,
                                recorder,
                                callback));

        return Optional.ofNullable(task);
    }

由上面代码可以知道,gradle 的Transform会主动被转为Task,并加入到gradle TaskGraph中去

这年头生活不易,人生不息,折腾不止!!!!

发表评论