Loading core/java/android/content/pm/parsing/ParsingPackage.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.content.pm.parsing.component.ParsedProvider; import android.content.pm.parsing.component.ParsedService; import android.content.pm.parsing.component.ParsedService; import android.os.Bundle; import android.os.Bundle; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import java.security.PublicKey; import java.security.PublicKey; import java.util.Map; import java.util.Map; Loading Loading @@ -258,6 +259,8 @@ public interface ParsingPackage extends ParsingPackageRead { ParsingPackage setManageSpaceActivityName(String manageSpaceActivityName); ParsingPackage setManageSpaceActivityName(String manageSpaceActivityName); ParsingPackage setMinExtensionVersions(@Nullable SparseIntArray minExtensionVersions); ParsingPackage setMinSdkVersion(int minSdkVersion); ParsingPackage setMinSdkVersion(int minSdkVersion); ParsingPackage setNetworkSecurityConfigRes(int networkSecurityConfigRes); ParsingPackage setNetworkSecurityConfigRes(int networkSecurityConfigRes); Loading core/java/android/content/pm/parsing/ParsingPackageImpl.java +17 −0 Original line number Original line Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.ArraySet; import android.util.Pair; import android.util.Pair; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -340,6 +341,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { private String manageSpaceActivityName; private String manageSpaceActivityName; private float maxAspectRatio; private float maxAspectRatio; private float minAspectRatio; private float minAspectRatio; @Nullable private SparseIntArray minExtensionVersions; private int minSdkVersion; private int minSdkVersion; private int networkSecurityConfigRes; private int networkSecurityConfigRes; @Nullable @Nullable Loading Loading @@ -1100,6 +1103,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { dest.writeBoolean(this.preserveLegacyExternalStorage); dest.writeBoolean(this.preserveLegacyExternalStorage); dest.writeArraySet(this.mimeGroups); dest.writeArraySet(this.mimeGroups); dest.writeInt(this.gwpAsanMode); dest.writeInt(this.gwpAsanMode); dest.writeSparseIntArray(this.minExtensionVersions); } } public ParsingPackageImpl(Parcel in) { public ParsingPackageImpl(Parcel in) { Loading Loading @@ -1259,6 +1263,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { this.preserveLegacyExternalStorage = in.readBoolean(); this.preserveLegacyExternalStorage = in.readBoolean(); this.mimeGroups = (ArraySet<String>) in.readArraySet(boot); this.mimeGroups = (ArraySet<String>) in.readArraySet(boot); this.gwpAsanMode = in.readInt(); this.gwpAsanMode = in.readInt(); this.minExtensionVersions = in.readSparseIntArray(); } } public static final Parcelable.Creator<ParsingPackageImpl> CREATOR = public static final Parcelable.Creator<ParsingPackageImpl> CREATOR = Loading Loading @@ -1767,6 +1772,12 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { return minAspectRatio; return minAspectRatio; } } @Nullable @Override public SparseIntArray getMinExtensionVersions() { return minExtensionVersions; } @Override @Override public int getMinSdkVersion() { public int getMinSdkVersion() { return minSdkVersion; return minSdkVersion; Loading Loading @@ -2214,6 +2225,12 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { return this; return this; } } @Override public ParsingPackageImpl setMinExtensionVersions(@Nullable SparseIntArray value) { minExtensionVersions = value; return this; } @Override @Override public ParsingPackageImpl setMinSdkVersion(int value) { public ParsingPackageImpl setMinSdkVersion(int value) { minSdkVersion = value; minSdkVersion = value; Loading core/java/android/content/pm/parsing/ParsingPackageRead.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.os.Parcelable; import android.util.ArraySet; import android.util.ArraySet; import android.util.Pair; import android.util.Pair; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.R; Loading Loading @@ -608,6 +609,13 @@ public interface ParsingPackageRead extends Parcelable { @Nullable @Nullable String getManageSpaceActivityName(); String getManageSpaceActivityName(); /** * @see ApplicationInfo#minExtensionVersions * @see R.styleable#AndroidManifestExtensionSdk */ @Nullable SparseIntArray getMinExtensionVersions(); /** /** * @see ApplicationInfo#minSdkVersion * @see ApplicationInfo#minSdkVersion * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion Loading core/java/android/content/pm/parsing/ParsingPackageUtils.java +24 −4 Original line number Original line Diff line number Diff line Loading @@ -95,6 +95,7 @@ import android.util.DisplayMetrics; import android.util.Pair; import android.util.Pair; import android.util.Slog; import android.util.Slog; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.TypedValue; import android.util.TypedValue; import android.util.apk.ApkSignatureVerifier; import android.util.apk.ApkSignatureVerifier; Loading Loading @@ -1255,6 +1256,7 @@ public class ParsingPackageUtils { int type; int type; final int innerDepth = parser.getDepth(); final int innerDepth = parser.getDepth(); SparseIntArray minExtensionVersions = null; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { Loading @@ -1263,7 +1265,10 @@ public class ParsingPackageUtils { final ParseResult result; final ParseResult result; if (parser.getName().equals("extension-sdk")) { if (parser.getName().equals("extension-sdk")) { result = parseExtensionSdk(input, pkg, res, parser); if (minExtensionVersions == null) { minExtensionVersions = new SparseIntArray(); } result = parseExtensionSdk(input, res, parser, minExtensionVersions); XmlUtils.skipCurrentTag(parser); XmlUtils.skipCurrentTag(parser); } else { } else { result = ParsingUtils.unknownTag("<uses-sdk>", pkg, parser, input); result = ParsingUtils.unknownTag("<uses-sdk>", pkg, parser, input); Loading @@ -1273,6 +1278,7 @@ public class ParsingPackageUtils { return input.error(result); return input.error(result); } } } } pkg.setMinExtensionVersions(exactSizedCopyOfSparseArray(minExtensionVersions)); } finally { } finally { sa.recycle(); sa.recycle(); } } Loading @@ -1280,8 +1286,21 @@ public class ParsingPackageUtils { return input.success(pkg); return input.success(pkg); } } private static ParseResult parseExtensionSdk(ParseInput input, ParsingPackage pkg, @Nullable Resources res, XmlResourceParser parser) { private static SparseIntArray exactSizedCopyOfSparseArray(@Nullable SparseIntArray input) { if (input == null) { return null; } SparseIntArray output = new SparseIntArray(input.size()); for (int i = 0; i < input.size(); i++) { output.put(input.keyAt(i), input.valueAt(i)); } return output; } private static ParseResult<SparseIntArray> parseExtensionSdk( ParseInput input, Resources res, XmlResourceParser parser, SparseIntArray minExtensionVersions) { int sdkVersion; int sdkVersion; int minVersion; int minVersion; TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestExtensionSdk); TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestExtensionSdk); Loading Loading @@ -1316,7 +1335,8 @@ public class ParsingPackageUtils { PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "Specified sdkVersion " + sdkVersion + " is not valid"); "Specified sdkVersion " + sdkVersion + " is not valid"); } } return input.success(pkg); minExtensionVersions.put(sdkVersion, minVersion); return input.success(minExtensionVersions); } } /** /** Loading services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java +7 −1 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Bundle; import android.os.FileUtils; import android.os.FileUtils; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit; import android.util.SparseIntArray; import androidx.test.InstrumentationRegistry; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest; Loading Loading @@ -542,7 +543,12 @@ public class PackageParserLegacyCoreTest { @Test @Test public void testUsesSdk() throws Exception { public void testUsesSdk() throws Exception { ParsedPackage pkg = parsePackage("install_uses_sdk.apk_r0", R.raw.install_uses_sdk_r0, x -> x); parsePackage("install_uses_sdk.apk_r0", R.raw.install_uses_sdk_r0, x -> x); SparseIntArray minExtVers = pkg.getMinExtensionVersions(); assertEquals(1, minExtVers.size()); assertEquals(0, minExtVers.get(10000, -1)); try { try { parsePackage("install_uses_sdk.apk_r5", R.raw.install_uses_sdk_r5, x -> x); parsePackage("install_uses_sdk.apk_r5", R.raw.install_uses_sdk_r5, x -> x); fail("Expected parsing exception due to incompatible extension SDK version"); fail("Expected parsing exception due to incompatible extension SDK version"); Loading Loading
core/java/android/content/pm/parsing/ParsingPackage.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.content.pm.parsing.component.ParsedProvider; import android.content.pm.parsing.component.ParsedService; import android.content.pm.parsing.component.ParsedService; import android.os.Bundle; import android.os.Bundle; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import java.security.PublicKey; import java.security.PublicKey; import java.util.Map; import java.util.Map; Loading Loading @@ -258,6 +259,8 @@ public interface ParsingPackage extends ParsingPackageRead { ParsingPackage setManageSpaceActivityName(String manageSpaceActivityName); ParsingPackage setManageSpaceActivityName(String manageSpaceActivityName); ParsingPackage setMinExtensionVersions(@Nullable SparseIntArray minExtensionVersions); ParsingPackage setMinSdkVersion(int minSdkVersion); ParsingPackage setMinSdkVersion(int minSdkVersion); ParsingPackage setNetworkSecurityConfigRes(int networkSecurityConfigRes); ParsingPackage setNetworkSecurityConfigRes(int networkSecurityConfigRes); Loading
core/java/android/content/pm/parsing/ParsingPackageImpl.java +17 −0 Original line number Original line Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.ArraySet; import android.util.Pair; import android.util.Pair; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -340,6 +341,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { private String manageSpaceActivityName; private String manageSpaceActivityName; private float maxAspectRatio; private float maxAspectRatio; private float minAspectRatio; private float minAspectRatio; @Nullable private SparseIntArray minExtensionVersions; private int minSdkVersion; private int minSdkVersion; private int networkSecurityConfigRes; private int networkSecurityConfigRes; @Nullable @Nullable Loading Loading @@ -1100,6 +1103,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { dest.writeBoolean(this.preserveLegacyExternalStorage); dest.writeBoolean(this.preserveLegacyExternalStorage); dest.writeArraySet(this.mimeGroups); dest.writeArraySet(this.mimeGroups); dest.writeInt(this.gwpAsanMode); dest.writeInt(this.gwpAsanMode); dest.writeSparseIntArray(this.minExtensionVersions); } } public ParsingPackageImpl(Parcel in) { public ParsingPackageImpl(Parcel in) { Loading Loading @@ -1259,6 +1263,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { this.preserveLegacyExternalStorage = in.readBoolean(); this.preserveLegacyExternalStorage = in.readBoolean(); this.mimeGroups = (ArraySet<String>) in.readArraySet(boot); this.mimeGroups = (ArraySet<String>) in.readArraySet(boot); this.gwpAsanMode = in.readInt(); this.gwpAsanMode = in.readInt(); this.minExtensionVersions = in.readSparseIntArray(); } } public static final Parcelable.Creator<ParsingPackageImpl> CREATOR = public static final Parcelable.Creator<ParsingPackageImpl> CREATOR = Loading Loading @@ -1767,6 +1772,12 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { return minAspectRatio; return minAspectRatio; } } @Nullable @Override public SparseIntArray getMinExtensionVersions() { return minExtensionVersions; } @Override @Override public int getMinSdkVersion() { public int getMinSdkVersion() { return minSdkVersion; return minSdkVersion; Loading Loading @@ -2214,6 +2225,12 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { return this; return this; } } @Override public ParsingPackageImpl setMinExtensionVersions(@Nullable SparseIntArray value) { minExtensionVersions = value; return this; } @Override @Override public ParsingPackageImpl setMinSdkVersion(int value) { public ParsingPackageImpl setMinSdkVersion(int value) { minSdkVersion = value; minSdkVersion = value; Loading
core/java/android/content/pm/parsing/ParsingPackageRead.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.os.Parcelable; import android.util.ArraySet; import android.util.ArraySet; import android.util.Pair; import android.util.Pair; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.R; Loading Loading @@ -608,6 +609,13 @@ public interface ParsingPackageRead extends Parcelable { @Nullable @Nullable String getManageSpaceActivityName(); String getManageSpaceActivityName(); /** * @see ApplicationInfo#minExtensionVersions * @see R.styleable#AndroidManifestExtensionSdk */ @Nullable SparseIntArray getMinExtensionVersions(); /** /** * @see ApplicationInfo#minSdkVersion * @see ApplicationInfo#minSdkVersion * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion Loading
core/java/android/content/pm/parsing/ParsingPackageUtils.java +24 −4 Original line number Original line Diff line number Diff line Loading @@ -95,6 +95,7 @@ import android.util.DisplayMetrics; import android.util.Pair; import android.util.Pair; import android.util.Slog; import android.util.Slog; import android.util.SparseArray; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.TypedValue; import android.util.TypedValue; import android.util.apk.ApkSignatureVerifier; import android.util.apk.ApkSignatureVerifier; Loading Loading @@ -1255,6 +1256,7 @@ public class ParsingPackageUtils { int type; int type; final int innerDepth = parser.getDepth(); final int innerDepth = parser.getDepth(); SparseIntArray minExtensionVersions = null; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { Loading @@ -1263,7 +1265,10 @@ public class ParsingPackageUtils { final ParseResult result; final ParseResult result; if (parser.getName().equals("extension-sdk")) { if (parser.getName().equals("extension-sdk")) { result = parseExtensionSdk(input, pkg, res, parser); if (minExtensionVersions == null) { minExtensionVersions = new SparseIntArray(); } result = parseExtensionSdk(input, res, parser, minExtensionVersions); XmlUtils.skipCurrentTag(parser); XmlUtils.skipCurrentTag(parser); } else { } else { result = ParsingUtils.unknownTag("<uses-sdk>", pkg, parser, input); result = ParsingUtils.unknownTag("<uses-sdk>", pkg, parser, input); Loading @@ -1273,6 +1278,7 @@ public class ParsingPackageUtils { return input.error(result); return input.error(result); } } } } pkg.setMinExtensionVersions(exactSizedCopyOfSparseArray(minExtensionVersions)); } finally { } finally { sa.recycle(); sa.recycle(); } } Loading @@ -1280,8 +1286,21 @@ public class ParsingPackageUtils { return input.success(pkg); return input.success(pkg); } } private static ParseResult parseExtensionSdk(ParseInput input, ParsingPackage pkg, @Nullable Resources res, XmlResourceParser parser) { private static SparseIntArray exactSizedCopyOfSparseArray(@Nullable SparseIntArray input) { if (input == null) { return null; } SparseIntArray output = new SparseIntArray(input.size()); for (int i = 0; i < input.size(); i++) { output.put(input.keyAt(i), input.valueAt(i)); } return output; } private static ParseResult<SparseIntArray> parseExtensionSdk( ParseInput input, Resources res, XmlResourceParser parser, SparseIntArray minExtensionVersions) { int sdkVersion; int sdkVersion; int minVersion; int minVersion; TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestExtensionSdk); TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestExtensionSdk); Loading Loading @@ -1316,7 +1335,8 @@ public class ParsingPackageUtils { PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "Specified sdkVersion " + sdkVersion + " is not valid"); "Specified sdkVersion " + sdkVersion + " is not valid"); } } return input.success(pkg); minExtensionVersions.put(sdkVersion, minVersion); return input.success(minExtensionVersions); } } /** /** Loading
services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java +7 −1 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Bundle; import android.os.FileUtils; import android.os.FileUtils; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit; import android.util.SparseIntArray; import androidx.test.InstrumentationRegistry; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest; Loading Loading @@ -542,7 +543,12 @@ public class PackageParserLegacyCoreTest { @Test @Test public void testUsesSdk() throws Exception { public void testUsesSdk() throws Exception { ParsedPackage pkg = parsePackage("install_uses_sdk.apk_r0", R.raw.install_uses_sdk_r0, x -> x); parsePackage("install_uses_sdk.apk_r0", R.raw.install_uses_sdk_r0, x -> x); SparseIntArray minExtVers = pkg.getMinExtensionVersions(); assertEquals(1, minExtVers.size()); assertEquals(0, minExtVers.get(10000, -1)); try { try { parsePackage("install_uses_sdk.apk_r5", R.raw.install_uses_sdk_r5, x -> x); parsePackage("install_uses_sdk.apk_r5", R.raw.install_uses_sdk_r5, x -> x); fail("Expected parsing exception due to incompatible extension SDK version"); fail("Expected parsing exception due to incompatible extension SDK version"); Loading