diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5795cd24f4b1a..539e097504d6e 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 addac9853f923..3b3521f834aa8 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 197ad7412a1fe..d3d15c82dd1bf 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 6b659bea84f1e..d5898b7f57a1a 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) + */ + ParseResult skip(@NonNull String parseError); + /** @see #error(int, String, Exception) */ ParseResult 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 b26bf71a61c57..61152061ae106 100644 --- a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java +++ b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java @@ -146,6 +146,11 @@ public class ParseTypeImpl implements ParseInput, ParseResult { return success(null); } + @Override + public ParseResult skip(@NonNull String parseError) { + return error(PackageManager.INSTALL_PARSE_FAILED_SKIPPED, parseError); + } + @Override public ParseResult 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 7b1b2d2f5c2b2..6de08fd1251f4 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 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