private SplittingPipeline createNativeLibrariesSplittingPipeline( ImmutableSet<OptimizationDimension> shardingDimensions) { return new SplittingPipeline( shardingDimensions.contains(OptimizationDimension.ABI) ? ImmutableList.of(new AbiNativeLibrariesSplitter(generate64BitShards)) : ImmutableList.of()); }
public ImmutableList<ModuleSplit> splitModule() { ImmutableList.Builder<ModuleSplit> splits = ImmutableList.builder(); // Assets splits. SplittingPipeline assetsPipeline = createAssetsSplittingPipeline(); splits.addAll(assetsPipeline.split(ModuleSplit.fromAssetBundleModule(module))); return splits.build(); }
@Test public void testAllSplittersCalled() { TrivialSplitter splitter = new TrivialSplitter(); TrivialSplitter splitter2 = new TrivialSplitter(); SplittingPipeline pipeline = new SplittingPipeline(ImmutableList.of(splitter, splitter2)); ImmutableCollection<ModuleSplit> splits = pipeline.split(baseSplit); assertThat(splitter.splitCallCount).isEqualTo(1); assertThat(splitter2.splitCallCount).isEqualTo(1); assertThat(splits).containsExactly(baseSplit); }
@Test public void testSplittersCalledInRightOrder() { DoublingSplitter splitter = new DoublingSplitter(); DoublingSplitter splitter2 = new DoublingSplitter(); SplittingPipeline pipeline = new SplittingPipeline(ImmutableList.of(splitter, splitter2)); ImmutableCollection<ModuleSplit> splits = pipeline.split(baseSplit); assertThat(splitter.splitCallCount).isEqualTo(1); assertThat(splitter2.splitCallCount).isEqualTo(2); assertThat(splits).hasSize(4); assertThat(splits).containsExactly(baseSplit, baseSplit, baseSplit, baseSplit); } }
private SplittingPipeline createAssetsSplittingPipeline() { ImmutableList.Builder<ModuleSplitSplitter> assetsSplitters = ImmutableList.builder(); if (apkGenerationConfiguration .getOptimizationDimensions() .contains(OptimizationDimension.LANGUAGE)) { assetsSplitters.add(LanguageAssetsSplitter.create()); } return new SplittingPipeline(assetsSplitters.build()); } }
private ImmutableList<ModuleSplit> generateSplits( BundleModule module, ImmutableSet<OptimizationDimension> shardingDimensions) { ImmutableList.Builder<ModuleSplit> rawSplits = ImmutableList.builder(); // Native libraries splits. SplittingPipeline nativePipeline = createNativeLibrariesSplittingPipeline(shardingDimensions); rawSplits.addAll(nativePipeline.split(ModuleSplit.forNativeLibraries(module))); // Resources splits. SplittingPipeline resourcesPipeline = createResourcesSplittingPipeline(shardingDimensions); rawSplits.addAll(resourcesPipeline.split(ModuleSplit.forResources(module))); // Apex images splits. SplittingPipeline apexPipeline = createApexImagesSplittingPipeline(); rawSplits.addAll(apexPipeline.split(ModuleSplit.forApex(module))); // Other files. rawSplits.add(ModuleSplit.forAssets(module)); rawSplits.add(ModuleSplit.forDex(module)); rawSplits.add(ModuleSplit.forRoot(module)); // Merge splits with the same targeting and make a single master split. ImmutableList<ModuleSplit> mergedSplits = new SameTargetingMerger().merge(rawSplits.build()); // Remove the splitName from any standalone apks, as these are only used for instant apps (L+). mergedSplits = mergedSplits.stream().map(ModuleSplit::removeSplitName).collect(toImmutableList()); // Check that we have only one master split. long masterSplitCount = mergedSplits.stream().filter(ModuleSplit::isMasterSplit).count(); checkState(masterSplitCount == 1, "Expected one master split, got %s.", masterSplitCount); return mergedSplits; }
private SplittingPipeline createAssetsSplittingPipeline() { ImmutableList.Builder<ModuleSplitSplitter> assetsSplitters = ImmutableList.builder(); if (apkGenerationConfiguration .getOptimizationDimensions() .contains(OptimizationDimension.LANGUAGE)) { assetsSplitters.add(LanguageAssetsSplitter.create()); } return new SplittingPipeline(assetsSplitters.build()); }
splits.addAll(resourcesPipeline.split(ModuleSplit.forResources(module, variantTargeting))); splits.addAll(nativePipeline.split(ModuleSplit.forNativeLibraries(module, variantTargeting))); splits.addAll(assetsPipeline.split(ModuleSplit.forAssets(module, variantTargeting))); splits.addAll(dexPipeline.split(ModuleSplit.forDex(module, variantTargeting)));
private SplittingPipeline createDexSplittingPipeline() { ImmutableList.Builder<ModuleSplitSplitter> dexSplitters = ImmutableList.builder(); if (apkGenerationConfiguration.getEnableDexCompressionSplitter()) { dexSplitters.add(new DexCompressionSplitter()); } return new SplittingPipeline(dexSplitters.build()); }
private SplittingPipeline createApexImagesSplittingPipeline() { // We always split APEX image files by MultiAbi, regardless of OptimizationDimension. return new SplittingPipeline(ImmutableList.of(new AbiApexImagesSplitter())); }
private SplittingPipeline createResourcesSplittingPipeline( ImmutableSet<OptimizationDimension> shardingDimensions) { return new SplittingPipeline( shardingDimensions.contains(OptimizationDimension.SCREEN_DENSITY) ? ImmutableList.of( new ScreenDensityResourcesSplitter( bundleVersion, /* pinResourceToMaster= */ Predicates.alwaysFalse())) : ImmutableList.of()); }
private SplittingPipeline createResourcesSplittingPipeline() { ImmutableList.Builder<ModuleSplitSplitter> resourceSplitters = ImmutableList.builder(); if (apkGenerationConfiguration .getOptimizationDimensions() .contains(OptimizationDimension.SCREEN_DENSITY)) { resourceSplitters.add(new ScreenDensityResourcesSplitter(bundleVersion, pinResourceToMaster)); } if (apkGenerationConfiguration .getOptimizationDimensions() .contains(OptimizationDimension.LANGUAGE)) { resourceSplitters.add(new LanguageResourcesSplitter(pinResourceToMaster)); } return new SplittingPipeline(resourceSplitters.build()); }
private SplittingPipeline createNativeLibrariesSplittingPipeline() { ImmutableList.Builder<ModuleSplitSplitter> nativeSplitters = ImmutableList.builder(); if (apkGenerationConfiguration.getEnableNativeLibraryCompressionSplitter()) { nativeSplitters.add(new NativeLibrariesCompressionSplitter(apkGenerationConfiguration)); } if (apkGenerationConfiguration .getOptimizationDimensions() .contains(OptimizationDimension.ABI)) { nativeSplitters.add( new AbiNativeLibrariesSplitter(apkGenerationConfiguration.getInclude64BitLibs())); } return new SplittingPipeline(nativeSplitters.build()); }