private SplittingPipeline createNativeLibrariesSplittingPipeline( ImmutableSet<OptimizationDimension> shardingDimensions) { return new SplittingPipeline( shardingDimensions.contains(OptimizationDimension.ABI) ? ImmutableList.of(new AbiNativeLibrariesSplitter(generate64BitShards)) : ImmutableList.of()); }
@Test public void neverProducesMasterSplit() throws Exception { ModuleSplit inputSplit = ModuleSplit.forNativeLibraries( createSingleLibraryModule("testModule", "x86", "lib/x86/libnoname.so")); assertThat(inputSplit.isMasterSplit()).isTrue(); ImmutableCollection<ModuleSplit> splits = new AbiNativeLibrariesSplitter().split(inputSplit); assertThat(splits).hasSize(1); assertThat(splits.asList().get(0).isMasterSplit()).isFalse(); }
@Test public void manifestMutatorToRequireSplits_registered_whenAbisPresent() throws Exception { ModuleSplit inputSplit = ModuleSplit.forNativeLibraries( createSingleLibraryModule("testModule", "x86", "lib/x86/libnoname.so")); ImmutableCollection<ModuleSplit> splits = new AbiNativeLibrariesSplitter().split(inputSplit); assertThat(splits).hasSize(1); assertThat( compareManifestMutators( splits.asList().get(0).getMasterManifestMutators(), withSplitsRequired(true))) .isTrue(); }
@Test public void nativeSplitIdEqualsToModuleName_base() throws Exception { AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(); ImmutableCollection<ModuleSplit> splits = abiNativeLibrariesSplitter.split( ModuleSplit.forNativeLibraries(createSingleLibraryModule("base", "x86"))); assertThat(splits).hasSize(1); ModuleSplit x86Split = splits.asList().get(0); assertThat( x86Split .writeSplitIdInManifest(x86Split.getSuffix()) .getAndroidManifest() .getSplitId() .get()) .isEqualTo("config.x86"); }
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()); }
@Test public void manifestMutatorToRequireSplits_notRegistered_whenNoAbis() throws Exception { ModuleSplit inputSplit = ModuleSplit.forNativeLibraries( new BundleModuleBuilder("testModule") .setManifest(androidManifest("com.test.app")) .build()); ImmutableCollection<ModuleSplit> splits = new AbiNativeLibrariesSplitter().split(inputSplit); assertThat(splits).hasSize(1); assertThat(splits.asList().get(0).getMasterManifestMutators()).isEmpty(); }
@Test public void masterSplitIdEqualsToModuleName_nonBase() throws Exception { AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(); ImmutableCollection<ModuleSplit> splits = abiNativeLibrariesSplitter.split( ModuleSplit.forNativeLibraries(createSingleLibraryModule("testModule", "armeabi-v7a"))); assertThat(splits).hasSize(1); ModuleSplit armSplit = splits.asList().get(0); assertThat( armSplit .writeSplitIdInManifest(armSplit.getSuffix()) .getAndroidManifest() .getSplitId() .get()) .isEqualTo("testModule.config.armeabi_v7a"); }
@Test public void splittingByAbi() throws Exception { AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(); ImmutableCollection<ModuleSplit> splits = abiNativeLibrariesSplitter.split( ModuleSplit.forNativeLibraries( createSingleLibraryModule("testModule", "x86", "lib/x86/libnoname.so"))); assertThat(splits).hasSize(1); ModuleSplit x86Split = splits.asList().get(0); assertThat(x86Split.getApkTargeting()).isEqualTo(apkAbiTargeting(X86)); assertThat(x86Split.getVariantTargeting()).isEqualTo(lPlusVariantTargeting()); assertThat(extractPaths(x86Split.getEntries())).containsExactly("lib/x86/libnoname.so"); }
@Test public void generatesSplitWithUnusedEntries() throws Exception { AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(); BundleModule module = new BundleModuleBuilder("testModule") .addFile("lib/x86_64/libsome.so") .addFile("assets/leftover.txt") .addFile("dex/classes.dex") .setNativeConfig( nativeLibraries( targetedNativeDirectory( "lib/x86_64", nativeDirectoryTargeting(AbiAlias.X86_64)))) .setManifest(androidManifest("com.test.app")) .build(); ImmutableCollection<ModuleSplit> splits = abiNativeLibrariesSplitter.split(ModuleSplit.forModule(module)); // x86_64 split and leftover split. assertThat(splits).hasSize(2); Map<ApkTargeting, ModuleSplit> splitByTargeting = Maps.uniqueIndex(splits, ModuleSplit::getApkTargeting); assertThat(splitByTargeting).containsKey(apkAbiTargeting(AbiAlias.X86_64)); assertThat(extractPaths(splitByTargeting.get(apkAbiTargeting(AbiAlias.X86_64)).getEntries())) .containsExactly("lib/x86_64/libsome.so"); assertThat(splitByTargeting).containsKey(ApkTargeting.getDefaultInstance()); ModuleSplit leftOverSplit = splitByTargeting.get(ApkTargeting.getDefaultInstance()); assertThat(leftOverSplit.isMasterSplit()).isTrue(); assertThat(extractPaths(leftOverSplit.getEntries())) .containsExactly("dex/classes.dex", "assets/leftover.txt"); }
.build(); AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(); ImmutableCollection<ModuleSplit> splits = abiNativeLibrariesSplitter.split(ModuleSplit.forNativeLibraries(bundleModule));
@Test public void splittingByMultipleAbis_64BitDisabled() throws Exception { NativeLibraries nativeConfig = nativeLibraries( targetedNativeDirectory("lib/armeabi-v7a", nativeDirectoryTargeting(ARMEABI_V7A)), targetedNativeDirectory("lib/arm64-v8a", nativeDirectoryTargeting(ARM64_V8A)), targetedNativeDirectory("lib/x86_64", nativeDirectoryTargeting(X86_64))); BundleModule bundleModule = new BundleModuleBuilder("testModule") .setNativeConfig(nativeConfig) .addFile("lib/armeabi-v7a/libtest.so") .addFile("lib/arm64-v8a/libtest.so") .addFile("lib/x86_64/libtest.so") .setManifest(androidManifest("com.test.app")) .build(); AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(/* include64BitLibs= */ false); ImmutableCollection<ModuleSplit> splits = abiNativeLibrariesSplitter.split(ModuleSplit.forNativeLibraries(bundleModule)); assertThat(splits).hasSize(1); ModuleSplit abiSplit = splits.asList().get(0); assertThat(abiSplit.getApkTargeting()) .isEqualTo(apkAbiTargeting(ARMEABI_V7A, ImmutableSet.of())); assertThat(extractPaths(abiSplit.getEntries())).containsExactly("lib/armeabi-v7a/libtest.so"); }
@Test public void splittingByMultipleAbis_64BitDisabled_no32BitLibs_throws() throws Exception { NativeLibraries nativeConfig = nativeLibraries( targetedNativeDirectory("lib/arm64-v8a", nativeDirectoryTargeting(ARM64_V8A)), targetedNativeDirectory("lib/x86_64", nativeDirectoryTargeting(X86_64))); BundleModule bundleModule = new BundleModuleBuilder("testModule") .setNativeConfig(nativeConfig) .addFile("lib/arm64-v8a/libtest.so") .addFile("lib/x86_64/libtest.so") .setManifest(androidManifest("com.test.app")) .build(); AbiNativeLibrariesSplitter abiNativeLibrariesSplitter = new AbiNativeLibrariesSplitter(/* include64BitLibs= */ false); CommandExecutionException exception = assertThrows( CommandExecutionException.class, () -> abiNativeLibrariesSplitter.split(ModuleSplit.forNativeLibraries(bundleModule))); assertThat(exception) .hasMessageThat() .contains( "Generation of 64-bit native libraries is " + "disabled, but App Bundle contains only 64-bit native libraries."); }