From 07ad5ff07a7165cb319abd307fe4181bb3501ec3 Mon Sep 17 00:00:00 2001 From: John Wu Date: Tue, 1 Mar 2022 17:54:42 -0800 Subject: [PATCH] Update PackageInfo APIs to reflect shared UID status Properly reflect the current status of shared UID in several PackageManager public APIs that returns PackageInfo. For getPackageArchiveInfo, we only consider the sharedUserMaxSdkVersion attribute as a best effort to reflect the APK status. Test: atest CtsSharedUserMigrationTestCases Bug: 220015249 Change-Id: I9a0c5d5ad0dee19a86ab9f2af6deb254d8b5cbb7 --- .../android/content/pm/PackageManager.java | 3 ++ .../android/content/pm/PackageParser.java | 31 ++++++++++++------- .../android/server/pm/SharedUidMigration.java | 14 +++------ .../server/pm/parsing/PackageInfoUtils.java | 6 ++++ 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 f4bc1616da2b9..2915d852cc26d 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 e914432630f71..4d4a57db84bea 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] = " 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] = " 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 a7d5e95501496..e44ef662efff8 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 63469cb24f2fd..124df47345ae6 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) {