private static Optional<Integer> getMinSdk(VariantTargeting variantTargeting) { // If the variant does not have an SDK targeting, it is suitable for all SDK values. if (variantTargeting.getSdkVersionTargeting().getValueList().isEmpty()) { return Optional.empty(); } // If there are many different minSdks values, select the maximum of those. // We ignore the alternatives. return variantTargeting .getSdkVersionTargeting() .getValueList() .stream() .map(sdkVersion -> sdkVersion.getMin().getValue()) .max(Comparator.naturalOrder()); }
/** Extracts the maximum sdk (exclusive) supported by the targeting. */ public static int getMaxSdk(SdkVersionTargeting sdkVersionTargeting) { int minSdk = getMinSdk(sdkVersionTargeting); int alternativeMinSdk = sdkVersionTargeting .getAlternativesList() .stream() .mapToInt(alternativeSdk -> alternativeSdk.getMin().getValue()) .filter(sdkValue -> minSdk < sdkValue) .min() .orElse(Integer.MAX_VALUE); return alternativeMinSdk; } }
/** * Given a set of potentially overlapping sdk targetings generate set of disjoint sdk targetings * covering all of them. * * <p>Assumption: There are no sdk range gaps in targetings. */ private static ImmutableList<SdkVersionTargeting> generateAllSdkTargetings( ImmutableList<SdkVersionTargeting> sdkVersionTargetings) { sdkVersionTargetings.forEach( sdkVersionTargeting -> checkState(sdkVersionTargeting.getValueList().size() == 1)); ImmutableList<Integer> minSdkValues = sdkVersionTargetings .stream() .map(sdkVersionTargeting -> sdkVersionTargeting.getValue(0).getMin().getValue()) .distinct() .sorted() .collect(toImmutableList()); ImmutableSet<SdkVersion> sdkVersions = minSdkValues.stream().map(TargetingProtoUtils::sdkVersionFrom).collect(toImmutableSet()); return sdkVersions .stream() .map( sdkVersion -> sdkVersionTargeting( sdkVersion, Sets.difference(sdkVersions, ImmutableSet.of(sdkVersion)).immutableCopy())) .collect(toImmutableList()); }
/** * Adds L+ targeting to the Apk targeting of module split. If SDK targeting already exists, it's * not overridden but checked that it targets no L- devices. */ private ModuleSplit addLPlusApkTargeting(ModuleSplit split) { if (split.getApkTargeting().hasSdkVersionTargeting()) { checkState( split.getApkTargeting().getSdkVersionTargeting().getValue(0).getMin().getValue() >= ANDROID_L_API_VERSION, "Module Split should target SDK versions above L."); return split; } return split .toBuilder() .setApkTargeting( split .getApkTargeting() .toBuilder() .setSdkVersionTargeting( SdkVersionTargeting.newBuilder() .addValue( SdkVersion.newBuilder() .setMin(Int32Value.newBuilder().setValue(ANDROID_L_API_VERSION)))) .build()) .build(); }
/** * Returns if the candidate sdk targeting better matches the device sdk version. * * @param candidate candidate sdk targeting that we analyze. * @param contestedValue the targeting value we are trying to contest. * @param deviceSdkVersion the device sdk version * @return whether candidate matches better the device sdk version. */ private boolean isBetterSdkMatch( SdkVersion candidate, SdkVersion contestedValue, int deviceSdkVersion) { if (!matchesDeviceSdk(candidate, deviceSdkVersion)) { return false; } return candidate.hasMin() && candidate.getMin().getValue() > contestedValue.getMin().getValue(); }
private boolean matchesDeviceSdk(SdkVersion value, int deviceSdkVersion) { return !value.hasMin() || value.getMin().getValue() <= deviceSdkVersion; }
private static boolean targetsPreP(ModuleSplit moduleSplit) { int sdkVersion = Iterables.getOnlyElement( moduleSplit.getVariantTargeting().getSdkVersionTargeting().getValueList()) .getMin() .getValue(); return sdkVersion < ANDROID_P_API_VERSION; }
DeviceSpecFromTargetingBuilder setSdkVersion(SdkVersionTargeting sdkVersionTargeting) { if (!sdkVersionTargeting.equals(SdkVersionTargeting.getDefaultInstance())) { deviceSpec.setSdkVersion( Iterables.getOnlyElement(sdkVersionTargeting.getValueList()).getMin().getValue()); } return this; }
private static boolean targetsPreM(ModuleSplit moduleSplit) { int sdkVersion = Iterables.getOnlyElement( moduleSplit.getVariantTargeting().getSdkVersionTargeting().getValueList()) .getMin() .getValue(); return sdkVersion < ANDROID_M_API_VERSION; }
/** Extracts the minimum sdk (inclusive) supported by the targeting. */ public static int getMinSdk(SdkVersionTargeting sdkVersionTargeting) { if (sdkVersionTargeting.getValueList().isEmpty()) { return 1; } return Iterables.getOnlyElement(sdkVersionTargeting.getValueList()).getMin().getValue(); }