文章目录
Task13: processDebugManifest
1. input/ouput
taskName:processDebugManifest
input:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/intermediates/apk_list/debug/mainApkListPersistenceDebug/apk-list.gson
input:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/out
input:/Users/apple/work/project/AndroidGradleTaskDemo/app/src/main/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/appcompat-v7-26.1.0.aar/2774ea4f1cf1e83a6ad8e8d3c8b463b6/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/constraint-layout-1.1.3.aar/f43c0ba95b6494825ed940fc4f04662b/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/animated-vector-drawable-26.1.0.aar/559112320064089dfaf6780e71d5b44f/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-vector-drawable-26.1.0.aar/c2c3ad4abfd49316f6769b8238b0f010/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-v4-26.1.0.aar/9ac5f97e8ccb24c52b7cbb6202c12ad0/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-media-compat-26.1.0.aar/53ab5ad72634f3497309a8788f3ca200/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-fragment-26.1.0.aar/7e6a4ce6591d722d47aafc36d980f8b4/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-core-utils-26.1.0.aar/4c474caa9ac1f01c4936bd96905ecacd/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-core-ui-26.1.0.aar/868eaa7e0c620cd85d72ad4f340e8bb1/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-compat-26.1.0.aar/4ec3c1c46e5bad9ac3b91f45a2afec3e/AndroidManifest.xml
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/runtime-1.0.0.aar/5b2333922ba05b1f174de51739b24d14/AndroidManifest.xml
=========================================================
output:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run
output:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/intermediates/merged_manifests/debug/processDebugManifest/merged
output:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/outputs/logs/manifest-merger-debug-report.txt
该任务是用来合并所有Manifests清单文件
2. 整体流程
3. 调用链路
整个merge重点集中在ManifestMerge2.merge方法中
4. 核心类(MergeManifests)
public class MergeManifests extends ManifestProcessorTask {
...
@Override
protected void doFullTaskAction() throws IOException {
// read the output of the compatible screen manifest.
BuildElements compatibleScreenManifests =
ExistingBuildElements.from(
InternalArtifactType.COMPATIBLE_SCREEN_MANIFEST, compatibleScreensManifest);
ModuleMetadata moduleMetadata = null;
if (packageManifest != null && !packageManifest.isEmpty()) {
moduleMetadata = ModuleMetadata.load(packageManifest.getSingleFile());
boolean isDebuggable = optionalFeatures.get().contains(Feature.DEBUGGABLE);
if (moduleMetadata.getDebuggable() != isDebuggable) {
...
}
}
@Nullable BuildOutput compatibleScreenManifestForSplit;
ImmutableList.Builder<BuildOutput> mergedManifestOutputs = ImmutableList.builder();
ImmutableList.Builder<BuildOutput> irMergedManifestOutputs = ImmutableList.builder();
// FIX ME : multi threading.
// TODO : LOAD the APK_LIST FILE .....
for (ApkData apkData : outputScope.getApkDatas()) {
compatibleScreenManifestForSplit = compatibleScreenManifests.element(apkData);
// 1. 构建一个合并的清单文件;
// path:build/intermediates/merged_manifests/${buildType}/process${BuildType}Manifest/merged/AndroidManifest.xml
File manifestOutputFile =
FileUtils.join(
getManifestOutputDirectory(),
apkData.getDirName(),
SdkConstants.ANDROID_MANIFEST_XML);
File instantRunManifestOutputFile =
FileUtils.join(
getInstantRunManifestOutputDirectory(),
apkData.getDirName(),
SdkConstants.ANDROID_MANIFEST_XML);
// 2. merge AndroidManifest.xml
MergingReport mergingReport =
getBuilder()
.mergeManifestsForApplication(
getMainManifest(),
getManifestOverlays(),
computeFullProviderList(compatibleScreenManifestForSplit),
getNavigationFiles(),
getFeatureName(),
moduleMetadata == null
? getPackageOverride()
: moduleMetadata.getApplicationId(),
moduleMetadata == null
? apkData.getVersionCode()
: Integer.parseInt(moduleMetadata.getVersionCode()),
moduleMetadata == null
? apkData.getVersionName()
: moduleMetadata.getVersionName(),
getMinSdkVersion(),
getTargetSdkVersion(),
getMaxSdkVersion(),
manifestOutputFile.getAbsolutePath(),
// no aapt friendly merged manifest file necessary for applications.
null /* aaptFriendlyManifestOutputFile */,
instantRunManifestOutputFile.getAbsolutePath(),
ManifestMerger2.MergeType.APPLICATION,
variantConfiguration.getManifestPlaceholders(),
getOptionalFeatures(),
getReportFile());
XmlDocument mergedXmlDocument =
mergingReport.getMergedXmlDocument(MergingReport.MergedManifestKind.MERGED);
ImmutableMap<String, String> properties =
mergedXmlDocument != null
? ImmutableMap.of(
"packageId",
mergedXmlDocument.getPackageName(),
"split",
mergedXmlDocument.getSplitName(),
SdkConstants.ATTR_MIN_SDK_VERSION,
mergedXmlDocument.getMinSdkVersion())
: ImmutableMap.of();
mergedManifestOutputs.add(
new