diff options
author | Jeff Sharkey <jsharkey@android.com> | 2013-03-01 16:12:55 -0800 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2013-03-01 16:36:52 -0800 |
commit | 63d0a067997cecf9c6e97a17852f9b657bbba48e (patch) | |
tree | f0adf8683e433a706074a5390292fce6df56928e /packages/DefaultContainerService | |
parent | 02a4cec107f1f07409fd03106b1cde56043894fa (diff) | |
download | frameworks_base-63d0a067997cecf9c6e97a17852f9b657bbba48e.zip frameworks_base-63d0a067997cecf9c6e97a17852f9b657bbba48e.tar.gz frameworks_base-63d0a067997cecf9c6e97a17852f9b657bbba48e.tar.bz2 |
Improve performance of storage measurement.
When calculating directory sizes of data living on emulated external
storage, translate the path to use the internal backing data, which
avoids going through the emulation layer. It carefully retreats to
the original path when it runs into trouble.
Testing with a hierarchy of 10 directories deep and 2 directories
and 10 files wide at each level, this change improves performance
from 5900ms before to 250ms after; over 20 times faster (!).
Bug: 8172425
Change-Id: Ia7365416f091e102bf7345a49f7d7209a22580a9
Diffstat (limited to 'packages/DefaultContainerService')
-rw-r--r-- | packages/DefaultContainerService/AndroidManifest.xml | 2 | ||||
-rw-r--r-- | packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java | 19 |
2 files changed, 13 insertions, 8 deletions
diff --git a/packages/DefaultContainerService/AndroidManifest.xml b/packages/DefaultContainerService/AndroidManifest.xml index 3dcd232..57c87e4 100644 --- a/packages/DefaultContainerService/AndroidManifest.xml +++ b/packages/DefaultContainerService/AndroidManifest.xml @@ -7,6 +7,8 @@ <uses-permission android:name="android.permission.ASEC_DESTROY"/> <uses-permission android:name="android.permission.ASEC_MOUNT_UNMOUNT"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <!-- Used to improve MeasureUtils performance on emulated storage --> + <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" /> <uses-permission android:name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" /> diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java index 731a09c..de77cac 100644 --- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java +++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java @@ -16,16 +16,12 @@ package com.android.defcontainer; -import com.android.internal.app.IMediaContainerService; -import com.android.internal.content.NativeLibraryHelper; -import com.android.internal.content.PackageHelper; - import android.app.IntentService; import android.content.Intent; -import android.content.pm.MacAuthenticatedInputStream; import android.content.pm.ContainerEncryptionParams; import android.content.pm.IPackageManager; import android.content.pm.LimitedLengthInputStream; +import android.content.pm.MacAuthenticatedInputStream; import android.content.pm.PackageCleanItem; import android.content.pm.PackageInfo; import android.content.pm.PackageInfoLite; @@ -43,10 +39,16 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.StatFs; +import android.os.SystemClock; import android.provider.Settings; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Slog; +import com.android.internal.app.IMediaContainerService; +import com.android.internal.content.NativeLibraryHelper; +import com.android.internal.content.PackageHelper; + import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -228,9 +230,10 @@ public class DefaultContainerService extends IntentService { public long calculateDirectorySize(String path) throws RemoteException { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - final File directory = new File(path); - if (directory.exists() && directory.isDirectory()) { - return MeasurementUtils.measureDirectory(path); + final File dir = Environment.maybeTranslateEmulatedPathToInternal(new File(path)); + if (dir.exists() && dir.isDirectory()) { + final String targetPath = dir.getAbsolutePath(); + return MeasurementUtils.measureDirectory(targetPath); } else { return 0L; } |