2016-04-24 56 views
10

有没有一个选项可以删除Android M中所有应用程序或某些应用程序的缓存?如何删除Android M中所有应用的应用缓存?

好像很多方面不安卓M.

工作了,因为我用这个代码到我们的讨论的参考:拥有此权限

<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/> 
结合 Android: Clear Cache of All Apps?

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; 
    } 
} 

此代码适用于低于Android 6.0的设备。但在与Android 6.0设备也导致此异常

java.lang.IllegalArgumentException: Wrong number of arguments; expected 3, got 2 

有GitHub上,它停止开发这个原因一个开源的清洁:

部分不相容性,与Android 6.0及更高版本

从Android 6.0开始,CLEAR_APP_CACHE许可似乎不是 对于常规应用程序可用更长,并且由于此许可n是 需要清理内部缓存,Cache Cleaner无法在Android 6.0及更新版本上清除内部缓存。但是,仍然支持清除 外部缓存。

确实没有办法,删除Android M设备上的应用缓存?

Google设置应用程序如何处理它? 它不能成为新的方法:

public abstract void freeStorage(String volumeUuid, long freeStorageSize, 
     IntentSender pi) 

,因为我认为它不会删除缓存某些应用程序,但足够的应用程序清除预期的RAM大小......但设置应用程序可以清除某些应用

UPDATE 的缓存就像除外答案解释,似乎是没有办法删除THA应用程序缓存,而不对与Android米及以上设备的根目录。但我会张贴在这里,如果我找到一个方法....

+0

由于棉花糖,命令'亚行外壳时修剪,缓存10m'失败'无论使用者2000也不当前进程android.permission.CLEAR_APP_CACHE.'看起来像一个bug – cuihtlauac

+2

http://stackoverflow.com/a/32070819/3919009 –

回答

4

是否有删除版本的Android M所有的应用程序或某些应用程序的高速缓存的选项?

第三方应用程序无法删除Android 6.0+中的其他应用程序的缓存。在Android 6.0+中,Manifest.permission.CLEAR_APP_CACHE的保护等级从“危险”更改为“签名”或“系统签名”。现在,只有使用固件密钥签名的应用才能拥有此权限。

确实没有办法删除Android M设备上的应用缓存?

除非应用程序作为系统应用程序安装,或者您拥有超级用户权限,否则无法在Android 6.0+上删除应用程序缓存。

Settings应用程序如何处理它?

Android当然是开源的。让我们看看代码。在AppStorageSettings.java线172 - 178,我们发现:

if (v == mClearCacheButton) { 
    // Lazy initialization of observer 
    if (mClearCacheObserver == null) { 
     mClearCacheObserver = new ClearCacheObserver(); 
    } 
    mPm.deleteApplicationCacheFiles(mPackageName, mClearCacheObserver); 
} 

因此,设置应用程序使用的隐藏方法PackageManager#deleteApplicationCacheFiles(String, IPackageDataObserver)。它可以这样做,因为它拥有系统级权限"android.permission.CLEAR_APP_USER_DATA"a permission a third-party app cannot hold)。


外部高速缓存

然而,外部缓存的清洗仍然支持。

这仍然可以在Android 6.0+上使用。我没有看过你提到的应用程序的源代码,但我认为你需要做的只是请求WRITE_EXTERNAL_STORAGE权限,使用PackageManager获取所有已安装的软件包,获取应用程序的external cache directory并删除目录。


根访问

当然,如果你有root权限,你可以删除其他应用的缓存。以下是使用root访问权限删除所有应用程序缓存的简单示例。您可以使用Chainfire的libsuperuser到一个root shell中运行命令:

PackageManager pm = getPackageManager(); 
List<ApplicationInfo> installedApplications = pm.getInstalledApplications(0); 
for (ApplicationInfo applicationInfo : installedApplications) { 
    try { 
    Context packageContext = createPackageContext(applicationInfo.packageName, 0); 
    List<File> directories = new ArrayList<>(); 
    directories.add(packageContext.getCacheDir()); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     Collections.addAll(directories, packageContext.getExternalCacheDirs()); 
    } else { 
     directories.add(packageContext.getExternalCacheDir()); 
    } 

    StringBuilder command = new StringBuilder("rm -rf"); 
    for (File directory : directories) { 
     command.append(" \"" + directory.getAbsolutePath() + "\""); 
    } 

    Shell.SU.run(command.toString()); 
    } catch (PackageManager.NameNotFoundException wtf) { 
    } 
} 
+1

你好,谢谢你的回答:)但是Playstore All-in-One工具箱中有一个应用程序“play.google.com/store/apps/...;;;;;;;;;;;;;;;;;”的其他应用程序。 –

0

欲了解更多信息,请参阅我的回答Clear Cache of All Apps in Marshmallow?

在Android中6(棉花糖)有一个额外的freeStorage()方法,它接受volumeUuid参数:

public void freeStorage(long freeStorageSize, IntentSender pi) 

public abstract void freeStorage(String volumeUuid, long freeStorageSize, 
     IntentSender pi) 

很明显,新的方法首先出现在声明的方法的返回列表中。

,使它看起来像这样顶级的工作,您可以更改原单代码的Android 6:

PackageManager pm = getPackageManager(); 
// Get all methods on the PackageManager 
Method[] methods = pm.getClass().getDeclaredMethods(); 
for (Method m : methods) { 
    if (m.getName().equals("freeStorage")) { 
     Class[] params = m.getParameterTypes(); 
     if (params.length == 2) { 
      // 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; 
     } 
    } 
} 
+0

@Chris Sherlock,你用这个答案解决了吗? – 2016-04-30 04:42:03

+0

请帮助我们。如果可能的话。我们从上面的答案中得到同样的问题 – 2016-04-30 04:44:38

+0

不幸的是,它似乎并没有清除任何缓存,但没有抛出异常。 –

相关问题