Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e57034a authored by Fyodor Kupolov's avatar Fyodor Kupolov Committed by Android (Google) Code Review
Browse files

Merge "Fix locking error when a new user is created"

parents 1daf35db d8327bd8
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
import static android.content.pm.PackageManager.INSTALL_EXTERNAL;
import static android.content.pm.PackageManager.INSTALL_FAILED_ALREADY_EXISTS;
import static android.content.pm.PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER;
import static android.content.pm.PackageManager.INSTALL_FAILED_DEXOPT;
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION;
import static android.content.pm.PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID;
@@ -94,8 +93,6 @@ import android.app.AppGlobals;
import android.app.IActivityManager;
import android.app.admin.IDevicePolicyManager;
import android.app.backup.IBackupManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -16842,14 +16839,12 @@ public class PackageManagerService extends IPackageManager.Stub {
            mPendingBroadcasts.remove(userHandle);
        }
        synchronized (mInstallLock) {
            if (mInstaller != null) {
            final StorageManager storage = mContext.getSystemService(StorageManager.class);
            for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
                final String volumeUuid = vol.getFsUuid();
                if (DEBUG_INSTALL) Slog.d(TAG, "Removing user data on volume " + volumeUuid);
                mInstaller.removeUserDataDirs(volumeUuid, userHandle);
            }
            }
            synchronized (mPackages) {
                removeUnusedPackagesLILPw(userManager, userHandle);
            }
@@ -16910,19 +16905,15 @@ public class PackageManagerService extends IPackageManager.Stub {
    /** Called by UserManagerService */
    void createNewUser(int userHandle) {
        if (mInstaller != null) {
        synchronized (mInstallLock) {
                synchronized (mPackages) {
            mInstaller.createUserConfig(userHandle);
                    mSettings.createNewUserLILPw(this, mInstaller, userHandle);
                }
            mSettings.createNewUserLI(this, mInstaller, userHandle);
        }
        synchronized (mPackages) {
            applyFactoryDefaultBrowserLPw(userHandle);
            primeDomainVerificationsLPw(userHandle);
        }
    }
    }
    void newUserCreated(final int userHandle) {
        mDefaultPermissionPolicy.grantDefaultPermissions(userHandle);
+38 −12
Original line number Diff line number Diff line
@@ -3644,22 +3644,48 @@ final class Settings {
        }
    }

    void createNewUserLILPw(PackageManagerService service, Installer installer, int userHandle) {
        for (PackageSetting ps : mPackages.values()) {
    void createNewUserLI(@NonNull PackageManagerService service, @NonNull Installer installer,
            int userHandle) {
        String[] volumeUuids;
        String[] names;
        int[] uids;
        String[] seinfos;
        int packagesCount;
        synchronized (mPackages) {
            Collection<PackageSetting> packages = mPackages.values();
            packagesCount = packages.size();
            volumeUuids = new String[packagesCount];
            names = new String[packagesCount];
            uids = new int[packagesCount];
            seinfos = new String[packagesCount];
            Iterator<PackageSetting> packagesIterator = packages.iterator();
            for (int i = 0; i < packagesCount; i++) {
                PackageSetting ps = packagesIterator.next();
                if (ps.pkg == null || ps.pkg.applicationInfo == null) {
                    continue;
                }
                // Only system apps are initially installed.
            ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
            // Need to create a data directory for all apps under this user.
            installer.createUserData(ps.volumeUuid, ps.name,
                    UserHandle.getUid(userHandle, ps.appId), userHandle,
                    ps.pkg.applicationInfo.seinfo);
                ps.setInstalled(ps.isSystem(), userHandle);
                // Need to create a data directory for all apps under this user. Accumulate all
                // required args and call the installer after mPackages lock has been released
                volumeUuids[i] = ps.volumeUuid;
                names[i] = ps.name;
                uids[i] = UserHandle.getUid(userHandle, ps.appId);
                seinfos[i] = ps.pkg.applicationInfo.seinfo;
            }
        }
        for (int i = 0; i < packagesCount; i++) {
            if (names[i] == null) {
                continue;
            }
            installer.createUserData(volumeUuids[i], names[i], uids[i], userHandle, seinfos[i]);
        }
        synchronized (mPackages) {
            applyDefaultPreferredAppsLPw(service, userHandle);
            writePackageRestrictionsLPr(userHandle);
            writePackageListLPr(userHandle);
        }
    }

    void removeUserLPw(int userId) {
        Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();