diff options
4 files changed, 32 insertions, 22 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index f4bc1616da2b..2915d852cc26 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -121,6 +121,9 @@ public abstract class PackageManager { /** {@hide} */ public static final boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = true; + /** {@hide} */ + public static final boolean ENABLE_SHARED_UID_MIGRATION = true; + /** * This exception is thrown when a given package, application, or component * name cannot be found. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index e914432630f7..4d4a57db84be 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1944,19 +1944,26 @@ public class PackageParser { TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifest); - String str = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); - if (str != null && str.length() > 0) { - String nameError = validateName(str, true, true); - if (nameError != null && !"android".equals(pkg.packageName)) { - outError[0] = "<manifest> specifies bad sharedUserId name \"" - + str + "\": " + nameError; - mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; - return null; + int maxSdkVersion = 0; + if (PackageManager.ENABLE_SHARED_UID_MIGRATION) { + maxSdkVersion = sa.getInteger( + com.android.internal.R.styleable.AndroidManifest_sharedUserMaxSdkVersion, 0); + } + if (maxSdkVersion == 0 || maxSdkVersion >= Build.VERSION.RESOURCES_SDK_INT) { + String str = sa.getNonConfigurationString( + com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); + if (str != null && str.length() > 0) { + String nameError = validateName(str, true, true); + if (nameError != null && !"android".equals(pkg.packageName)) { + outError[0] = "<manifest> specifies bad sharedUserId name \"" + + str + "\": " + nameError; + mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; + return null; + } + pkg.mSharedUserId = str.intern(); + pkg.mSharedUserLabel = sa.getResourceId( + com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); } - pkg.mSharedUserId = str.intern(); - pkg.mSharedUserLabel = sa.getResourceId( - com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); } pkg.installLocation = sa.getInteger( diff --git a/services/core/java/com/android/server/pm/SharedUidMigration.java b/services/core/java/com/android/server/pm/SharedUidMigration.java index a7d5e9550149..e44ef662efff 100644 --- a/services/core/java/com/android/server/pm/SharedUidMigration.java +++ b/services/core/java/com/android/server/pm/SharedUidMigration.java @@ -17,6 +17,7 @@ package com.android.server.pm; import android.annotation.IntDef; +import android.content.pm.PackageManager; import android.os.Build; import android.os.SystemProperties; @@ -59,22 +60,15 @@ public final class SharedUidMigration { @Retention(RetentionPolicy.SOURCE) public @interface Strategy {} + @Strategy private static final int DEFAULT = BEST_EFFORT; /** - * All shared UID migration is disabled. - * This is not a strategy that can be set with system properties. - * To disable shared UID migration, change {@link #DEFAULT} to this value. - */ - private static final int DISABLED = 0; - - /** * Whether shared UID migration is fully disabled. Disabled means the sharedUserMaxSdkVersion * attribute will be directly ignored in the parsing phase. */ - @SuppressWarnings("ConstantConditions") public static boolean isDisabled() { - return DEFAULT == DISABLED; + return !PackageManager.ENABLE_SHARED_UID_MIGRATION; } /** @@ -88,7 +82,7 @@ public final class SharedUidMigration { final int s = SystemProperties.getInt(PROPERTY_KEY, DEFAULT); // No transition strategies can be used (http://b/221088088) - if (s > BEST_EFFORT || s <= DISABLED) { + if (s > BEST_EFFORT || s < NEW_INSTALL_ONLY) { return DEFAULT; } return s; diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index 63469cb24f2f..124df47345ae 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -122,6 +122,12 @@ public class PackageInfoUtils { info.isStub = pkg.isStub(); info.coreApp = pkg.isCoreApp(); + if (!pkgSetting.hasSharedUser()) { + // It is possible that this shared UID app has left + info.sharedUserId = null; + info.sharedUserLabel = 0; + } + if ((flags & PackageManager.GET_ACTIVITIES) != 0) { final int N = pkg.getActivities().size(); if (N > 0) { |