Android: очистить кэш всех приложений?

В приложении для Android, которое я создаю, я хочу иметь возможность программно очищать кэш всех приложений на устройстве. Об этом уже много раз спрашивали: программная очистка кэша приложения? Отражение методов для очистки кэша приложений Android Очистите кэш других приложений, и все говорят, что без рута это невозможно.

Однако это явно не тот случай. Если вы посмотрите на приложения App Cache Cleaner, History Eraser, 1Tap Cleaner, Easy History Cleaner и бесчисленное множество других похожих приложений в Google Play (все из которых не требуют root), вы поймете, что все они могут сделать это. Таким образом, это возможно, но я просто не могу найти какие-либо публичные примеры, как это сделать.

Кто-нибудь знает, что делают все эти приложения?

Спасибо

2 ответа

Решение

Вот способ сделать это, который не требует IPackageDataObserver.aidl:

PackageManager  pm = getPackageManager();
// Get all methods on the PackageManager
Method[] methods = pm.getClass().getDeclaredMethods();
for (Method m : methods) {
    if (m.getName().equals("freeStorage")) {
        // Found the method I want to use
        try {
            long desiredFreeStorage = 8 * 1024 * 1024 * 1024; // Request for 8GB of free space
            m.invoke(pm, desiredFreeStorage , null);
        } catch (Exception e) {
            // Method invocation failed. Could be a permission problem
        }
        break;
    }
}

Вам нужно иметь это в своем манифесте:

<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>

Это требует, чтобы Android очистил достаточно файлов кэша, чтобы освободить 8 ГБ. Если вы установите это число достаточно высоко, вы должны достичь того, чего хотите (этот Android удалит все файлы в кеше).

Это работает так, что Android хранит список всех файлов во всех каталогах кэша приложения (LRU). Когда вы звоните freeStorage() он проверяет, доступен ли объем памяти (в данном случае 8 ГБ) для файлов кэша. Если нет, он начинает удалять файлы из каталогов кэша приложения, сначала удаляя самые старые файлы. Он продолжает удалять файлы до тех пор, пока не останется файлов для удаления или пока не освободит запрошенный объем памяти (в данном случае 8 ГБ).

Вы можете очистить данные всех приложений, используя этот метод (freeStorageAndNotify). Вы должны получить доступ к этому методу, используя отражение Java. Для этого вам понадобится IPackageDataObserver.aidl. вам также нужно иметь разрешение в вашем файле манифеста для удаления кэша

Другие вопросы по тегам