24

在我正在制作的 Android 应用程序中,我希望能够以编程方式清除设备上所有应用程序的缓存。这已经被问过很多次了:以 编程方式清除应用程序缓存? 清除Android应用缓存的反射方法 清除另一个应用程序缓存 ,每个人都说没有root是不可能的。

然而,情况显然并非如此。如果您查看 Google Play 中的 App Cache Cleaner、History Eraser、1Tap Cleaner、Easy History Cleaner 和无数其他类似的应用程序(所有这些都不需要 root),您会发现它们都可以做到这一点。因此,这是可能的,但我找不到任何公开的例子来做到这一点。

有谁知道所有这些应用程序在做什么?

谢谢

4

2 回答 2

34

这是一种不需要的方法IPackageDataObserver.aidl

PackageManager  pm = getPackageManager();
// Get all methods on the PackageManager
Method[] methods = pm.getClass().getDeclaredMethods();
for (Method m : methods) {
    if (m.getName().equals("freeStorage")) {
        // Found the method I want to use
        try {
            long desiredFreeStorage = 8 * 1024 * 1024 * 1024; // Request for 8GB of free space
            m.invoke(pm, desiredFreeStorage , null);
        } catch (Exception e) {
            // Method invocation failed. Could be a permission problem
        }
        break;
    }
}

您需要在清单中包含此内容:

<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>

这要求 Android 清除足够多的缓存文件,以便有 8GB 可用空间。如果您将此数字设置得足够高,您应该可以达到您想要的效果(Android 将删除缓存中的所有文件)。

其工作方式是,Android 保留所有应用程序缓存目录中所有文件的 LRU(最近最少使用)列表。当您调用freeStorage()它时,检查是否有存储量(在本例中为 8GB)可用于缓存文件。如果没有,它首先删除最旧的文件,开始从应用程序的缓存目录中删除文件。它会继续删除文件,直到不再有任何文件要删除,或者它已释放您请求的存储量(在本例中为 8GB)。

于 2013-01-24T19:25:51.300 回答
4

您可以使用 (freeStorageAndNotify)方法清除所有应用程序的数据。您必须使用 java 反射访问此方法。您将需要 IPackageDataObserver.aidl。您还需要在清单文件中拥有删除缓存的权限

于 2013-01-24T18:13:14.543 回答