| — | — | — |
| preBuild | | 空 task,只做锚点使用 |
| preDebugBuild | | 空 task,只做锚点使用,与 preBuild 区别是这个 task 是 variant 的锚点 |
| compileDebugAidl | AidlCompile | 处理 aidl |
| compileDebugRenderscript | RenderscriptCompile | 处理 renderscript |
| checkDebugManifest | CheckManifest | 检测 manifest 是否存在 |
| generateDebugBuildConfig | GenerateBuildConfig | 生成 BuildConfig.java |
| prepareLintJar | PrepareLintJar | 拷贝 lint jar 包到指定位置 |
| generateDebugResValues | GenerateResValues | 生成 resvalues,generated.xml |
| generateDebugResources | | 空 task,锚点 |
| mergeDebugResources | MergeResources | 合并资源文件 |
| createDebugCompatibleScreenManifests | CompatibleScreensManifest | manifest 文件中生成 compatible-screens,指定屏幕适配 |
| processDebugManifest | MergeManifests | 合并 manifest 文件 |
| splitsDiscoveryTaskDebug | SplitsDiscovery | 生成 split-list.json,用于 apk 分包 |
| processDebugResources | ProcessAndroidResources | aapt 打包资源 |
| generateDebugSources | | 空 task,锚点 |
| javaPreCompileDebug | JavaPreCompileTask | 生成 annotationProcessors.json 文件 |
| compileDebugJavaWithJavac | AndroidJavaCompile | 编译 java 文件 |
| compileDebugNdk | NdkCompile | 编译 ndk |
| compileDebugSources | | 空 task,锚点使用 |
| mergeDebugShaders | MergeSourceSetFolders | 合并 shader 文件 |
| compileDebugShaders | ShaderCompile | 编译 shaders |
| generateDebugAssets | | 空 task,锚点 |
| mergeDebugAssets | MergeSourceSetFolders | 合并 assets 文件 |
| transformClassesWithDexBuilderForDebug | DexArchiveBuilderTransform | class 打包 dex |
| transformDexArchiveWithExternalLibsDexMergerForDebug | ExternalLibsMergerTransform | 打包三方库的 dex,在 dex 增量的时候就不需要再 merge 了,节省时间 |
| transformDexArchiveWithDexMergerForDebug | DexMergerTransform | 打包最终的 dex |
| mergeDebugJniLibFolders | MergeSouceSetFolders | 合并 jni lib 文件 |
| transformNativeLibsWithMergeJniLibsForDebug | MergeJavaResourcesTransform | 合并 jnilibs |
| transformNativeLibsWithStripDebugSymbolForDebug | StripDebugSymbolTransform | 去掉 native lib 里的 debug 符号 |
| processDebugJavaRes | ProcessJavaResConfigAction | 处理 java res |
| transformResourcesWithMergeJavaResForDebug | MergeJavaResourcesTransform | 合并 java res |
| validateSigningDebug | ValidateSigningTask | 验证签名 |
| packageDebug | PackageApplication | 打包 apk |
| assembleDebug | | 空 task,锚点 |
三、如何去读 Task 的代码
在 gradle plugin 中的 Task 主要有三种,一种是普通的 task,一种是增量 task,一种是 transform,下面分别看下这三种 task 怎么去读。
如何读 Task 的代码
- 看 Task 继承的父类,一般来说,会继承 DefaultTask,IncrementalTask
- 看 @TaskAction 注解的方法,此方法就是这个 Task 做的事情
如何读 IncrementalTask
我们先看看下这个类,这个类表示的是增量 Task,什么是增量呢?是相对于 全量来说的,全量我们可以理解为调用 clean 以后第一次编译的过程,这个就是全量编译,之后修改了代码或者资源文件,再次编译,就是增量编译。
其中比较重要的几个方法如下:
public abstract class IncrementalTask extends BaseTask {
// …
@Internal
protected boolean isIncremental() {
// 是否需要增量,默认是 false
return false;
}
// 需要子类实现,全量的时候执行的任务
protected abstract void doFullTaskAction() throws Exception;
// 增量的时候执行的任务,默认是什么都不执行,参数是增量的时候修改过的文件
protected void doIncrementalTaskAction(Map<File, FileStatus> changedInputs) throws Exception {
}
@TaskAction
void taskAction(IncrementalTaskInputs inputs) throws Exception {
// 判断是否是增量
if(this.isIncremental() && inputs.isIncremental()) {
this.doIncrementalTaskAction(this.getChangedInputs(inputs));
} else {
this.getProject().getLogger().info(“Unable do incremental execution: full task run”);
this.doFullTaskAction();
}
}
// 获取修改的文件
private Map<File, FileStatus> getChangedInputs(IncrementalTaskInputs inputs) {
Map<File, FileStatus> changedInputs = Maps.newHashMap();
inputs.outOfDate((change) -> {
FileStatus status = change.isAdded()?FileStatus.NEW:FileStatus.CHANGED;
changedInputs.put(change.getFile(), status);
});
inputs.removed((change) -> {
FileStatus var10000 = (FileStatus)changedInputs.put(change.getFile(), FileStatus.REMOVED);
});
return changedInputs;
}
}
简单介绍了 IncrementalTask 之后,我们这里强调一下,如何去读一个 增量 Task 的代码,主要有四步:
- 首先这个 Task 要继承 IncrementalTask,
- 其次看 isIncremental 方法,如果返回 true,说明支持增量,返回 fals