diff options
6 files changed, 32 insertions, 6 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5795cd24f4b1..539e097504d6 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1561,6 +1561,14 @@ public abstract class PackageManager { */ public static final int INSTALL_PARSE_FAILED_RESOURCES_ARSC_COMPRESSED = -124; + /** + * Installation failed return code: the package was skipped and should be ignored. + * + * The reason for the skip is undefined. + * @hide + */ + public static final int INSTALL_PARSE_FAILED_SKIPPED = -125; + /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index addac9853f92..3b3521f834aa 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2001,6 +2001,7 @@ public class PackageParser { Slog.i(TAG, "Skipping target and overlay pair " + pkg.mOverlayTarget + " and " + pkg.baseCodePath+ ": overlay ignored due to required system property: " + propName + " with value: " + propValue); + mParseError = PackageManager.INSTALL_PARSE_FAILED_SKIPPED; return null; } diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 197ad7412a1f..d3d15c82dd1b 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -2347,14 +2347,12 @@ public class ParsingPackageUtils { String propValue = sa.getString( R.styleable.AndroidManifestResourceOverlay_requiredSystemPropertyValue); if (!PackageParser.checkRequiredSystemProperties(propName, propValue)) { - Slog.i(TAG, "Skipping target and overlay pair " + target + " and " + String message = "Skipping target and overlay pair " + target + " and " + pkg.getBaseCodePath() + ": overlay ignored due to required system property: " - + propName + " with value: " + propValue); - return input.error("Skipping target and overlay pair " + target + " and " - + pkg.getBaseCodePath() - + ": overlay ignored due to required system property: " - + propName + " with value: " + propValue); + + propName + " with value: " + propValue; + Slog.i(TAG, message); + return input.skip(message); } return input.success(pkg.setOverlay(true) diff --git a/core/java/android/content/pm/parsing/result/ParseInput.java b/core/java/android/content/pm/parsing/result/ParseInput.java index 6b659bea84f1..d5898b7f57a1 100644 --- a/core/java/android/content/pm/parsing/result/ParseInput.java +++ b/core/java/android/content/pm/parsing/result/ParseInput.java @@ -88,6 +88,14 @@ public interface ParseInput { */ ParseResult<?> enableDeferredError(String packageName, int targetSdkVersion); + /** + * This will assign errorCode to {@link PackageManager#INSTALL_PARSE_FAILED_SKIPPED, used for + * packages which should be ignored by the caller. + * + * @see #error(int, String, Exception) + */ + <ResultType> ParseResult<ResultType> skip(@NonNull String parseError); + /** @see #error(int, String, Exception) */ <ResultType> ParseResult<ResultType> error(int parseError); diff --git a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java index b26bf71a61c5..61152061ae10 100644 --- a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java +++ b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java @@ -147,6 +147,11 @@ public class ParseTypeImpl implements ParseInput, ParseResult<Object> { } @Override + public <ResultType> ParseResult<ResultType> skip(@NonNull String parseError) { + return error(PackageManager.INSTALL_PARSE_FAILED_SKIPPED, parseError); + } + + @Override public <ResultType> ParseResult<ResultType> error(int parseError) { return error(parseError, null); } diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt index 7b1b2d2f5c2b..6de08fd1251f 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt @@ -23,6 +23,7 @@ import android.content.pm.ConfigurationInfo import android.content.pm.FeatureInfo import android.content.pm.InstrumentationInfo import android.content.pm.PackageInfo +import android.content.pm.PackageManager import android.content.pm.PackageParser import android.content.pm.PackageUserState import android.content.pm.PermissionInfo @@ -168,6 +169,11 @@ open class AndroidPackageParsingTestBase { private fun <T> tryOrNull(block: () -> T) = try { block() + } catch (e: PackageParser.PackageParserException) { + if (e.error != PackageManager.INSTALL_PARSE_FAILED_SKIPPED) { + thrownInSetUp.add(e) + } + null } catch (t: Throwable) { thrownInSetUp.add(t) null |