Gradle的Task和Transform
在android打包的过程中,会发现有Task
也有Transform
,那么他们是什么区别呢?
Task
一个 Task
是 Gradle
里项目构建的原子执行单元,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中去
上发顺丰大是大非|´・ω・)ノ