From b8a62ea0c5d0cf27655633e2afa606d1fa88eeca Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Thu, 9 Jul 2015 09:57:41 -0700 Subject: [PATCH] Stop leaking temp directories in SkyShell At startup, we make a list of all the temp directories that already exist and then nuke them on a background thread after a five second delay. The five second delay isn't particularly satisfying, but I think it's wortwhile to get this work off the critical path of startup. R=eseidel@chromium.org, eseidel@google.com Review URL: https://codereview.chromium.org/1228083003 . --- engine/src/flutter/shell/BUILD.gn | 1 + .../domokit/sky/shell/ResourceCleaner.java | 86 +++++++++++++++++++ .../org/domokit/sky/shell/SkyApplication.java | 4 +- 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 engine/src/flutter/shell/android/org/domokit/sky/shell/ResourceCleaner.java diff --git a/engine/src/flutter/shell/BUILD.gn b/engine/src/flutter/shell/BUILD.gn index a3b7cb4d8b..932681bcff 100644 --- a/engine/src/flutter/shell/BUILD.gn +++ b/engine/src/flutter/shell/BUILD.gn @@ -100,6 +100,7 @@ if (is_android) { "android/org/domokit/sky/shell/GestureProvider.java", "android/org/domokit/sky/shell/PlatformServiceProvider.java", "android/org/domokit/sky/shell/PlatformViewAndroid.java", + "android/org/domokit/sky/shell/ResourceCleaner.java", "android/org/domokit/sky/shell/ResourceExtractor.java", "android/org/domokit/sky/shell/ServiceFactory.java", "android/org/domokit/sky/shell/ServiceRegistry.java", diff --git a/engine/src/flutter/shell/android/org/domokit/sky/shell/ResourceCleaner.java b/engine/src/flutter/shell/android/org/domokit/sky/shell/ResourceCleaner.java new file mode 100644 index 0000000000..8aa43a9628 --- /dev/null +++ b/engine/src/flutter/shell/android/org/domokit/sky/shell/ResourceCleaner.java @@ -0,0 +1,86 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.domokit.sky.shell; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Handler; +import android.util.Log; + +import java.io.File; +import java.io.FilenameFilter; + +/** + * A class to clean up orphaned resource directories after unclean shutdowns. + **/ +public class ResourceCleaner { + private static final String TAG = "ResourceCleaner"; + private static final String TEMPORARY_RESOURCE_PREFIX = ".org.chromium.Chromium."; + private static final long DELAY_MS = 5000; + + private class CleanTask extends AsyncTask { + private final File[] mFilesToDelete; + + public CleanTask(File[] filesToDelete) { + mFilesToDelete = filesToDelete; + } + + public boolean hasFilesToDelete() { + return mFilesToDelete.length > 0; + } + + @Override + protected Void doInBackground(Void... unused) { + Log.i(TAG, "Cleaning " + mFilesToDelete.length + " resources."); + for (File file : mFilesToDelete) { + if (file.exists()) { + deleteRecursively(file); + } + } + return null; + } + + private void deleteRecursively(File parent) { + if (parent.isDirectory()) { + for (File child : parent.listFiles()) { + deleteRecursively(child); + } + } + parent.delete(); + } + } + + private final Context mContext; + + public ResourceCleaner(Context context) { + mContext = context; + } + + public void start() { + File cacheDir = mContext.getCacheDir(); + if (cacheDir == null) { + return; + } + + final CleanTask task = new CleanTask(cacheDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + boolean result = name.startsWith(TEMPORARY_RESOURCE_PREFIX); + return result; + } + })); + + if (!task.hasFilesToDelete()) { + return; + } + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + }, DELAY_MS); + } +} diff --git a/engine/src/flutter/shell/android/org/domokit/sky/shell/SkyApplication.java b/engine/src/flutter/shell/android/org/domokit/sky/shell/SkyApplication.java index eabb6608a4..8823440ffd 100644 --- a/engine/src/flutter/shell/android/org/domokit/sky/shell/SkyApplication.java +++ b/engine/src/flutter/shell/android/org/domokit/sky/shell/SkyApplication.java @@ -68,7 +68,9 @@ public class SkyApplication extends BaseChromiumApplication { } private void initResources() { - mResourceExtractor = new ResourceExtractor(getApplicationContext()); + Context context = getApplicationContext(); + new ResourceCleaner(context).start(); + mResourceExtractor = new ResourceExtractor(context); onBeforeResourceExtraction(mResourceExtractor); mResourceExtractor.start(); }