summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmds/sm/src/com/android/commands/sm/Sm.java15
-rw-r--r--core/java/android/os/FileUtils.java12
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java23
3 files changed, 35 insertions, 15 deletions
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java
index 0dad4dc..0a1ba4d 100644
--- a/cmds/sm/src/com/android/commands/sm/Sm.java
+++ b/cmds/sm/src/com/android/commands/sm/Sm.java
@@ -81,6 +81,8 @@ public final class Sm {
runUnmount();
} else if ("format".equals(op)) {
runFormat();
+ } else if ("benchmark".equals(op)) {
+ runBenchmark();
} else if ("forget".equals(op)) {
runForget();
} else {
@@ -89,9 +91,12 @@ public final class Sm {
}
public void runListDisks() throws RemoteException {
+ final boolean onlyAdoptable = "adoptable".equals(nextArg());
final DiskInfo[] disks = mSm.getDisks();
for (DiskInfo disk : disks) {
- System.out.println(disk.getId());
+ if (!onlyAdoptable || disk.isAdoptable()) {
+ System.out.println(disk.getId());
+ }
}
}
@@ -161,6 +166,11 @@ public final class Sm {
mSm.format(volId);
}
+ public void runBenchmark() throws RemoteException {
+ final String volId = nextArg();
+ mSm.benchmark(volId);
+ }
+
public void runForget() throws RemoteException{
final String fsUuid = nextArg();
if ("all".equals(fsUuid)) {
@@ -180,7 +190,7 @@ public final class Sm {
}
private static int showUsage() {
- System.err.println("usage: sm list-disks");
+ System.err.println("usage: sm list-disks [adoptable]");
System.err.println(" sm list-volumes [public|private|emulated|all]");
System.err.println(" sm has-adoptable");
System.err.println(" sm get-primary-storage-uuid");
@@ -190,6 +200,7 @@ public final class Sm {
System.err.println(" sm mount VOLUME");
System.err.println(" sm unmount VOLUME");
System.err.println(" sm format VOLUME");
+ System.err.println(" sm benchmark VOLUME");
System.err.println("");
System.err.println(" sm forget [UUID|all]");
System.err.println("");
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 864225a..af4c2bc 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -16,6 +16,7 @@
package android.os;
+import android.annotation.NonNull;
import android.provider.DocumentsContract.Document;
import android.system.ErrnoException;
import android.system.Os;
@@ -69,6 +70,8 @@ public class FileUtils {
/** Regular expression for safe filenames: no spaces or metacharacters */
private static final Pattern SAFE_FILENAME_PATTERN = Pattern.compile("[\\w%+,./=_-]+");
+ private static final File[] EMPTY = new File[0];
+
/**
* Set owner and mode of of given {@link File}.
*
@@ -634,4 +637,13 @@ public class FileUtils {
return new File(parent, name + "." + ext);
}
}
+
+ public static @NonNull File[] listFilesOrEmpty(File dir) {
+ File[] res = dir.listFiles();
+ if (res != null) {
+ return res;
+ } else {
+ return EMPTY;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c139389..9e7e5ec 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -15600,12 +15600,8 @@ public class PackageManagerService extends IPackageManager.Stub {
* recycled.
*/
private void reconcileUsers(String volumeUuid) {
- final File[] files = Environment.getDataUserDirectory(volumeUuid).listFiles();
- if (ArrayUtils.isEmpty(files)) {
- Slog.d(TAG, "No users found on " + volumeUuid);
- return;
- }
-
+ final File[] files = FileUtils
+ .listFilesOrEmpty(Environment.getDataUserDirectory(volumeUuid));
for (File file : files) {
if (!file.isDirectory()) continue;
@@ -15661,12 +15657,8 @@ public class PackageManagerService extends IPackageManager.Stub {
* another volume.
*/
private void reconcileApps(String volumeUuid) {
- final File[] files = Environment.getDataAppDirectory(volumeUuid).listFiles();
- if (ArrayUtils.isEmpty(files)) {
- Slog.d(TAG, "No apps found on " + volumeUuid);
- return;
- }
-
+ final File[] files = FileUtils
+ .listFilesOrEmpty(Environment.getDataAppDirectory(volumeUuid));
for (File file : files) {
final boolean isPackage = (isApkFile(file) || file.isDirectory())
&& !PackageInstallerService.isStageName(file.getName());
@@ -15797,7 +15789,12 @@ public class PackageManagerService extends IPackageManager.Stub {
}
// Now that we're guarded by frozen state, kill app during move
- killApplication(packageName, appId, "move pkg");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ killApplication(packageName, appId, "move pkg");
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
final Bundle extras = new Bundle();
extras.putString(Intent.EXTRA_PACKAGE_NAME, packageName);