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:
@@ -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.
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user