Android M 反射方法 freeStorageAndNotify 异常

17

我正在使用反射方法 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 权限 - 这只会在安卓"M"版本中出现(从开发者网站闪存预览SDK)

我知道这是一个hack,而且谷歌没有为此提供官方API,但有很多清理应用程序可以在一个点击中清理所有设备缓存,所以如果有人知道如何通过其他解决方法绕过此问题,我会很高兴看到那个。
非常感谢您的帮助


3
我已经拥有android.permission.CLEAR_APP_CACHE权限 - 这只在Android "M"版本中发生(从开发者网站下载了预览SDK)。可能他们将此权限的保护级别更改为签名或系统级别,这可以解释这些症状。 - CommonsWare
真遗憾 :) 我们只需要绕过那个问题。有什么建议从哪里开始吗?谢谢 - Udi Oshi
2
我检查了第三个M预览版中framework-res.apk的权限,确实对于CLEAR_APP_CACHEDELETE_CACHE_FILES两者的保护级别都是signature|system - Kane O'Riley
我在上面的链接中找到了解决方案。 - Neha Sharma
2个回答

14

有关Android 5的一个漏洞bug,任何应用程序都可以使用普通权限清除所有缓存文件,但除非具有签名级别的权限,否则无法清除一个包的缓存文件。其中详细信息如下:

PackageManager有一个deleteApplicationCacheFiles()方法,可以删除一个包中的缓存。该方法已从SDK中隐藏,并需要签名级别的DELETE_CACHE_FILES权限。

PackageManager还有一个freeStorageAndNotify()方法,可以删除所有包的缓存文件。该方法已从SDK中隐藏,并需要仅被标记为“危险”的CLEAR_APP_CACHE权限。

建议将DELETE_CACHE_FILES的权限级别放宽,或将CLEAR_APP_CACHE的权限级别提高。

一个框架工程师做出了回应。

请注意,freeStorageAndNotify的目的不是清除所有缓存文件,而是释放X数量的空间,例如在Play Store尝试下载和安装应用程序之前。因此,有理由使用它与系统协作,但没有理由让应用程序使用该方法,只是为了删除单个应用程序的所有缓存文件(这仅适用于设置应用程序UI)。 如果确实不是应用程序错误,即您没有搞乱权限,并且它适用于Marshmallow / 6 / api 23而不适用于其他版本,则只能意味着它也成为签名级别权限,如DELETE_CACHE_FILES 签名|系统权限,意味着只能由使用固件签名密钥签署或安装在系统分区上的应用程序持有。正如this answer中所述。
考虑到它们的预期使用/愿景(没有理由让一个应用程序使用盲目擦除单个应用程序的所有缓存文件的方法),这是有道理的。甚至可能由于那个错误而被限制了。当Android 6的代码发布后,我们会更清楚(当前可用的是 5.1.1-链接到PackageManager的freeStorageAndNotify)。

2
其他第三方应用程序(如“Clean master”)如何通过从用户获取6.0设备的辅助功能权限来删除所有已安装应用程序的系统缓存? - Audumbar
我想你应该问问他们是如何做到的,如果他们有兴趣透露的话。或者你可以尝试发布这个问题。 - Laurentiu L.

3
请参考以下页面:按保护级别分类的权限保护级别定义
android.permission.CLEAR_APP_CACHE
这属于“signature|privileged”保护级别,这意味着只有相同签名或特权应用程序(基本上是经过系统签名的应用程序)才能拥有此权限。
此外,您还应该查看行为更改

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接