Changes PM so apps are not installed for pre-created users.
A pre-created user is not ready for use yet, so when an app is installed using USER_ALL, it should not be installed on such user. In particular, doing so can cause multi-user releted CTS tests to fail when the device has pre-created users. Example: - Device has pre-created user 42 - Test infra install TestApp on all users (which include 42) - Test case creates a new user - Framework converts 42 - Test case calls 'pm install-existing --user 42 --wait TestApp' - it will hang Test: adb shell pm create-user --pre-create-only && \ atest CtsAppExitTestCases:android.app.cts.ActivityManagerAppExitInfoTest#testSecondaryUser # on automotive and phone Test: atest CtsCarHostTestCases:android.car.cts.PreCreateUsersHostTest # to make sure it doesn't break anything Bug: 215653069 Bug: 218724421 Change-Id: If261163c024fbdf4121fbcd0971ed784018a2991
This commit is contained in:
@@ -51,13 +51,6 @@ import android.content.pm.SuspendDialogInfo;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.content.pm.VerifierDeviceIdentity;
|
||||
import android.content.pm.overlay.OverlayPaths;
|
||||
import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
|
||||
import com.android.server.pm.pkg.component.ParsedComponent;
|
||||
import com.android.server.pm.pkg.component.ParsedIntentInfo;
|
||||
import com.android.server.pm.pkg.component.ParsedMainComponent;
|
||||
import com.android.server.pm.pkg.component.ParsedPermission;
|
||||
import com.android.server.pm.pkg.component.ParsedProcess;
|
||||
import com.android.server.pm.pkg.PackageUserStateUtils;
|
||||
import android.net.Uri;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
@@ -118,10 +111,18 @@ import com.android.server.pm.permission.LegacyPermissionState.PermissionState;
|
||||
import com.android.server.pm.pkg.PackageStateInternal;
|
||||
import com.android.server.pm.pkg.PackageUserState;
|
||||
import com.android.server.pm.pkg.PackageUserStateInternal;
|
||||
import com.android.server.pm.pkg.PackageUserStateUtils;
|
||||
import com.android.server.pm.pkg.SuspendParams;
|
||||
import com.android.server.pm.pkg.component.ParsedComponent;
|
||||
import com.android.server.pm.pkg.component.ParsedIntentInfo;
|
||||
import com.android.server.pm.pkg.component.ParsedMainComponent;
|
||||
import com.android.server.pm.pkg.component.ParsedPermission;
|
||||
import com.android.server.pm.pkg.component.ParsedProcess;
|
||||
import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
|
||||
import com.android.server.pm.verify.domain.DomainVerificationLegacySettings;
|
||||
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
|
||||
import com.android.server.pm.verify.domain.DomainVerificationPersistence;
|
||||
import com.android.server.utils.Slogf;
|
||||
import com.android.server.utils.Snappable;
|
||||
import com.android.server.utils.SnapshotCache;
|
||||
import com.android.server.utils.TimingsTraceAndSlog;
|
||||
@@ -982,7 +983,8 @@ public final class Settings implements Watchable, Snappable {
|
||||
Slog.i(PackageManagerService.TAG, "Stopping package " + pkgName, e);
|
||||
}
|
||||
List<UserInfo> users = getAllUsers(userManager);
|
||||
final int installUserId = installUser != null ? installUser.getIdentifier() : 0;
|
||||
int installUserId = installUser != null ? installUser.getIdentifier()
|
||||
: UserHandle.USER_SYSTEM;
|
||||
if (users != null && allowInstall) {
|
||||
for (UserInfo user : users) {
|
||||
// By default we consider this app to be installed
|
||||
@@ -993,8 +995,14 @@ public final class Settings implements Watchable, Snappable {
|
||||
// user we are installing for.
|
||||
final boolean installed = installUser == null
|
||||
|| (installUserId == UserHandle.USER_ALL
|
||||
&& !isAdbInstallDisallowed(userManager, user.id))
|
||||
&& !isAdbInstallDisallowed(userManager, user.id)
|
||||
&& !user.preCreated)
|
||||
|| installUserId == user.id;
|
||||
if (DEBUG_MU) {
|
||||
Slogf.d(TAG, "createNewSetting(pkg=%s, installUserId=%s, user=%s, "
|
||||
+ "installed=%b)",
|
||||
pkgName, installUserId, user.toFullString(), installed);
|
||||
}
|
||||
pkgSetting.setUserState(user.id, 0, COMPONENT_ENABLED_STATE_DEFAULT,
|
||||
installed,
|
||||
true /*stopped*/,
|
||||
@@ -2039,11 +2047,14 @@ public final class Settings implements Watchable, Snappable {
|
||||
|
||||
serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
|
||||
|
||||
if (DEBUG_MU) Log.i(TAG, "Writing " + userPackagesStateFile);
|
||||
if (DEBUG_MU) {
|
||||
Slogf.i(TAG, "Writing %s (%d packages)", userPackagesStateFile,
|
||||
mPackages.values().size());
|
||||
}
|
||||
for (final PackageSetting pkg : mPackages.values()) {
|
||||
final PackageUserStateInternal ustate = pkg.readUserState(userId);
|
||||
if (DEBUG_MU) {
|
||||
Log.i(TAG, " pkg=" + pkg.getPackageName()
|
||||
Log.v(TAG, " pkg=" + pkg.getPackageName()
|
||||
+ ", installed=" + ustate.isInstalled()
|
||||
+ ", state=" + ustate.getEnabledState());
|
||||
}
|
||||
@@ -5617,7 +5628,8 @@ public final class Settings implements Watchable, Snappable {
|
||||
userId);
|
||||
packageSetting.setInstallPermissionsFixed(true);
|
||||
} else if (packageSetting.getSharedUser() == null && !isUpgradeToR) {
|
||||
Slog.w(TAG, "Missing permission state for package: " + packageName);
|
||||
Slogf.w(TAG, "Missing permission state for package %s on user %d",
|
||||
packageName, userId);
|
||||
packageSetting.getLegacyPermissionState().setMissing(true, userId);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user