diff options
-rw-r--r-- | core/java/android/app/admin/flags/flags.aconfig | 24 | ||||
-rw-r--r-- | packages/Shell/Android.bp | 3 | ||||
-rw-r--r-- | packages/Shell/src/com/android/shell/BugreportProgressService.java | 61 |
3 files changed, 74 insertions, 14 deletions
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig index 31c9a258da56..18914e120d52 100644 --- a/core/java/android/app/admin/flags/flags.aconfig +++ b/core/java/android/app/admin/flags/flags.aconfig @@ -275,13 +275,23 @@ flag { } flag { - name: "headless_single_user_bad_device_admin_state_fix" - namespace: "enterprise" - description: "Fix the bad state in DPMS caused by an earlier bug related to the headless single user change" - bug: "332477138" - metadata { - purpose: PURPOSE_BUGFIX - } + name: "headless_single_user_bad_device_admin_state_fix" + namespace: "enterprise" + description: "Fix the bad state in DPMS caused by an earlier bug related to the headless single user change" + bug: "332477138" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + name: "onboarding_bugreport_storage_bug_fix" + namespace: "enterprise" + description: "Add a separate storage limit for deferred bugreports" + bug: "330177040" + metadata { + purpose: PURPOSE_BUGFIX + } } flag { diff --git a/packages/Shell/Android.bp b/packages/Shell/Android.bp index c87916fa3b95..253145468e47 100644 --- a/packages/Shell/Android.bp +++ b/packages/Shell/Android.bp @@ -19,6 +19,9 @@ android_app { include_dirs: ["frameworks/native/cmds/dumpstate/binder"], }, static_libs: shell_static_libs, + libs: [ + "device_policy_aconfig_flags_lib", + ], platform_apis: true, certificate: "platform", privileged: true, diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 5ac0e449b8e1..bcfd8f620f9c 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -16,6 +16,7 @@ package com.android.shell; +import static android.app.admin.flags.Flags.onboardingBugreportStorageBugFix; import static android.content.pm.PackageManager.FEATURE_LEANBACK; import static android.content.pm.PackageManager.FEATURE_TELEVISION; import static android.os.Process.THREAD_PRIORITY_BACKGROUND; @@ -89,10 +90,10 @@ import com.android.internal.app.ChooserActivity; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.google.android.collect.Lists; - import libcore.io.Streams; +import com.google.android.collect.Lists; + import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; @@ -109,6 +110,8 @@ import java.security.NoSuchAlgorithmException; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; @@ -442,10 +445,14 @@ public class BugreportProgressService extends Service { } } - private static void sendRemoteBugreportFinishedBroadcast(Context context, + private void sendRemoteBugreportFinishedBroadcast(Context context, String bugreportFileName, File bugreportFile, long nonce) { - cleanupOldFiles(REMOTE_BUGREPORT_FILES_AMOUNT, REMOTE_MIN_KEEP_AGE, - bugreportFile.getParentFile()); + // Remote bugreports are stored in the same directory as normal bugreports, meaning that + // the remote bugreport storage limit will get applied to normal bugreports whenever a + // remote bugreport is triggered. The fix in cleanupOldFiles applies the normal bugreport + // limit to the remote bugreports as a quick fix. + cleanupOldFiles( + REMOTE_BUGREPORT_FILES_AMOUNT, REMOTE_MIN_KEEP_AGE, bugreportFile.getParentFile()); final Intent intent = new Intent(DevicePolicyManager.ACTION_REMOTE_BUGREPORT_DISPATCH); final Uri bugreportUri = getUri(context, bugreportFile); final String bugreportHash = generateFileHash(bugreportFileName); @@ -496,12 +503,16 @@ public class BugreportProgressService extends Service { return fileHash; } - static void cleanupOldFiles(final int minCount, final long minAge, File bugreportsDir) { + void cleanupOldFiles(final int minCount, final long minAge, File bugreportsDir) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { - FileUtils.deleteOlderFiles(bugreportsDir, minCount, minAge); + if (onboardingBugreportStorageBugFix()) { + cleanupOldBugreports(); + } else { + FileUtils.deleteOlderFiles(bugreportsDir, minCount, minAge); + } } catch (RuntimeException e) { Log.e(TAG, "RuntimeException deleting old files", e); } @@ -510,6 +521,42 @@ public class BugreportProgressService extends Service { }.execute(); } + private void cleanupOldBugreports() { + final File[] files = mBugreportsDir.listFiles(); + if (files == null) return; + + // Sort with newest files first + Arrays.sort(files, new Comparator<File>() { + @Override + public int compare(File lhs, File rhs) { + return Long.compare(rhs.lastModified(), lhs.lastModified()); + } + }); + + int normalBugreportFilesCount = 0; + int deferredBugreportFilesCount = 0; + for (int i = 0; i < files.length; i++) { + final File file = files[i]; + + // tmp files are deferred bugreports which have their separate storage limit + boolean isDeferredBugreportFile = file.getName().endsWith(".tmp"); + if (isDeferredBugreportFile) { + deferredBugreportFilesCount++; + } else { + normalBugreportFilesCount++; + } + // Keep files newer than minAgeMs + final long age = System.currentTimeMillis() - file.lastModified(); + final int count = isDeferredBugreportFile + ? deferredBugreportFilesCount : normalBugreportFilesCount; + if (count > MIN_KEEP_COUNT && age > MIN_KEEP_AGE) { + if (file.delete()) { + Log.d(TAG, "Deleted old file " + file); + } + } + } + } + /** * Main thread used to handle all requests but taking screenshots. */ |