summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson <chiuwinson@google.com> 2020-04-30 13:19:36 -0700
committer Winson <chiuwinson@google.com> 2020-05-01 10:49:15 -0700
commitb58595b767ca2364cf2189046fc6c40267ef03e5 (patch)
tree4581c7e6f810141258935b52d38c144fb3e5fc0e
parent094e5ddbd37640d7840bedabf64cbc0126835262 (diff)
Add skip functionality to package parsing
There are specific cases where a package should be ignored by whoever is parsing it, either because the device was configured to ignore it, or the device doesn't support it. While mostly used for testing, this adds a skip method to ParseInput and a matching install error code to explicitly express this case during parsing. Bug: 155420149 Test: atest com.android.server.pm.parsing Change-Id: I7eff53544341e21108d9d027f3afe75a1e845f40
-rw-r--r--core/java/android/content/pm/PackageManager.java8
-rw-r--r--core/java/android/content/pm/PackageParser.java1
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java10
-rw-r--r--core/java/android/content/pm/parsing/result/ParseInput.java8
-rw-r--r--core/java/android/content/pm/parsing/result/ParseTypeImpl.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt6
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 6a5e6ca289b3..14ea248cc668 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1560,6 +1560,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 8a57f826ad2e..e953402aa2d0 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 4e189796bc48..87b34bb81aca 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2348,14 +2348,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