@VisibleForTesting ModuleSplit mergeSingleApexShard(ImmutableList<ModuleSplit> splitsOfShard) { checkState(!splitsOfShard.isEmpty(), "A shard is made of at least one split."); Map<ZipPath, ModuleEntry> mergedEntriesByPath = new HashMap<>(); ApkTargeting splitTargeting = ApkTargeting.getDefaultInstance(); for (ModuleSplit split : splitsOfShard) { // An APEX shard is made of one master split and one multi-Abi split, so we use the latter. splitTargeting = splitTargeting.hasMultiAbiTargeting() ? splitTargeting : split.getApkTargeting(); for (ModuleEntry entry : split.getEntries()) { mergeEntries(mergedEntriesByPath, split, entry); } } // Construct the final shard. return buildShard( mergedEntriesByPath.values(), ImmutableList.of(), splitTargeting, // An APEX module is made of one module, so any manifest works. splitsOfShard.get(0).getAndroidManifest(), Optional.empty()); }
private static VariantTargeting standaloneApkVariantTargeting(ModuleSplit standaloneApk) { ApkTargeting apkTargeting = standaloneApk.getApkTargeting(); VariantTargeting.Builder variantTargeting = VariantTargeting.newBuilder(); if (apkTargeting.hasAbiTargeting()) { variantTargeting.setAbiTargeting(apkTargeting.getAbiTargeting()); } if (apkTargeting.hasScreenDensityTargeting()) { variantTargeting.setScreenDensityTargeting(apkTargeting.getScreenDensityTargeting()); } if (apkTargeting.hasMultiAbiTargeting()) { variantTargeting.setMultiAbiTargeting(apkTargeting.getMultiAbiTargeting()); } variantTargeting.setSdkVersionTargeting(sdkVersionTargeting(standaloneApk)); return variantTargeting.build(); }