use of com.android.tools.build.bundletool.testing.AppBundleBuilder in project bundletool by google.
the class BuildApksResourcePinningTest method resourceIds_pinnedToMasterSplits.
@Test
public void resourceIds_pinnedToMasterSplits() throws Exception {
ResourceTable baseResourceTable = new ResourceTableBuilder().addPackage("com.test.app").addStringResource("test_label", "Module title").addFileResourceForMultipleConfigs("drawable", "image", ImmutableMap.of(Configuration.getDefaultInstance(), "res/drawable/image1.jpg", locale("fr"), "res/drawable-fr/image1.jpg")).addFileResourceForMultipleConfigs("drawable", "image2", ImmutableMap.of(Configuration.getDefaultInstance(), "res/drawable/image2.jpg", locale("fr"), "res/drawable-fr/image2.jpg")).build();
ResourceTable featureResourceTable = new ResourceTableBuilder().addPackage("com.test.app.feature", 0x80).addFileResourceForMultipleConfigs("drawable", "image3", ImmutableMap.of(Configuration.getDefaultInstance(), "res/drawable/image3.jpg", locale("fr"), "res/drawable-fr/image3.jpg")).addFileResourceForMultipleConfigs("drawable", "image4", ImmutableMap.of(Configuration.getDefaultInstance(), "res/drawable/image4.jpg", locale("fr"), "res/drawable-fr/image4.jpg")).build();
AppBundle appBundle = new AppBundleBuilder().addModule("base", builder -> builder.addFile("dex/classes.dex").addFile("res/drawable/image1.jpg").addFile("res/drawable-fr/image1.jpg").addFile("res/drawable/image2.jpg").addFile("res/drawable-fr/image2.jpg").setManifest(androidManifest("com.test.app", withMinSdkVersion(14))).setResourceTable(baseResourceTable)).addModule("feature", builder -> builder.addFile("res/drawable/image3.jpg").addFile("res/drawable-fr/image3.jpg").addFile("res/drawable/image4.jpg").addFile("res/drawable-fr/image4.jpg").setManifest(androidManifest("com.test.app", withMinSdkVersion(14), withOnDemandDelivery(), withFusingAttribute(true), withTitle("@string/test_label", 0x7f010000))).setResourceTable(featureResourceTable)).setBundleConfig(BundleConfigBuilder.create().addResourcePinnedToMasterSplit(// image1 from "base" module
0x7f020000).addResourcePinnedToMasterSplit(// image4 from "feature" module
0x80010001).build()).build();
TestComponent.useTestModule(this, TestModule.builder().withAppBundle(appBundle).withOutputPath(outputFilePath).build());
buildApksManager.execute();
ZipFile apkSetFile = new ZipFile(outputFilePath.toFile());
BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir);
// Verifying that standalone APKs contain all entries.
assertThat(standaloneApkVariants(result)).hasSize(1);
List<ApkSet> standaloneApkSets = standaloneApkVariants(result).get(0).getApkSetList();
assertThat(standaloneApkSets).hasSize(1);
List<ApkDescription> standaloneApkDescription = standaloneApkSets.get(0).getApkDescriptionList();
assertThat(standaloneApkDescription).hasSize(1);
File standaloneApkFile = extractFromApkSetFile(apkSetFile, standaloneApkDescription.get(0).getPath(), outputDir);
try (ZipFile standaloneZip = new ZipFile(standaloneApkFile)) {
assertThat(filesUnderPath(standaloneZip, ZipPath.create("res"))).containsExactly("res/drawable/image1.jpg", "res/drawable-fr/image1.jpg", "res/drawable/image2.jpg", "res/drawable-fr/image2.jpg", "res/drawable/image3.jpg", "res/drawable-fr/image3.jpg", "res/drawable/image4.jpg", "res/drawable-fr/image4.jpg", "res/xml/splits0.xml");
}
// Verifying split APKs.
assertThat(splitApkVariants(result)).hasSize(1);
List<ApkSet> splitApkSetList = splitApkVariants(result).get(0).getApkSetList();
Map<String, ApkSet> modules = Maps.uniqueIndex(splitApkSetList, apkSet -> apkSet.getModuleMetadata().getName());
assertThat(modules.keySet()).containsExactly("base", "feature");
List<ApkDescription> baseModuleApks = modules.get("base").getApkDescriptionList();
assertThat(baseModuleApks).hasSize(2);
Map<Boolean, ApkDescription> apkBaseMaster = Maps.uniqueIndex(baseModuleApks, apkDescription -> apkDescription.getSplitApkMetadata().getIsMasterSplit());
ApkDescription baseMaster = apkBaseMaster.get(/* isMasterSplit= */
true);
File baseMasterFile = extractFromApkSetFile(apkSetFile, baseMaster.getPath(), outputDir);
try (ZipFile baseMasterZip = new ZipFile(baseMasterFile)) {
assertThat(filesUnderPath(baseMasterZip, ZipPath.create("res"))).containsExactly("res/drawable/image1.jpg", "res/drawable-fr/image1.jpg", "res/drawable/image2.jpg", "res/xml/splits0.xml", "res/xml/locales_config.xml");
}
ApkDescription baseFr = apkBaseMaster.get(/* isMasterSplit= */
false);
File baseFrFile = extractFromApkSetFile(apkSetFile, baseFr.getPath(), outputDir);
try (ZipFile baseFrZip = new ZipFile(baseFrFile)) {
assertThat(filesUnderPath(baseFrZip, ZipPath.create("res"))).containsExactly("res/drawable-fr/image2.jpg");
}
List<ApkDescription> featureModuleApks = modules.get("feature").getApkDescriptionList();
assertThat(featureModuleApks).hasSize(2);
Map<Boolean, ApkDescription> apkFeatureMaster = Maps.uniqueIndex(featureModuleApks, apkDescription -> apkDescription.getSplitApkMetadata().getIsMasterSplit());
ApkDescription featureMaster = apkFeatureMaster.get(/* isMasterSplit= */
true);
File featureMasterFile = extractFromApkSetFile(apkSetFile, featureMaster.getPath(), outputDir);
try (ZipFile featureMasterZip = new ZipFile(featureMasterFile)) {
assertThat(filesUnderPath(featureMasterZip, ZipPath.create("res"))).containsExactly("res/drawable/image3.jpg", "res/drawable/image4.jpg", "res/drawable-fr/image4.jpg");
}
ApkDescription featureFr = apkFeatureMaster.get(/* isMasterSplit= */
false);
File featureFrFile = extractFromApkSetFile(apkSetFile, featureFr.getPath(), outputDir);
try (ZipFile featureFrZip = new ZipFile(featureFrFile)) {
assertThat(filesUnderPath(featureFrZip, ZipPath.create("res"))).containsExactly("res/drawable-fr/image3.jpg");
}
}
use of com.android.tools.build.bundletool.testing.AppBundleBuilder in project bundletool by google.
the class BuildApksValidationTest method splits_textureFallbackNotPresentInAssetPacks.
@Test
public void splits_textureFallbackNotPresentInAssetPacks() throws Exception {
AppBundle appBundle = new AppBundleBuilder().addModule("base", builder -> builder.setManifest(androidManifest("com.test.app")).setResourceTable(resourceTableWithTestLabel("Test feature"))).addModule("feature_tcf_assets", builder -> builder.addFile("assets/textures#tcf_atc/atc_texture.dat").addFile("assets/textures#tcf_etc1/etc1_texture.dat").setAssetsConfig(assets(targetedAssetsDirectory("assets/textures#tcf_atc", assetsDirectoryTargeting(textureCompressionTargeting(ATC))), targetedAssetsDirectory("assets/textures#tcf_etc1", assetsDirectoryTargeting(textureCompressionTargeting(ETC1_RGB8))))).setManifest(androidManifestForFeature("com.test.app", withTitle("@string/test_label", TEST_LABEL_RESOURCE_ID)))).setBundleConfig(BundleConfigBuilder.create().addSplitDimension(Value.TEXTURE_COMPRESSION_FORMAT, /* negate= */
false).build()).build();
new AppBundleSerializer().writeToDisk(appBundle, bundlePath);
BuildApksCommand command = BuildApksCommand.builder().setBundlePath(bundlePath).setOutputFile(outputFilePath).build();
// Splitting by texture compression format is activated, but the textures in
// one module don't include a fallback folder, used for standalone and universal
// APKs, so we'll consider the bundle invalid:
InvalidBundleException exception = assertThrows(InvalidBundleException.class, command::execute);
assertThat(exception).hasMessageThat().contains("the fallback texture folders (folders without #tcf suffixes) will be used, but module" + " 'feature_tcf_assets' has no such folders.");
}
use of com.android.tools.build.bundletool.testing.AppBundleBuilder in project bundletool by google.
the class BuildApksValidationTest method createAppBundle.
private static void createAppBundle(Path path) throws IOException {
AppBundle appBundle = new AppBundleBuilder().addModule("base", module -> module.setManifest(androidManifest("com.app")).build()).build();
new AppBundleSerializer().writeToDisk(appBundle, path);
}
use of com.android.tools.build.bundletool.testing.AppBundleBuilder in project bundletool by google.
the class DumpManagerTest method dumpManifest_withXPath_noNamespaceDeclaration.
@Test
public void dumpManifest_withXPath_noNamespaceDeclaration() throws Exception {
XmlNode manifestWithoutNamespaceDeclaration = androidManifest("com.app", withDebuggableAttribute(true), manifestElement -> manifestElement.getProto().clearNamespaceDeclaration());
AppBundle appBundle = new AppBundleBuilder().addModule("base", module -> module.setManifest(manifestWithoutNamespaceDeclaration)).build();
new AppBundleSerializer().writeToDisk(appBundle, bundlePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DumpCommand.builder().setBundlePath(bundlePath).setDumpTarget(DumpTarget.MANIFEST).setXPathExpression("/manifest/application/@android:debuggable").setOutputStream(new PrintStream(outputStream)).build().execute();
assertThat(new String(outputStream.toByteArray(), UTF_8).trim()).isEqualTo("true");
}
use of com.android.tools.build.bundletool.testing.AppBundleBuilder in project bundletool by google.
the class DumpManagerTest method dumpManifest_withXPath_nodeResult.
@Test
public void dumpManifest_withXPath_nodeResult() throws Exception {
AppBundle appBundle = new AppBundleBuilder().addModule("base", module -> module.setManifest(androidManifest("com.app", withMetadataValue("key1", "value1"), withMetadataValue("key2", "value2")))).build();
new AppBundleSerializer().writeToDisk(appBundle, bundlePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DumpCommand dumpCommand = DumpCommand.builder().setBundlePath(bundlePath).setDumpTarget(DumpTarget.MANIFEST).setXPathExpression("/manifest/application/meta-data").setOutputStream(new PrintStream(outputStream)).build();
assertThrows(UnsupportedOperationException.class, () -> dumpCommand.execute());
}
Aggregations