From f51ced6d1c5a9f4f16cd12c86e697b6597ef4715 Mon Sep 17 00:00:00 2001 From: Kholoud Mohamed Date: Thu, 11 Apr 2024 14:00:01 +0000 Subject: Fix bugreport storage limit We've now introduced a separate limit for deferred bugreports files (.tmp files). Fixes: 330177040 Test: atest com.android.shell.BugreportProgressServiceTest Test: atest android.bugreport.cts_root.BugreportManagerTest#testBugreportsLimitReached Change-Id: Ie4eb8235b17e93baac250bd7ae662b2ba6cca7a3 --- .../android/shell/BugreportProgressService.java | 61 +++++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) (limited to 'packages/Shell/src') 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() { @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() { + @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. */ -- cgit v1.2.3-59-g8ed1b