From 70fd00bf2f69ae0d56a184d24322c036818253c6 Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Wed, 9 Feb 2022 14:14:32 -0800 Subject: [PATCH] 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 --- .../java/com/android/server/pm/Settings.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 279de830476a8..0575b8c9d6dc1 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -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 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); } }