summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/Installer.java25
-rw-r--r--services/core/java/com/android/server/pm/Settings.java18
2 files changed, 31 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 7cee286c4451..5ac86ca3f6da 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -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;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index f6e4e1f26bd5..53c057a58a15 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -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) {