Loading core/java/android/content/pm/PackageManager.java +4 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,9 @@ import android.content.pm.dex.ArtManager; import android.content.pm.parsing.PackageInfoWithoutStateUtils; import android.content.pm.parsing.ParsingPackage; import android.content.pm.parsing.ParsingPackageUtils; import android.content.pm.parsing.result.ParseInput; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Rect; Loading Loading @@ -6061,7 +6063,8 @@ public abstract class PackageManager { boolean collectCertificates = (flags & PackageManager.GET_SIGNATURES) != 0 || (flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0; ParseResult<ParsingPackage> result = ParsingPackageUtils.parseDefaultOneTime( ParseInput input = ParseTypeImpl.forParsingWithoutPlatformCompat().reset(); ParseResult<ParsingPackage> result = ParsingPackageUtils.parseDefault(input, new File(archiveFilePath), 0, collectCertificates); if (result.isError()) { return null; Loading core/java/android/content/pm/parsing/ParsingPackageUtils.java +11 −2 Original line number Diff line number Diff line Loading @@ -130,15 +130,24 @@ public class ParsingPackageUtils { public static final String TAG = ParsingUtils.TAG; /** * @see #parseDefault(ParseInput, File, int, boolean) */ @NonNull public static ParseResult<ParsingPackage> parseDefaultOneTime(File file, @PackageParser.ParseFlags int parseFlags, boolean collectCertificates) { ParseInput input = ParseTypeImpl.forDefaultParsing().reset(); return parseDefault(input, file, parseFlags, collectCertificates); } /** * For cases outside of PackageManagerService when an APK needs to be parsed as a one-off * request, without caching the input object and without querying the internal system state * for feature support. */ @NonNull public static ParseResult<ParsingPackage> parseDefaultOneTime(File file, public static ParseResult<ParsingPackage> parseDefault(ParseInput input, File file, @PackageParser.ParseFlags int parseFlags, boolean collectCertificates) { ParseInput input = ParseTypeImpl.forDefaultParsing().reset(); ParseResult<ParsingPackage> result; ParsingPackageUtils parser = new ParsingPackageUtils(false, null, null, new Callback() { Loading core/java/android/content/pm/parsing/result/ParseInput.java +20 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.content.pm.parsing.result; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.ChangeId; Loading Loading @@ -69,6 +70,25 @@ public interface ParseInput { @ChangeId @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) public static final long RESOURCES_ARSC_COMPRESSED = 132742131; /** * TODO(chiuwinson): This is required because PackageManager#getPackageArchiveInfo * cannot read the targetSdk info from the changeId because it requires the * READ_COMPAT_CHANGE_CONFIG which cannot be obtained automatically without entering the * server process. This should be removed once an alternative is found, or if the API * is removed. * @return the targetSdk that this change is gated on (> check), or -1 if disabled */ @IntRange(from = -1, to = Integer.MAX_VALUE) public static int getTargetSdkForChange(long changeId) { if (changeId == MISSING_APP_TAG || changeId == EMPTY_INTENT_ACTION_CATEGORY || changeId == RESOURCES_ARSC_COMPRESSED) { return Build.VERSION_CODES.Q; } return -1; } } <ResultType> ParseResult<ResultType> success(ResultType result); Loading core/java/android/content/pm/parsing/result/ParseTypeImpl.java +15 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,21 @@ public class ParseTypeImpl implements ParseInput, ParseResult<Object> { private String mPackageName; private Integer mTargetSdkVersion; /** * Specifically for {@link PackageManager#getPackageArchiveInfo(String, int)} where * {@link IPlatformCompat} cannot be used because the cross-package READ_COMPAT_CHANGE_CONFIG * permission cannot be obtained. */ public static ParseTypeImpl forParsingWithoutPlatformCompat() { return new ParseTypeImpl((changeId, packageName, targetSdkVersion) -> { int gateSdkVersion = DeferredError.getTargetSdkForChange(changeId); if (gateSdkVersion == -1) { return false; } return targetSdkVersion > gateSdkVersion; }); } /** * Assumes {@link Context#PLATFORM_COMPAT_SERVICE} is available to the caller. For use * with {@link android.content.pm.parsing.ApkLiteParseUtils} or similar where parsing is Loading Loading
core/java/android/content/pm/PackageManager.java +4 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,9 @@ import android.content.pm.dex.ArtManager; import android.content.pm.parsing.PackageInfoWithoutStateUtils; import android.content.pm.parsing.ParsingPackage; import android.content.pm.parsing.ParsingPackageUtils; import android.content.pm.parsing.result.ParseInput; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Rect; Loading Loading @@ -6061,7 +6063,8 @@ public abstract class PackageManager { boolean collectCertificates = (flags & PackageManager.GET_SIGNATURES) != 0 || (flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0; ParseResult<ParsingPackage> result = ParsingPackageUtils.parseDefaultOneTime( ParseInput input = ParseTypeImpl.forParsingWithoutPlatformCompat().reset(); ParseResult<ParsingPackage> result = ParsingPackageUtils.parseDefault(input, new File(archiveFilePath), 0, collectCertificates); if (result.isError()) { return null; Loading
core/java/android/content/pm/parsing/ParsingPackageUtils.java +11 −2 Original line number Diff line number Diff line Loading @@ -130,15 +130,24 @@ public class ParsingPackageUtils { public static final String TAG = ParsingUtils.TAG; /** * @see #parseDefault(ParseInput, File, int, boolean) */ @NonNull public static ParseResult<ParsingPackage> parseDefaultOneTime(File file, @PackageParser.ParseFlags int parseFlags, boolean collectCertificates) { ParseInput input = ParseTypeImpl.forDefaultParsing().reset(); return parseDefault(input, file, parseFlags, collectCertificates); } /** * For cases outside of PackageManagerService when an APK needs to be parsed as a one-off * request, without caching the input object and without querying the internal system state * for feature support. */ @NonNull public static ParseResult<ParsingPackage> parseDefaultOneTime(File file, public static ParseResult<ParsingPackage> parseDefault(ParseInput input, File file, @PackageParser.ParseFlags int parseFlags, boolean collectCertificates) { ParseInput input = ParseTypeImpl.forDefaultParsing().reset(); ParseResult<ParsingPackage> result; ParsingPackageUtils parser = new ParsingPackageUtils(false, null, null, new Callback() { Loading
core/java/android/content/pm/parsing/result/ParseInput.java +20 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.content.pm.parsing.result; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.ChangeId; Loading Loading @@ -69,6 +70,25 @@ public interface ParseInput { @ChangeId @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) public static final long RESOURCES_ARSC_COMPRESSED = 132742131; /** * TODO(chiuwinson): This is required because PackageManager#getPackageArchiveInfo * cannot read the targetSdk info from the changeId because it requires the * READ_COMPAT_CHANGE_CONFIG which cannot be obtained automatically without entering the * server process. This should be removed once an alternative is found, or if the API * is removed. * @return the targetSdk that this change is gated on (> check), or -1 if disabled */ @IntRange(from = -1, to = Integer.MAX_VALUE) public static int getTargetSdkForChange(long changeId) { if (changeId == MISSING_APP_TAG || changeId == EMPTY_INTENT_ACTION_CATEGORY || changeId == RESOURCES_ARSC_COMPRESSED) { return Build.VERSION_CODES.Q; } return -1; } } <ResultType> ParseResult<ResultType> success(ResultType result); Loading
core/java/android/content/pm/parsing/result/ParseTypeImpl.java +15 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,21 @@ public class ParseTypeImpl implements ParseInput, ParseResult<Object> { private String mPackageName; private Integer mTargetSdkVersion; /** * Specifically for {@link PackageManager#getPackageArchiveInfo(String, int)} where * {@link IPlatformCompat} cannot be used because the cross-package READ_COMPAT_CHANGE_CONFIG * permission cannot be obtained. */ public static ParseTypeImpl forParsingWithoutPlatformCompat() { return new ParseTypeImpl((changeId, packageName, targetSdkVersion) -> { int gateSdkVersion = DeferredError.getTargetSdkForChange(changeId); if (gateSdkVersion == -1) { return false; } return targetSdkVersion > gateSdkVersion; }); } /** * Assumes {@link Context#PLATFORM_COMPAT_SERVICE} is available to the caller. For use * with {@link android.content.pm.parsing.ApkLiteParseUtils} or similar where parsing is Loading