mergeDebugResources
processDebugResources
transformClassesWithDexBuilderForDebug
transformDexArchiveWithExternalLibsDexMergerForDebug
transformDexArchiveWithDexMergerForDebug
分析过程主要下面几个步骤,实现类,整体实现图,调用链路(方便以后回看代码),以及重要代码分析
4.1 generateDebugBuildConfig
4.1.1 实现类
GenerateBuildConfig
4.1.2 整体实现图
4.1.3 代码调用链路
GenerateBuildConfig.generate -> BuildConfigGenerator.generate -> JavaWriter
4.1.4 主要代码分析
在 GenerateBuildConfig 中,主要生成代码的步骤如下:
- 生成 BuildConfigGenerator
- 添加默认的属性,包括 DEBUG,APPLICATION_ID,FLAVOR,VERSION_CODE,VERSION_NAME
- 添加自定义属性
- 调用 JavaWriter 生成 BuildConfig.java 文件
// GenerateBuildConfig.generate()
@TaskAction
void generate() throws IOException {
// …
BuildConfigGenerator generator = new BuildConfigGenerator(
getSourceOutputDir(),
getBuildConfigPackageName());
// 添加默认的属性,包括 DEBUG,APPLICATION_ID,FLAVOR,VERSION_CODE,VERSION_NAME
generator
.addField(
“boolean”,
“DEBUG”,
isDebuggable() ? “Boolean.parseBoolean(“true”)” : “false”)
.addField(“String”, “APPLICATION_ID”, ‘"’ + appPackageName.get() + ‘"’)
.addField(“String”, “BUILD_TYPE”, ‘"’ + getBuildTypeName() + ‘"’)
.addField(“String”, “FLAVOR”, ‘"’ + getFlavorName() + ‘"’)
.addField(“int”, “VERSION_CODE”, Integer.toString(getVersionCode()))
.addField(
“String”, “VERSION_NAME”, ‘"’ + Strings.nullToEmpty(getVersionName()) + ‘"’)
.addItems(getItems()); // 添加自定义属性
List flavors = getFlavorNamesWithDimensionNames();
int count = flavors.size();
if (count > 1) {
for (int i = 0; i < count; i += 2) {
generator.addField(
“String”, “FLAVOR_” + flavors.get(i + 1), ‘"’ + flavors.get(i) + ‘"’);
}
}
// 内部调用 JavaWriter 生成 java 文件
generator.generate();
}
4.2 mergeDebugResources
4.2.1 实现类
MergeResources
4.2.2 整体实现图
4.2.3 调用链路
MergeResources.doFullTaskAction -> ResourceMerger.mergeData -> MergedResourceWriter.end -> QueueableAapt2.compile -> Aapt2QueuedResourceProcessor.compile -> AaptProcess.compile -> AaptV2CommandBuilder.makeCompile
4.2.4 主要代码分析
MergeResources 这个类,继承自 IncrementalTask,按照前面说的阅读增量 Task 代码的步骤,依次看三个方法的实现:isIncremental,doFullTaskAction,doIncrementalTaskAction
- isIncremental
// 说明 Task 支持增量
protected boolean isIncremental() {
return true;
}
- doFullTaskAction
- 通过 getConfiguredResourceSets() 获取 resourceSets,包括了自己的 res/ 和 依赖库的 res/ 以及 build/generated/res/rs
// MergeResources.doFullTaskAction()
List resourceSets = getConfiguredResourceSets(preprocessor);
- 创建 ResourceMerger
// MergeResources.doFullTaskAction()
ResourceMerger merger = new ResourceMerger(minSdk);
- 创建 QueueableResourceCompiler,因为 gradle3.x 以后支持了 aapt2,所以这里有两种选择 aapt 和 aapt2。其中 aapt2 有三种模式,OutOfProcessAaptV2,AaptV2Jni,QueueableAapt2,这里默认创建了 QueueableAapt2,resourceCompiler = QueueableAapt2
// MergeResources.doFullTaskAction()
// makeAapt 中会判断使用 aapt 还是 aapt2,这里以 aapt2 为例,返回的是 QueueableAapt2 对象
QueueableResourceCompiler resourceCompiler =
makeAapt(
aaptGeneration,
getBuilder(),
fileCache,
crunchPng,
variantScope,
getAaptTempDir(),
mergingLog)
- 将第一步获取的 resourceSet 加入 ResourceMerger 中
for (ResourceSet resourceSet : resourceSets) {
resourceSet.loadFromFiles(getILogger());
merger.addDataSet(resourceSet);
}
- 创建 Merg