/** * Returns all variants matching a (partial or full) device-spec. Note that at most one variant * can match a full device-spec (generated from device-spec command). */ public ImmutableList<Variant> getAllMatchingVariants(BuildApksResult buildApksResult) { Supplier<Stream<Variant>> variantsToMatch = () -> buildApksResult.getVariantList().stream() .filter(variant -> isVariantInstant(variant) == matchInstant); // Check if the device is compatible with the variants. variantsToMatch.get().forEach(this::checkCompatibleWithVariant); return variantsToMatch .get() .filter(variant -> matchesVariantTargeting(variant.getTargeting())) .collect(toImmutableList()); }
private ConfigurationSizes getSizeStandaloneVariant() { checkState( !getSizeRequest.getInstant(), "Standalone Variants cant be selected when instant flag is set"); // When modules are specified we ignore standalone variants. if (getSizeRequest.getModules().isPresent()) { return ConfigurationSizes.create(ImmutableMap.of(), ImmutableMap.of()); } VariantTargeting variantTargeting = variant.getTargeting(); SizeConfiguration sizeConfiguration = mergeWithDeviceSpec( getSizeConfiguration( variantTargeting.getSdkVersionTargeting(), variantTargeting.getAbiTargeting(), variantTargeting.getScreenDensityTargeting(), LanguageTargeting.getDefaultInstance()), getSizeRequest.getDeviceSpec()); // Variants of standalone APKs have only one APK each. long compressedSize = sizeByApkPaths.get( Iterables.getOnlyElement( Iterables.getOnlyElement(variant.getApkSetList()).getApkDescriptionList()) .getPath()); ImmutableMap<SizeConfiguration, Long> sizeConfigurationMap = ImmutableMap.of(sizeConfiguration, compressedSize); return ConfigurationSizes.create(sizeConfigurationMap, sizeConfigurationMap); }
Map<SizeConfiguration, Long> maxSizeByConfiguration = new HashMap<>(); SdkVersionTargeting sdkVersionTargeting = variant.getTargeting().getSdkVersionTargeting(); for (AbiTargeting abiTargeting : abiTargetingOptions) { for (ScreenDensityTargeting screenDensityTargeting : screenDensityTargetingOptions) {
assertThat(systemVariantsByAbi.get(toAbi(AbiAlias.X86)).getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo( variantAbiTargeting(AbiAlias.X86, ImmutableSet.of(AbiAlias.X86_64, AbiAlias.MIPS)), variantSdkTargeting(LOWEST_SDK_VERSION))); assertThat(systemVariantsByAbi.get(toAbi(AbiAlias.X86_64)).getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo( variantAbiTargeting(AbiAlias.X86_64, ImmutableSet.of(AbiAlias.X86, AbiAlias.MIPS)), variantSdkTargeting(LOWEST_SDK_VERSION))); assertThat(systemVariantsByAbi.get(toAbi(AbiAlias.MIPS)).getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo(
assertThat(systemVariant.getTargeting()).isEqualTo(UNRESTRICTED_VARIANT_TARGETING);
assertThat(systemVariant.getTargeting()).isEqualTo(UNRESTRICTED_VARIANT_TARGETING);
assertThat(universalVariant.getTargeting()).isEqualTo(UNRESTRICTED_VARIANT_TARGETING);
assertThat(standaloneVariantsByAbi.keySet()) .containsExactly(toAbi(AbiAlias.X86), toAbi(AbiAlias.X86_64), toAbi(AbiAlias.MIPS)); assertThat(standaloneVariantsByAbi.get(toAbi(AbiAlias.X86)).getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo( sdkVersionFrom(ANDROID_L_API_VERSION), sdkVersionFrom(ANDROID_M_API_VERSION))))); assertThat(standaloneVariantsByAbi.get(toAbi(AbiAlias.X86_64)).getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo( sdkVersionFrom(ANDROID_L_API_VERSION), sdkVersionFrom(ANDROID_M_API_VERSION))))); assertThat(standaloneVariantsByAbi.get(toAbi(AbiAlias.MIPS)).getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo(
assertThat(x86Variant.getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo(
BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir); assertThat(standaloneApkVariants(result)).hasSize(1); assertThat(standaloneApkVariants(result).get(0).getTargeting().getAbiTargeting()) .isEqualTo(abiTargeting(ARMEABI_V7A)); assertThat(splitApkVariants(result)).hasSize(1);
assertThat(universalVariant.getTargeting()) .isEqualTo(variantSdkTargeting(/* minSdkVersion= */ 23));
@Test public void buildApksCommand_minSdkVersion_presentInStandaloneSdkTargeting() throws Exception { bundlePath = FileUtils.getRandomFilePath(tmp, "bundle-", ".aab"); AppBundle appBundle = new AppBundleBuilder() .addModule( "base", builder -> builder.setManifest( androidManifest("com.app", withMinSdkVersion(15), withMaxSdkVersion(20)))) .build(); bundleSerializer.writeToDisk(appBundle, bundlePath); BuildApksCommand command = BuildApksCommand.fromFlags( new FlagParser() .parse( "--bundle=" + bundlePath, "--output=" + outputFilePath, "--aapt2=" + AAPT2_PATH), fakeAdbServer); // Should not throw. Path apkSetFilePath = execute(command); ZipFile apkSetFile = new ZipFile(apkSetFilePath.toFile()); BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir); assertThat(result.getVariantList()).hasSize(1); assertThat(splitApkVariants(result)).isEmpty(); assertThat(standaloneApkVariants(result)).hasSize(1); assertThat(standaloneApkVariants(result).get(0).getTargeting()) .isEqualTo(variantSdkTargeting(/* minSdkVersion= */ 15)); }
@Test public void buildApksCommand_instantApks_targetLPlus() throws Exception { bundlePath = FileUtils.getRandomFilePath(tmp, "bundle-", ".aab"); AppBundle appBundle = new AppBundleBuilder() .addModule( "base", builder -> builder .addFile("dex/classes.dex") .setManifest(androidManifest("com.test.app", withInstant(true)))) .build(); bundleSerializer.writeToDisk(appBundle, bundlePath); BuildApksCommand command = BuildApksCommand.builder() .setBundlePath(bundlePath) .setOutputFile(outputFilePath) .setAapt2Command(aapt2Command) .build(); Path apkSetFilePath = execute(command); ZipFile apkSetFile = new ZipFile(apkSetFilePath.toFile()); BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir); assertThat(instantApkVariants(result)).hasSize(1); Variant variant = instantApkVariants(result).get(0); assertThat(variant.hasTargeting()).isTrue(); assertThat(variant.getTargeting().getSdkVersionTargeting().getValueList()) .containsExactly(sdkVersionFrom(ANDROID_L_API_VERSION)); }
@Test public void buildApksCommand_splitApks_targetLPlus() throws Exception { bundlePath = FileUtils.getRandomFilePath(tmp, "bundle-", ".aab"); AppBundle appBundle = new AppBundleBuilder() .addModule( "base", builder -> builder.addFile("dex/classes.dex").setManifest(androidManifest("com.test.app"))) .build(); bundleSerializer.writeToDisk(appBundle, bundlePath); BuildApksCommand command = BuildApksCommand.builder() .setBundlePath(bundlePath) .setOutputFile(outputFilePath) .setAapt2Command(aapt2Command) .build(); Path apkSetFilePath = execute(command); ZipFile apkSetFile = new ZipFile(apkSetFilePath.toFile()); BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir); assertThat(splitApkVariants(result)).hasSize(1); Variant variant = splitApkVariants(result).get(0); assertThat(variant.hasTargeting()).isTrue(); assertThat(variant.getTargeting().getSdkVersionTargeting().getValueList()) .containsExactly(sdkVersionFrom(ANDROID_L_API_VERSION)); }
@Test public void buildApksCommand_appTargetingLPlus_buildsSplitApksOnly() throws Exception { bundlePath = FileUtils.getRandomFilePath(tmp, "bundle-", ".aab"); AppBundle appBundle = new AppBundleBuilder() .addModule( "base", builder -> builder.setManifest( androidManifest("com.test.app", withMinSdkVersion(ANDROID_L_API_VERSION)))) .build(); bundleSerializer.writeToDisk(appBundle, bundlePath); BuildApksCommand command = BuildApksCommand.builder() .setBundlePath(bundlePath) .setOutputFile(outputFilePath) .setAapt2Command(aapt2Command) .build(); Path apkSetFilePath = execute(command); ZipFile apkSetFile = new ZipFile(apkSetFilePath.toFile()); BuildApksResult result = extractTocFromApkSetFile(apkSetFile, outputDir); assertThat(result.getVariantList()).hasSize(1); assertThat(standaloneApkVariants(result)).isEmpty(); assertThat(splitApkVariants(result)).hasSize(1); Variant splitApksVariant = splitApkVariants(result).get(0); assertThat(splitApksVariant.getTargeting()) .isEqualTo(variantSdkTargeting(sdkVersionFrom(ANDROID_L_API_VERSION))); }
public void checkCompatibleWithVariant(Variant variant) { checkCompatibleWithVariantTargeting(variant.getTargeting()); }
private void checkVariantMultiAbiTargeting(Variant variant, VariantTargeting targeting) throws Exception { assertThat(variant.getTargeting()) .ignoringRepeatedFieldOrder() .isEqualTo(mergeVariantTargeting(targeting, variantSdkTargeting(LOWEST_SDK_VERSION))); } }