Подтвердить что ты не робот

Метод отражения Android M freeStorageAndNotify исключение

Я использую метод отражения 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" (Flashed Preview sdk с сайта разработчика)

Я знаю, что это взломать, и Google не приносит для этого официального API, Но есть так много приложений для очистки, которые очищают весь кеш устройства одним щелчком мыши, поэтому, если кто-то знает, как обойти эту проблему с другим обходным решением, я буду рад видеть это.

Большое спасибо за помощь

4b9b3361

Ответ 1

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

PackageManager имеет deleteApplicationCacheFiles(), чтобы удалить кеш из одного пакета. Этот метод скрыт от SDK, и он требует DELETE_CACHE_FILES, разрешение на уровне подписи.

PackageManager также имеет метод freeStorageAndNotify(), для удаления файлы кеша из всех пакетов. Этот метод скрыт от SDK, и для этого требуется разрешение CLEAR_APP_CACHE, которое просто помечено как "опасный".

Было предложено либо установить, что DELETE_CACHE_FILES должен быть ослаблен, CLEAR_APP_CACHE должен повысить уровень.

Инженер-каркас ответил

Обратите внимание, что freeStorageAndNotify's цель - не уничтожить весь кеш файлов, но для освобождения X объема пространства, например, в магазине воспроизведения прежде чем он попытается загрузить и установить приложение. Так что есть причины использовать его, что хорошо работает с системой, но никаких причин для приложения для используйте метод, который просто слепо стирает все файлы кеша для одного приложение (это только для пользовательского интерфейса приложения настроек).

Если это действительно не ошибка приложения, т.е. вы не испортили разрешения, и она работает на Marshmallow/6/api 23, а не на других, что может означать, что это стало разрешением уровня подписи также, как DELETE_CACHE_FILES.

Подпись | системное разрешение, что означает, что ее можно удерживать только приложения, которые подписаны с ключом подписи микропрограммы или установлены на системном разделе (например, пользователем с корневым устройством). Как описано в этот ответ.

Это имеет смысл, учитывая их предполагаемое использование/их видение (нет причин для приложения использовать метод, который просто слепо стирает все файлы кеша для одного приложения). Это может быть даже ограничено в результате этой ошибки. Когда выйдет код Android 6, мы будем знать лучше (текущий доступный 5.1.1 - ссылка на PackageManager freeStorageAndNotify).

Ответ 2

Обратитесь к этим страницам: разрешения по уровню защиты и определения уровня защиты.

android.permission.CLEAR_APP_CACHE

Это подпадает под уровень защиты "signature | privileged", что означает, что только такое же подпись или привилегированные приложения (система, подписанная в основном) могут иметь это разрешение.

Также вы должны проверить "Изменения поведения" в целом.