Я использую метод freeStorageAndNotify()
с разрешением android.permission.CLEAR_APP_CACHE
чтобы удалить системный кеш всех установленных приложений. Но метод начал бросать InvocationTargetException
из версии android marshmallow 6.0. После того, как я нашел проблему, я нашел такую же проблему, как сообщается здесь: метод отражения Android M freeStorageAndNotify exception Итак, вот вывод: freeStorageAndNotify()
перестает работать, так как Google теперь повысил уровень подписи метода к сигнатуре | system.
Но теперь вопрос заключается в том, как другие сторонние приложения, такие как «Чистый мастер», все еще могут удалять системный кеш всех установленных приложений, получая разрешение на доступ от пользователя для 6.0 устройств?
Очиститель системы, который я использую, имеет доступ к разрешениям STORAGE. Это разрешение дает полномочиям приложения очищать любые данные в общем хранилище внешних хранилищ.
http://developer.android.com/reference/android/Manifest.permission_group.html#STORAGE
Я не думаю, что какое-либо стороннее приложение может фактически очистить системный кеш, если устройство не внедрено, а приложение предназначено для укорененных устройств.
Я не думаю, что «Чистый мастер» фактически использует разрешения доступности для очистки установленного кеша приложений. Но, если вас это интересует, эта цель может быть достигнута с помощью AccessibilityService
в вашем приложении. В вашем классе, который расширяет AccessibilityService
вас есть этот обратный вызов:
@Override public void onAccessibilityEvent(AccessibilityEvent aEvent) { AccessibilityNodeInfo rootNode = aEvent.getSource(); //... }
Здесь вы можете вызвать rootNode.findAccessibilityNodeInfosByViewId()
или rootNode.findAccessibilityNodeInfosByText()
, он вернет все соответствующие объекты AccessibilityNodeInfo
(подэлементы) в дереве. Затем вам просто нужно определить, какая из них – Button
( node.getClassName()
), и вызвать subNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)
.
На Android M вам сначала нужно открыть экран App Info
(здесь вы можете найти инструкции. Как я могу запустить программный экран приложения для Android ) для конкретного приложения и, по описанной выше схеме, выполнить последовательные щелчки по кнопкам " Хранение "->" Очистить кеш ".
Чтобы очистить кеш для всех установленных приложений, вам, вероятно, придется перебирать все установленные приложения ( List<ApplicationInfo> installedApplications = context.getPackageManager.getInstalledApplications(0);
) и повторить описанную выше процедуру.
Эти приложения все время делают одно и то же. Использовать его на старом устройстве и новом устройстве, результаты одинаковы. Единственная помощь, которую я видел, – это то, что они могут убить или перезапустить некоторые фоновые процессы, а не очищать кеш. Поэтому API не может ограничить свой трюк.