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
This commit is contained in:
John Wu
2022-03-01 17:54:42 -08:00
parent 2f11dc5ef3
commit 07ad5ff07a
4 changed files with 32 additions and 22 deletions

View File

@@ -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.

View File

@@ -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(

View File

@@ -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;

View File

@@ -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) {