Fixed how com.android.server.pm.Settings handle pre-created users.

Its getAllUsers() method was not returning pre-created users, so
packages installed for a "regular" user were not marked as
"installed=false" for the pre-created users. Hence, when the
pre-created was "promoted" to a full user, it contained such
packages.

Here's how to reproduce the issue:

$ m -j ApiDemos

$ adb shell pm create-user --pre-create-only
Success: created user id 10

$ adb install --user cur $OUT/testcases/ApiDemos/arm64/ApiDemos.apk
Performing Streamed Install
Success

$ adb shell pm list packages --user cur | grep com.example.android.apis || echo
package:com.example.android.apis

$ adb shell pm list packages --user 10 | grep com.example.android.apis || echo "NOT FOUND"
package:com.example.android.apis # Should return "NOT FOUND"

$ adb shell pm create-user FullUserIAm
Success: created user id 10

$ adb shell pm list packages --user 10 | grep com.example.android.apis || echo "NOT FOUND"
package:com.example.android.apis # Should return "NOT FOUND"

With this fix, it returns "NOT FOUND" in the expected steps.

Fixes: 160252062
Fixes: 162847145
Test: see above

Merged-In: I6cd17ac588a4d95bf0ea704dd18387e19eeab374
Change-Id: I6cd17ac588a4d95bf0ea704dd18387e19eeab374
(cherry picked from commit 00175974ba24d982ecfe760ee78a1a17bb326d04)
This commit is contained in:
felipeal
2020-07-27 19:14:36 -07:00
committed by Felipe Leme
parent 429b59c8a4
commit 2b8bf40f60

View File

@@ -2649,7 +2649,7 @@ public final class Settings {
private void writePackageListLPrInternal(int creatingUserId) {
// Only derive GIDs for active users (not dying)
final List<UserInfo> users = getUsers(UserManagerService.getInstance(), true);
final List<UserInfo> users = getActiveUsers(UserManagerService.getInstance(), true);
int[] userIds = new int[users.size()];
for (int i = 0; i < userIds.length; i++) {
userIds[i] = users.get(i).id;
@@ -4325,25 +4325,43 @@ public final class Settings {
}
/**
* Return all users on the device, including partial or dying users.
* Returns all users on the device, including pre-created and dying users.
*
* @param userManager UserManagerService instance
* @return the list of users
*/
private static List<UserInfo> getAllUsers(UserManagerService userManager) {
return getUsers(userManager, false);
return getUsers(userManager, /* excludeDying= */ false, /* excludePreCreated= */ false);
}
/**
* Return the list of users on the device. Clear the calling identity before calling into
* UserManagerService.
* Returns the list of users on the device, excluding pre-created ones.
*
* @param userManager UserManagerService instance
* @param excludeDying Indicates whether to exclude any users marked for deletion.
*
* @return the list of users
*/
private static List<UserInfo> getUsers(UserManagerService userManager, boolean excludeDying) {
private static List<UserInfo> getActiveUsers(UserManagerService userManager,
boolean excludeDying) {
return getUsers(userManager, excludeDying, /* excludePreCreated= */ true);
}
/**
* Returns the list of users on the device.
*
* @param userManager UserManagerService instance
* @param excludeDying Indicates whether to exclude any users marked for deletion.
* @param excludePreCreated Indicates whether to exclude any pre-created users.
*
* @return the list of users
*/
private static List<UserInfo> getUsers(UserManagerService userManager, boolean excludeDying,
boolean excludePreCreated) {
long id = Binder.clearCallingIdentity();
try {
return userManager.getUsers(excludeDying);
return userManager.getUsers(/* excludePartial= */ true, excludeDying,
excludePreCreated);
} catch (NullPointerException npe) {
// packagemanager not yet initialized
} finally {