【问题标题】:Android: Clear Cache of All Apps?Android:清除所有应用程序的缓存?
【发布时间】:2013-01-08 13:09:37
【问题描述】:

在我正在制作的 Android 应用中,我希望能够以编程方式清除设备上所有应用的缓存。这个问题之前已经问过很多次了: Clearing app cache programmatically? Reflecting methods to clear Android app cache Clear another applications cache 每个人都说没有root是不可能的。

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

有人知道所有这些应用都在做什么吗?

谢谢

【问题讨论】:

  • 你给开发者发邮件了吗?其中一位可能愿意泄露他们的代码。
  • 您链接到的问题是关于清除个别应用程序的缓存。如果不持有仅适用于系统分区上安装的应用程序(例如,由 root 用户)或使用固件签名密钥签名的应用程序,这是不可能的。您引用的应用程序提供清除所有应用程序的缓存,而不是单个应用程序的缓存。出于难以理解的原因,可以在未经任何许可的情况下擦除所有应用程序的缓存,但通过 Android SDK 是不可能的。
  • @CommonsWare 实际上,为了清除缓存文件,您确实需要权限“android.permission.CLEAR_APP_CACHE”
  • @DavidWasser:啊,抱歉,我记错了。但是,CLEAR_APP_CACHE 是您可以持有的,而 delete-only-one-app's-cache 需要signature|system 权限。
  • @CommonsWare 没问题。我们有时都会记错 ;-) 我不会反对你

标签: android caching


【解决方案1】:

这是一种不需要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)是否可用于缓存文件。如果没有,它首先删除 oldest 文件,开始从应用程序的缓存目录中删除文件。它会继续删除文件,直到不再有要删除的文件,或者释放了您请求的存储空间(在本例中为 8GB)。

【讨论】:

  • 因此,如果我想确保它清除所有内容,那么将其设置为像 256GB 这样荒谬的东西会有什么问题吗?因为有些设备有 16GB 或 32GB 的内部存储
  • 好的,我通过使用 freeStorageAndNotify 而不是 freeStorage 让它工作了。我尝试将 IPackageDataObserver 设置为 null,它确实有效,因此它实际上是一个可选参数,即使它在方法描述中没有说明。编辑:对于任何试图清除所有缓存的人,请将 desiredFreeStorage 更改为 Long.MAX_VALUE
  • 很高兴您能够让它工作,并感谢您的反馈。我很好奇为什么freeStorage() 不起作用。我需要花更多时间在那个上面。
  • 此外,您拥有的代码只会清除足够多的缓存文件以释放 8GB。如果您已经有 8GB 的​​可用存储空间,则此代码将无济于事。如果你真的想删除所有缓存的文件,设置desiredFreeStorage = Long.MAX_VALUE
  • @BrijeshPatel 您可以使用 ROOT 或使用 PC 来完成。如果你愿意,我可以告诉你怎么做。我在我的应用程序上做到了:play.google.com/store/apps/…
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2015-03-27
相关资源
最近更新 更多