Cherry pick: Batch calls to create app data for new users. DO NOT MERGE

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: I6551781e5c2e184b490c4939bd75333cdb48be55
This commit is contained in:
Ben Murdoch
2020-04-16 11:57:07 +01:00
parent 31b94bfc1e
commit 5ecf6fbaab
2 changed files with 31 additions and 12 deletions

View File

@@ -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";
@@ -186,6 +187,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;

View File

@@ -4207,18 +4207,12 @@ 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]);
} catch (InstallerException e) {
Slog.w(TAG, "Failed to prepare app data", e);
}
final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
try {
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) {