diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/Installer.java | 25 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/Settings.java | 18 |
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) { |