在我正在制作的Android应用中,我希望能够以编程方式清除设备上所有应用的缓存.之前已经多次询问过:以 编程方式清除应用缓存? 反映清除Android应用缓存的方法 清除另一个应用缓存 ,每个人都说没有root就不可能.
然而,事实显然并非如此.如果您查看应用程序App Cache Cleaner,History Eraser,1Tap Cleaner,Easy History Cleaner以及Google Play中的无数其他类似应用程序(所有这些应用程序都不需要root),您会发现他们都能做到这一点.因此,它可以做到,但我找不到任何公开的例子如何做到这一点.
有谁知道所有这些应用程序在做什么?
谢谢
我正在使用反射方法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,但是有很多清洁应用程序只需点击一下即可清除所有设备缓存,所以如果有人知道如何通过另一种解决方法绕过这个问题我我很高兴看到这一点.
非常感谢你的帮助
我正在开发需要特殊权限的系统应用程序。出于某种原因,我无法获得 CLEAR_APP_USER_DATA 的许可,但我可以使用 INSTALL_PACKAGES、DELETE_PACKAGES 等。什么可能导致这种情况?
显现:
uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
uses-permission android:name="android.permission.DELETE_PACKAGES"/>
uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
Run Code Online (Sandbox Code Playgroud)
我删除了“<”,因为它不会显示其余的行。
我使用权限的代码:
String apkPackage = intent.getExtras().getString(context.getString(R.string.key_package));
if (apkPackage != null) {
PackageManager pm = context.getPackageManager();
Class<?>[] types = new Class[] {String.class, IPackageDataObserver.class};
try {
Method methodClearUserData = pm.getClass().getMethod("clearApplicationUserData", types);
methodClearUserData.invoke(pm, new Object[] {apkPackage, null});
Method methodDeleteCache = pm.getClass().getMethod("deleteApplicationCacheFiles", types);
methodDeleteCache.invoke(pm, new Object[] {apkPackage, null});
} catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
Log.w(TAG, "Unable to invoke clear method.", e); …Run Code Online (Sandbox Code Playgroud)