Очистить кеш приложения программно?
Я хочу написать утилиту, в которой пользователь может выбрать набор установленных приложений и очистить их кэш данных, например, как вы можете сделать это вручную, используя встроенный экран Настройки-> Настройки приложений с помощью кнопки "Очистить кэш".
Как получить доступ к количеству кэшированных данных в каждом приложении и программно очистить эти кэши?
3 ответа
Обычные приложения SDK не имеют прав доступа к кэшам других приложений, не говоря уже о том, чтобы изменять их, кроме как они имеют право взламывать ваши файлы.
Это может быть возможно на рутованных телефонах с приложением, работающим от имени пользователя root, и в этом случае вам придется вручную создавать пути на основе имен пакетов приложений.
Ответ, данный здесь, ложен, есть рыночные приложения, которые имеют программную очистку всех функций кэша приложений. Кроме того, в документации есть следующее:
public static final String CLEAR_APP_CACHE
С тех пор: Уровень API 1 в Android Позволяет программе очищать кеши всех установленных приложений на устройстве. Постоянное значение:
android.permission.CLEAR_APP_CACHE
Обратите внимание на "часть всех установленных приложений" и тот факт, что вам не нужны какие-либо права доступа root или специальные разрешения, кроме разрешения обычного пользователя.
Я публикую здесь, потому что у меня есть требование к продукту для очистки всех кешей приложения каждые 24 часа на демонстрационном телефоне в магазине, и я пытаюсь понять, как это правильно использовать. Я знаю, что часть решения получает это разрешение, я также знаю, как найти все установленные приложения на устройстве, и я работаю над тем, чтобы реально удалить кэш. Моя проблема в том, что другие кеши приложений считываются без файлов (несмотря на наличие содержимого), я подозреваю, что у меня нет прав на чтение, чтобы сделать вызов списка файлов.
Вы должны иметь это разрешение в своем манифесте:
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
После этого вы можете использовать PackageManager для очистки кэша всей программы:
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;
}
}
Это требует, чтобы Android очистил достаточно файлов кэша, чтобы освободить 8 ГБ. Если вы установите это число достаточно высоко, вы должны достичь того, чего хотите (этот Android удалит все файлы в кеше). Когда вы вызываете freeStorage(), он проверяет, доступен ли объем памяти (в данном случае 8 ГБ) для файлов кэша. Если нет, он начинает удалять файлы из каталогов кэша приложения, сначала удаляя самые старые файлы. Он продолжает удалять файлы до тех пор, пока не останется файлов для удаления или пока не освободит запрошенный объем памяти (в данном случае 8 ГБ).