summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/UserManager.java10
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java47
2 files changed, 38 insertions, 19 deletions
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 0dfb7c380b04..d75ae4cb9868 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1275,6 +1275,16 @@ public class UserManager {
}
/**
+ * @hide
+ * @return Whether the device is running in a headless system user mode. It means the headless
+ * user (system user) runs system services and system UI, but is not associated with any real
+ * person. Secondary users can be created to be associated with real person.
+ */
+ public static boolean isHeadlessSystemUserMode() {
+ return RoSystemProperties.MULTIUSER_HEADLESS_SYSTEM_USER;
+ }
+
+ /**
* @return Whether guest user is always ephemeral
* @hide
*/
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b46ad98c038b..bf46bffd8e4e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2363,32 +2363,41 @@ public class PackageManagerService extends IPackageManager.Stub
}
private void enableSystemUserPackages() {
- if (!UserManager.isSplitSystemUser()) {
+ boolean isHeadlessSystemUserMode = UserManager.isHeadlessSystemUserMode();
+ if (!isHeadlessSystemUserMode && !UserManager.isSplitSystemUser()) {
return;
}
- // For system user, enable apps based on the following conditions:
- // - app is whitelisted or belong to one of these groups:
- // -- system app which has no launcher icons
- // -- system app which has INTERACT_ACROSS_USERS permission
- // -- system IME app
- // - app is not in the blacklist
- AppsQueryHelper queryHelper = new AppsQueryHelper(this);
+
Set<String> enableApps = new ArraySet<>();
- enableApps.addAll(queryHelper.queryApps(AppsQueryHelper.GET_NON_LAUNCHABLE_APPS
- | AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM
- | AppsQueryHelper.GET_IMES, /* systemAppsOnly */ true, UserHandle.SYSTEM));
- ArraySet<String> wlApps = SystemConfig.getInstance().getSystemUserWhitelistedApps();
- enableApps.addAll(wlApps);
- enableApps.addAll(queryHelper.queryApps(AppsQueryHelper.GET_REQUIRED_FOR_SYSTEM_USER,
- /* systemAppsOnly */ false, UserHandle.SYSTEM));
- ArraySet<String> blApps = SystemConfig.getInstance().getSystemUserBlacklistedApps();
- enableApps.removeAll(blApps);
- Log.i(TAG, "Applications installed for system user: " + enableApps);
+ AppsQueryHelper queryHelper = new AppsQueryHelper(this);
List<String> allAps = queryHelper.queryApps(0, /* systemAppsOnly */ false,
UserHandle.SYSTEM);
+
+ if (isHeadlessSystemUserMode) {
+ enableApps.addAll(allAps);
+ } else {
+ // For split system user, select apps based on the following conditions:
+ // -- system app which has no launcher icons
+ // -- system app which has INTERACT_ACROSS_USERS permission
+ // -- system IME app
+ enableApps.addAll(queryHelper.queryApps(AppsQueryHelper.GET_NON_LAUNCHABLE_APPS
+ | AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM
+ | AppsQueryHelper.GET_IMES, /* systemAppsOnly */ true, UserHandle.SYSTEM));
+ enableApps.addAll(queryHelper.queryApps(AppsQueryHelper.GET_REQUIRED_FOR_SYSTEM_USER,
+ /* systemAppsOnly */ false, UserHandle.SYSTEM));
+
+ // Apply whitelist for split system user
+ ArraySet<String> wlApps = SystemConfig.getInstance().getSystemUserWhitelistedApps();
+ enableApps.addAll(wlApps);
+ }
+ // Apply blacklist for split system user/headless system user
+ ArraySet<String> blApps = SystemConfig.getInstance().getSystemUserBlacklistedApps();
+ enableApps.removeAll(blApps);
+ Log.i(TAG, "Blacklisted packages: " + blApps);
+
final int allAppsSize = allAps.size();
synchronized (mPackages) {
- for (int i = 0; i < allAppsSize; i++) {
+ for (int i = 0; i < allAppsSize; i++) {
String pName = allAps.get(i);
PackageSetting pkgSetting = mSettings.mPackages.get(pName);
// Should not happen, but we shouldn't be failing if it does