tag studio log example android performance caching android-package-managers

studio - Método de reflexión de Android M freeStorageAndNotify excepción



log android (2)

Consulte estas páginas: permisos por nivel de protección y definiciones de nivel de protección .

android.permission.CLEAR_APP_CACHE

Esto cae bajo el nivel de protección "firma | privilegiado", lo que significa que solo las aplicaciones con la misma firma o privilegiadas (sistema firmado básicamente) pueden tener este permiso.

También debe revisar los cambios de comportamiento en general.

Estoy usando el método de reflexión freeStorageAndNotify:

Method freeStorageAndNotify = null; freeStorageAndNotify = service.packageManager.getClass().getMethod( "freeStorageAndNotify", long.class, IPackageDataObserver.class); freeStorageAndNotify.invoke(PackageManager.class, maxCache + freeSpace, packageDataObserver);

Esto hace que InvocationTargetException:

java.lang.SecurityException: Neither user 10199 nor current process has android.permission.CLEAR_APP_CACHE.

Algunos puntos: - Ya tengo android.permission.CLEAR_APP_CACHE - Esto sucede solo en la versión de Android "M" (Se mostró la vista previa del SDK desde el sitio del desarrollador)

Sé que esto es un pirateo, y Google no ofrece ninguna API oficial para eso, pero hay muchas aplicaciones de limpieza que limpian toda la memoria caché del dispositivo con un solo clic, por lo que si alguien sabe cómo evitar este problema con otra solución alternativa, Estaré feliz de ver eso.

Muchas gracias por la ayuda


Se produjo un error en Android 5 con respecto a cómo cualquier aplicación puede borrar todos los archivos de caché con un permiso regular, pero no puede borrar los archivos de caché de un paquete excepto con un permiso de nivel de firma. Es detalles donde

PackageManager tiene un deleteApplicationCacheFiles() para eliminar el caché de un paquete. Este método está oculto del SDK y requiere DELETE_CACHE_FILES , un permiso de nivel de firma.

PackageManager también tiene un método freeStorageAndNotify() , para eliminar archivos de caché de todos los paquetes. Este método está oculto del SDK y requiere el permiso CLEAR_APP_CACHE , que se marca simplemente como "peligroso".

Se propuso a cualquiera de los dos que DELETE_CACHE_FILES debería tener su nivel relajado, CLEAR_APP_CACHE debería tener su nivel elevado.

Un ingeniero de marco respondió

Tenga en cuenta que freeStorageAndNotify''s propósito freeStorageAndNotify''s no es eliminar todos los archivos de caché , sino liberar X espacio, por ejemplo, en la tienda de juegos antes de intentar descargar e instalar una aplicación. Así que hay razones para usarlo que funcionan bien con el sistema, pero no hay razón para que una aplicación use el método que borra ciegamente todos los archivos de caché para una sola aplicación (que está justo ahí para la interfaz de usuario de la Configuración).

Si, de hecho, no es un error de aplicación, es decir, no ha arruinado los permisos y funciona en Marshmallow / 6 / api 23 y no en otros, eso solo podría significar que se convirtió en un permiso de nivel de firma, como DELETE_CACHE_FILES .

Un permiso de sistema de firma, lo que significa que solo puede ser mantenido por aplicaciones firmadas con la clave de firma del firmware o instaladas en la partición del sistema (por ejemplo, por un usuario de dispositivo rooteado). Como se describe en esta respuesta .

Esto tendría sentido, considerando su uso previsto / su visión (no hay razón para que una aplicación use el método que borra ciegamente todos los archivos de caché para una sola aplicación). Incluso puede haber sido restringido como resultado de ese error. Cuando salga el código de Android 6, lo sabremos mejor (el disponible actualmente es 5.1.1 - enlace a freeManageageAndNotify del PackageManager ).