【问题标题】:Android M reflection method freeStorageAndNotify exceptionAndroid M反射方法freeStorageAndNotify异常
【发布时间】:2015-11-06 12:05:57
【问题描述】:

我使用的是反射方法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)

我知道这是一个 hack,而 google 并没有为此提供一些官方 API, 但是有很多清理应用程序可以一键清理所有设备缓存,所以如果有人知道如何用另一种解决方法绕过这个问题,我会很高兴看到这一点。

非常感谢您的帮助

【问题讨论】:

  • “我已经有 android.permission.CLEAR_APP_CACHE - 这只发生在 android "M" 版本中(从开发者网站上刷新了预览 sdk)" -- 他们可能更改了 protectionLevel 的此权限为signaturesystem。这可以解释症状。
  • 真可惜 :) 我们也只需要绕过它。有什么建议从哪里开始?谢谢
  • 我在framework-res.apk中查看了第三M预览的权限,CLEAR_APP_CACHEDELETE_CACHE_FILES的保护级别确实是signature|system
  • stackoverflow.com/questions/3635101/… 我在那里找到了解决方案(以上链接)。

标签: android performance caching android-package-managers


【解决方案1】:

在 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

签名|系统权限,意味着它只能由以下人员持有 使用固件的签名密钥签名或已安装的应用程序 在系统分区上(例如,由 root 设备用户)。如所述 在this answer

考虑到他们的预期用途/他们的愿景,这是有道理的(应用程序没有理由使用盲目擦除单个应用程序的所有缓存文件的方法)。它甚至可能由于该错误而受到限制。当 Android 6 的代码出来时,我们会知道得更好(目前可用的是5.1.1 - link to PackageManager's freeStorageAndNotify)。

【讨论】:

  • 其他第三方应用程序(例如“Clean master”)如何通过获取用户对 6.0 设备的访问权限来删除所有已安装应用程序的系统缓存?
  • 我想你应该问问他们是怎么做到的。也就是说,如果他们有兴趣揭露它。或者您实际上可以尝试发布这个问题。
【解决方案2】:

请参阅以下页面:permissions by protection levelprotection level definitions

android.permission.CLEAR_APP_CACHE

这属于“签名|特权”保护级别,这意味着只有相同签名或特权应用(基本上是系统签名的)才能拥有此权限。

您还应该查看Behavior Changes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2013-04-24
    • 1970-01-01
    • 2018-04-15
    • 2016-07-22
    • 1970-01-01
    • 2015-11-08
    相关资源
    最近更新 更多