public static ApkGenerationConfiguration getDefaultInstance() { return ApkGenerationConfiguration.builder().build(); }
private static ApkGenerationConfiguration withOptimizationDimensions( ImmutableSet<OptimizationDimension> optimizationDimensions) { return ApkGenerationConfiguration.builder() .setOptimizationDimensions(optimizationDimensions) .build(); }
private static ApkGenerationConfiguration withDisabled64BitLibs() { return ApkGenerationConfiguration.builder() .setInclude64BitLibs(false) .setOptimizationDimensions(ImmutableSet.of(ABI)) .build(); } }
private ApkGenerationConfiguration getCommonSplitApkGenerationConfiguration( AppBundle appBundle, BundleConfig bundleConfig, Version bundleToolVersion) { ApkOptimizations apkOptimizations = getApkOptimizations(bundleConfig); ApkGenerationConfiguration.Builder apkGenerationConfiguration = ApkGenerationConfiguration.builder() .setOptimizationDimensions(apkOptimizations.getSplitDimensions()); boolean enableNativeLibraryCompressionSplitter = apkOptimizations.getUncompressNativeLibraries(); apkGenerationConfiguration.setEnableNativeLibraryCompressionSplitter( enableNativeLibraryCompressionSplitter); if (appBundle.has32BitRenderscriptCode()) { apkGenerationConfiguration.setInclude64BitLibs(false); } return apkGenerationConfiguration.build(); }
@Test public void nativeSplits_pPlusTargeting_withDexCompressionSplitter() throws Exception { BundleModule testModule = new BundleModuleBuilder("testModule") .addFile("dex/classes.dex") .setManifest(androidManifest("com.test.app")) .build(); ModuleSplitter moduleSplitter = new ModuleSplitter( testModule, BUNDLETOOL_VERSION, ApkGenerationConfiguration.builder().setEnableDexCompressionSplitter(true).build(), variantMinSdkTargeting(ANDROID_P_API_VERSION), ImmutableSet.of("testModule"), NO_RESOURCES_PINNED_TO_MASTER); List<ModuleSplit> splits = moduleSplitter.splitModule(); assertThat(splits).hasSize(1); ModuleSplit moduleSplit = Iterables.getOnlyElement(splits); assertThat(moduleSplit.getSplitType()).isEqualTo(SplitType.SPLIT); assertThat(moduleSplit.getVariantTargeting()) .isEqualTo(variantMinSdkTargeting(ANDROID_P_API_VERSION)); assertThat(moduleSplit.findEntry("dex/classes.dex").get().shouldCompress()).isFalse(); }
@Test public void variantsGeneration_withInstantModule_generatesNoVariant() throws Exception { DexCompressionVariantGenerator dexCompressionVariantGenerator = new DexCompressionVariantGenerator( ApkGenerationConfiguration.builder() .setForInstantAppVariants(true) .setEnableDexCompressionSplitter(true) .build()); ImmutableCollection<VariantTargeting> splits = dexCompressionVariantGenerator.generate(createModuleWithDexFile()); assertThat(splits).isEmpty(); }
@Test public void variantsWithNativeLibsDexFiles_withInstantModule_allOptimizationsDisabled() throws Exception { VariantGenerator variantGenerator = new VariantGenerator( createSingleLibraryDexModule(), ApkGenerationConfiguration.builder().setForInstantAppVariants(true).build()); ImmutableCollection<VariantTargeting> splits = variantGenerator.generateVariants(); assertThat(splits).containsExactly(lPlusVariantTargeting()); }
@Test public void variantsGeneration_withDexFile_generatesPVariant() throws Exception { DexCompressionVariantGenerator dexCompressionVariantGenerator = new DexCompressionVariantGenerator( ApkGenerationConfiguration.builder().setEnableDexCompressionSplitter(true).build()); ImmutableCollection<VariantTargeting> splits = dexCompressionVariantGenerator.generate(createModuleWithDexFile()); assertThat(splits).containsExactly(variantMinSdkTargeting(ANDROID_P_API_VERSION)); }
@Test public void variantsWithNativeLibs() throws Exception { NativeLibsCompressionVariantGenerator nativeLibsCompressionVariantGenerator = new NativeLibsCompressionVariantGenerator( ApkGenerationConfiguration.builder() .setEnableNativeLibraryCompressionSplitter(true) .build()); ImmutableCollection<VariantTargeting> splits = nativeLibsCompressionVariantGenerator.generate( createSingleLibraryModule("testModule", "x86", "lib/x86/libnoname.so")); assertThat(splits).containsExactly(variantMinSdkTargeting(ANDROID_M_API_VERSION)); }
@Test public void variantsWithNativeLibs_instantModule() throws Exception { NativeLibsCompressionVariantGenerator nativeLibsCompressionVariantGenerator = new NativeLibsCompressionVariantGenerator( ApkGenerationConfiguration.builder() .setForInstantAppVariants(true) .setEnableNativeLibraryCompressionSplitter(true) .build()); ImmutableCollection<VariantTargeting> splits = nativeLibsCompressionVariantGenerator.generate( createSingleLibraryModule("testModule", "x86", "lib/x86/libnoname.so")); assertThat(splits).isEmpty(); }
@Test public void variantsWithNativeLibsDexFiles_withNativeLibsOptimization() throws Exception { VariantGenerator variantGenerator = new VariantGenerator( createSingleLibraryDexModule(), ApkGenerationConfiguration.builder() .setEnableNativeLibraryCompressionSplitter(true) .build()); ImmutableCollection<VariantTargeting> splits = variantGenerator.generateVariants(); assertThat(splits) .containsExactly(lPlusVariantTargeting(), variantMinSdkTargeting(ANDROID_M_API_VERSION)); }
@Test public void variantsWithNativeLibsDexFiles_withDexOptimization() throws Exception { VariantGenerator variantGenerator = new VariantGenerator( createSingleLibraryDexModule(), ApkGenerationConfiguration.builder().setEnableDexCompressionSplitter(true).build()); ImmutableCollection<VariantTargeting> splits = variantGenerator.generateVariants(); assertThat(splits) .containsExactly(lPlusVariantTargeting(), variantMinSdkTargeting(ANDROID_P_API_VERSION)); }
@Test public void splittingByCompression_preM_instantModule() throws Exception { NativeLibrariesCompressionSplitter nativeLibrariesCompressionSplitter = new NativeLibrariesCompressionSplitter( ApkGenerationConfiguration.builder().setForInstantAppVariants(true).build()); ImmutableCollection<ModuleSplit> splits = nativeLibrariesCompressionSplitter.split( ModuleSplit.forNativeLibraries( createSingleLibraryModule("testModule", "x86", "lib/x86/libnoname.so"), lPlusVariantTargeting())); assertThat(splits).hasSize(1); ModuleSplit moduleSplit = Iterables.getOnlyElement(splits); assertThat(moduleSplit.getVariantTargeting()).isEqualTo(lPlusVariantTargeting()); assertThat(extractPaths(moduleSplit.getEntries())).containsExactly("lib/x86/libnoname.so"); assertThat(moduleSplit.isMasterSplit()).isTrue(); assertThat(moduleSplit.getApkTargeting()).isEqualToDefaultInstance(); assertThat(getShouldCompress(moduleSplit, "lib/x86/libnoname.so")).isFalse(); assertThat( compareManifestMutators( moduleSplit.getMasterManifestMutators(), withExtractNativeLibs(false))) .isTrue(); }
@Test public void variantsWithNativeLibsDexFiles_withInstantModule_withNativeLibsAndDexOptimization() throws Exception { VariantGenerator variantGenerator = new VariantGenerator( createSingleLibraryDexModule(), ApkGenerationConfiguration.builder() .setForInstantAppVariants(true) .setEnableDexCompressionSplitter(true) .setEnableNativeLibraryCompressionSplitter(true) .build()); ImmutableCollection<VariantTargeting> splits = variantGenerator.generateVariants(); assertThat(splits).containsExactly(lPlusVariantTargeting()); }
@Test public void variantsGeneration_withoutDexFile_generatesNoVariant() throws Exception { DexCompressionVariantGenerator dexCompressionVariantGenerator = new DexCompressionVariantGenerator( ApkGenerationConfiguration.builder().setEnableDexCompressionSplitter(true).build()); BundleModule bundleModule = new BundleModuleBuilder("testModule") .addFile("assets/leftover.txt") .setManifest(androidManifest("com.test.app")) .build(); ImmutableCollection<VariantTargeting> splits = dexCompressionVariantGenerator.generate(bundleModule); assertThat(splits).isEmpty(); }
@Test public void instantManifestChanges_addsMinSdkVersion() throws Exception { BundleModule bundleModule = new BundleModuleBuilder("testModule") .setManifest(androidManifest("com.test.app", withInstant(true))) .build(); ImmutableList<ModuleSplit> moduleSplits = new ModuleSplitter( bundleModule, BUNDLETOOL_VERSION, ApkGenerationConfiguration.builder().setForInstantAppVariants(true).build(), lPlusVariantTargeting(), ImmutableSet.of("testModule"), NO_RESOURCES_PINNED_TO_MASTER) .splitModule(); assertThat(moduleSplits).hasSize(1); ModuleSplit masterSplit = moduleSplits.get(0); assertThat(masterSplit.getVariantTargeting()).isEqualTo(lPlusVariantTargeting()); assertThat(masterSplit.isMasterSplit()).isTrue(); assertThat(masterSplit.getApkTargeting()).isEqualTo(apkMinSdkTargeting(21)); assertThat(masterSplit.getSplitType()).isEqualTo(SplitType.INSTANT); assertThat(masterSplit.getAndroidManifest().getTargetSandboxVersion()).hasValue(2); assertThat(masterSplit.getAndroidManifest().getMinSdkVersion()).hasValue(21); }
@Test public void instantManifestChanges_keepsMinSdkVersion() throws Exception { BundleModule bundleModule = new BundleModuleBuilder("testModule") .setManifest(androidManifest("com.test.app", withMinSdkVersion(22), withInstant(true))) .build(); ImmutableList<ModuleSplit> moduleSplits = new ModuleSplitter( bundleModule, BUNDLETOOL_VERSION, ApkGenerationConfiguration.builder().setForInstantAppVariants(true).build(), lPlusVariantTargeting(), ImmutableSet.of("testModule"), NO_RESOURCES_PINNED_TO_MASTER) .splitModule(); assertThat(moduleSplits).hasSize(1); ModuleSplit masterSplit = moduleSplits.get(0); assertThat(masterSplit.getVariantTargeting()).isEqualTo(lPlusVariantTargeting()); assertThat(masterSplit.isMasterSplit()).isTrue(); assertThat(masterSplit.getApkTargeting()).isEqualTo(apkMinSdkTargeting(21)); assertThat(masterSplit.getSplitType()).isEqualTo(SplitType.INSTANT); assertThat(masterSplit.getAndroidManifest().getTargetSandboxVersion()).hasValue(2); assertThat(masterSplit.getAndroidManifest().getMinSdkVersion()).hasValue(22); }
@Test public void variantsWithNativeLibsDexFiles_withNativeLibsAndDexOptimization() throws Exception { VariantGenerator variantGenerator = new VariantGenerator( createSingleLibraryDexModule(), ApkGenerationConfiguration.builder() .setEnableDexCompressionSplitter(true) .setEnableNativeLibraryCompressionSplitter(true) .build()); ImmutableCollection<VariantTargeting> splits = variantGenerator.generateVariants(); assertThat(splits) .containsExactly( lPlusVariantTargeting(), variantMinSdkTargeting(ANDROID_M_API_VERSION), variantMinSdkTargeting(ANDROID_P_API_VERSION)); }
@Test public void instantManifestChanges_updatesMinSdkVersion() throws Exception { BundleModule bundleModule = new BundleModuleBuilder("testModule") .setManifest(androidManifest("com.test.app", withMinSdkVersion(19), withInstant(true))) .build(); ImmutableList<ModuleSplit> moduleSplits = new ModuleSplitter( bundleModule, BUNDLETOOL_VERSION, ApkGenerationConfiguration.builder().setForInstantAppVariants(true).build(), lPlusVariantTargeting(), ImmutableSet.of("testModule"), NO_RESOURCES_PINNED_TO_MASTER) .splitModule(); assertThat(moduleSplits).hasSize(1); ModuleSplit masterSplit = moduleSplits.get(0); assertThat(masterSplit.getVariantTargeting()).isEqualTo(lPlusVariantTargeting()); assertThat(masterSplit.isMasterSplit()).isTrue(); assertThat(masterSplit.getApkTargeting()).isEqualTo(apkMinSdkTargeting(21)); assertThat(masterSplit.getSplitType()).isEqualTo(SplitType.INSTANT); assertThat(masterSplit.getAndroidManifest().getTargetSandboxVersion()).hasValue(2); assertThat(masterSplit.getAndroidManifest().getMinSdkVersion()).hasValue(21); }
@Test public void variantsWithoutNativeLibs() throws Exception { NativeLibsCompressionVariantGenerator nativeLibsCompressionVariantGenerator = new NativeLibsCompressionVariantGenerator( ApkGenerationConfiguration.builder() .setEnableNativeLibraryCompressionSplitter(true) .build()); BundleModule bundleModule = new BundleModuleBuilder("testModule") .addFile("assets/leftover.txt") .addFile("dex/classes.dex") .setManifest(androidManifest("com.test.app")) .build(); ImmutableCollection<VariantTargeting> splits = nativeLibsCompressionVariantGenerator.generate(bundleModule); assertThat(splits).isEmpty(); }