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

Commit e7c2327d authored by Ben Murdoch's avatar Ben Murdoch
Browse files

Batch calls to create app data for new users.

This significantly reduces IPC traffic between system server
and installd, resulting in a performance increase in
time to create a new user.

See associated installd API change:
https://android-review.googlesource.com/c/platform/frameworks/native/+/1285395

Bug: 153171028
Test: create guest user manually, trace with Perfetto.
Change-Id: I235730809cc0d9bf5dc94d1befdd3bafc43ae87c
parent f8a8da9a
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import dalvik.system.BlockGuard;
import dalvik.system.VMRuntime;

import java.io.FileDescriptor;
import java.util.Arrays;

public class Installer extends SystemService {
    private static final String TAG = "Installer";
@@ -184,6 +185,30 @@ public class Installer extends SystemService {
        }
    }

    /**
     * Batched version of createAppData for use with multiple packages.
     */
    public void createAppDataBatched(String[] uuids, String[] packageNames, int userId, int flags,
            int[] appIds, String[] seInfos, int[] targetSdkVersions) throws InstallerException {
        if (!checkBeforeRemote()) return;
        final int batchSize = 256;
        for (int i = 0; i < uuids.length; i += batchSize) {
            int to = i + batchSize;
            if (to > uuids.length) {
                to = uuids.length;
            }

            try {
                mInstalld.createAppDataBatched(Arrays.copyOfRange(uuids, i, to),
                        Arrays.copyOfRange(packageNames, i, to), userId, flags,
                        Arrays.copyOfRange(appIds, i, to), Arrays.copyOfRange(seInfos, i, to),
                        Arrays.copyOfRange(targetSdkVersions, i, to));
            } catch (Exception e) {
                throw InstallerException.from(e);
            }
        }
    }

    public void restoreconAppData(String uuid, String packageName, int userId, int flags, int appId,
            String seInfo) throws InstallerException {
        if (!checkBeforeRemote()) return;
+6 −12
Original line number Diff line number Diff line
@@ -4213,19 +4213,13 @@ public final class Settings {
            }
        }
        t.traceBegin("createAppData");
        for (int i = 0; i < packagesCount; i++) {
            if (names[i] == null) {
                continue;
            }
            // TODO: triage flags!
        final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
        try {
                installer.createAppData(volumeUuids[i], names[i], userHandle, flags, appIds[i],
                        seinfos[i], targetSdkVersions[i]);
            installer.createAppDataBatched(volumeUuids, names, userHandle, flags, appIds, seinfos,
                    targetSdkVersions);
        } catch (InstallerException e) {
            Slog.w(TAG, "Failed to prepare app data", e);
        }
        }
        t.traceEnd(); // createAppData
        synchronized (mLock) {
            applyDefaultPreferredAppsLPw(userHandle);