我使用反射方法freeStorageAndNotify:
Method freeStorageAndNotify = null;
freeStorageAndNotify = service.packageManager.getClass().getMethod(
"freeStorageAndNotify", long.class, IPackageDataObserver.class);
freeStorageAndNotify.invoke(PackageManager.class, maxCache + freeSpace, packageDataObserver);
这会导致InvocationTargetException:
java.lang.SecurityException: Neither user 10199 nor current process has android.permission.CLEAR_APP_CACHE.
有些观点: - 我已经有了android.permission.CLEAR_APP_CACHE - 这只发生在android" M"版本(从开发者网站闪烁预览sdk)
我知道这是一个黑客,谷歌没有为此带来一些官方API, 但是有很多清洁应用程序只需点击一下即可清除所有设备缓存,因此,如果有人知道如何通过另一种解决方法绕过此问题,我将很高兴看到这一点。
非常感谢您的帮助
答案 0 :(得分:12)
Android 5上有a bug关于任何应用程序如何以常规权限清除所有缓存文件,但无法删除一个程序包的缓存文件,除非具有签名级权限。
的详细信息
PackageManager
有deleteApplicationCacheFiles()
从一个包中删除缓存。 这个方法对SDK是隐藏的,它需要DELETE_CACHE_FILES
,签名级权限。
PackageManager
还有一个freeStorageAndNotify()
方法可供删除 缓存所有包中的文件。此方法对SDK隐藏,并且 它需要CLEAR_APP_CACHE
权限,该权限仅被标记 为“危险”。
建议DELETE_CACHE_FILES应该放宽其级别, CLEAR_APP_CACHE应该提高其级别。
框架工程师回复了
请注意,
freeStorageAndNotify's
目的不会消除所有缓存 文件,但要释放X空间,例如通过Play商店 在它尝试下载并安装应用程序之前。所以有理由 使用它与系统很好地工作,但没有理由的应用程序 使用盲目擦除单个缓存文件的方法 应用程序(仅适用于“设置”应用程序UI)。
如果确实不是应用程序错误,即你没有弄乱权限,它可以在Marshmallow / 6 / api 23上运行而不是其他只能意味着它成为签名级别权限的人同样,DELETE_CACHE_FILES
。
签名系统权限,意味着它只能被保留 使用固件的签名密钥签名或已安装的应用程序 在系统分区上(例如,由有根设备的用户)。如上所述 在this answer。
考虑到他们的预期用途/他们的愿景,这是有道理的(没有理由让应用程序使用盲目地擦除单个应用程序的所有缓存文件的方法)。它甚至可能因为该bug而受到限制。当Android 6的代码出现时,我们会更清楚(当前可用的是5.1.1 - link to PackageManager's freeStorageAndNotify)。
答案 1 :(得分:2)
请参阅以下页面:permissions by protection level和protection level definitions。
android.permission.CLEAR_APP_CACHE
这属于保护级别“signature | privileged”,这意味着只有相同签名或特权应用程序(基本上是系统签名)才能拥有此权限。
另外,您应该查看Behavior Changes一般。