public static NativeLibraries nativeLibraries(TargetedNativeDirectory... nativeDirectories) { return NativeLibraries.newBuilder() .addAllDirectory(Lists.newArrayList(nativeDirectories)) .build(); }
/** * Processes given native library directories, generating targeting based on their names. * * @param libDirectories Names of directories under lib/, including the "lib/" prefix. * @return Targeting for the given native libraries directories. */ public NativeLibraries generateTargetingForNativeLibraries(Collection<String> libDirectories) { NativeLibraries.Builder nativeLibraries = NativeLibraries.newBuilder(); for (String directory : libDirectories) { checkRootDirectoryName(LIB_DIR, directory); // Split the directory under lib/ into tokens. String abiName = directory.substring(LIB_DIR.length()); Abi abi = checkAbiName(abiName, directory); nativeLibraries.addDirectory( TargetedNativeDirectory.newBuilder() .setPath(directory) .setTargeting(NativeDirectoryTargeting.newBuilder().setAbi(abi)) .build()); } return nativeLibraries.build(); }
@Test public void nativeLibrariesPresent_abiTargetingIsPresent() throws Exception { Path moduleWithAbi = new ZipBuilder() .addFileWithContent(ZipPath.create("lib/x86/libfast.so"), "native data".getBytes(UTF_8)) .addFileWithContent( ZipPath.create("lib/x86/libfaster.so"), "native data".getBytes(UTF_8)) .addFileWithProtoContent( ZipPath.create("manifest/AndroidManifest.xml"), androidManifest(PKG_NAME)) .writeTo(tmpDir.resolve("base.zip")); BuildBundleCommand.builder() .setOutputPath(bundlePath) .setModulesPaths(ImmutableList.of(moduleWithAbi)) .build() .execute(); ZipFile bundle = new ZipFile(bundlePath.toFile()); assertThat(bundle).hasFile("base/native.pb"); NativeLibraries actualTargeting = NativeLibraries.parseFrom(bundle.getInputStream(new ZipEntry("base/native.pb"))); NativeLibraries expectedTargeting = NativeLibraries.newBuilder() .addDirectory( TargetedNativeDirectory.newBuilder() .setPath("lib/x86") .setTargeting( NativeDirectoryTargeting.newBuilder() .setAbi(Abi.newBuilder().setAlias(X86)))) .build(); Truth.assertThat(actualTargeting).isEqualTo(expectedTargeting); }
@Test public void differentNativeConfig_ok() throws Exception { String filePath = "native.pb"; byte[] fileContentA = NativeLibraries.getDefaultInstance().toByteArray(); byte[] fileContentB = NativeLibraries.newBuilder() .addDirectory(TargetedNativeDirectory.getDefaultInstance()) .build() .toByteArray(); assertThat(fileContentA).isNotEqualTo(fileContentB); BundleModule moduleA = new BundleModuleBuilder("a") .addFile(filePath, fileContentA) .setManifest(androidManifest("com.test.app")) .build(); BundleModule moduleB = new BundleModuleBuilder("b") .addFile(filePath, fileContentB) .setManifest(androidManifest("com.test.app")) .build(); new EntryClashValidator().validateAllModules(ImmutableList.of(moduleA, moduleB)); }
@Test public void correctNativeProtoFile_parsedAndReturned() throws Exception { NativeLibraries nativeConfig = NativeLibraries.newBuilder() .addDirectory(TargetedNativeDirectory.newBuilder().setPath("native/x86")) .build(); BundleModule bundleModule = createMinimalModuleBuilder() .addEntry(InMemoryModuleEntry.ofFile("native.pb", nativeConfig.toByteArray())) .build(); assertThat(bundleModule.getNativeConfig()).hasValue(nativeConfig); }