Udi*_*shi 16 performance android caching android-package-managers
我正在使用反射方法freeStorageAndNotify:
Method freeStorageAndNotify = null;
freeStorageAndNotify = service.packageManager.getClass().getMethod(
"freeStorageAndNotify", long.class, IPackageDataObserver.class);
freeStorageAndNotify.invoke(PackageManager.class, maxCache + freeSpace, packageDataObserver);
Run Code Online (Sandbox Code Playgroud)
这会导致InvocationTargetException:
java.lang.SecurityException: Neither user 10199 nor current process has android.permission.CLEAR_APP_CACHE.
Run Code Online (Sandbox Code Playgroud)
一些要点: - 我已经有android.permission.CLEAR_APP_CACHE - 这只发生在android"M"版本中(从开发者网站闪烁预览sdk)
我知道这是一个黑客攻击,谷歌没有为此提供一些官方API,但是有很多清洁应用程序只需点击一下即可清除所有设备缓存,所以如果有人知道如何通过另一种解决方法绕过这个问题我我很高兴看到这一点.
非常感谢你的帮助
Lau*_* L. 13
Android 5上有一个错误,关于任何应用程序如何能够以常规权限清除所有缓存文件,但除了签名级权限外,无法清除一个程序包的缓存文件.它的细节在哪里
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.
签名系统权限,意味着它只能由使用固件签名密钥签名或安装在系统分区上的应用程序(例如,由root用户设备用户)保存.如本答案所述.
考虑到他们的预期用途/他们的愿景,这是有道理的(没有理由让应用程序使用盲目地擦除单个应用程序的所有缓存文件的方法).它甚至可能因为该bug而受到限制.当Android 6的代码出现时我们会更清楚(当前可用的是5.1.1 - 链接到PackageManager的freeStorageAndNotify).