¿Borrar todos los datos de la aplicación en una tableta Android sin usar el restablecimiento de fábrica?

En Android, ¿hay alguna forma de borrar todos los datos de la aplicación al mismo tiempo sin utilizar el restablecimiento de fábrica? Trabajo en una biblioteca y tenemos tabletas Android para pagar para que los usuarios las usen y después de que el usuario termine de usar la tableta, queremos eliminar el nombre de usuario de todas y cada una de las aplicaciones que el usuario haya usado para que su nombre de usuario no quede en el aplicación Sé que el botón "Borrar datos" en el Administrador de aplicaciones borrará el nombre de usuario, pero tendríamos que hacer esto para cada aplicación y preferiríamos hacerlo en una instancia en lugar de una a la vez. Cualquier ayuda será apreciada.

En Configuración > Almacenamiento , puede mantener presionada la categoría Datos en caché y eliminar los datos en caché de todas las aplicaciones a la vez. No estoy seguro de si esto borrará las credenciales, pero podría ser útil.

Respuestas (1)

Eso podría hacerse a través de ADB y un poco de secuencias de comandos, aunque actualmente no estoy seguro de si podría requerir root (seguramente entiende que no quiero probar eso en ninguno de mis dispositivos de trabajo en este momento;):

#!/sistema/bin/sh
para la aplicación en $ (paquetes de lista pm); hacer
  pm claro $ {aplicación: 8}
hecho

Este fragmento se puede guardar en un archivo (p. ej. clear_data.sh), o ejecutarlo directamente al copiar y pegar cuando se conecta al dispositivo mediante adb shell.


Alguna explicación de lo que hace, ya que hubo algunos problemas al final del OP:

  • pm list packagesda una lista con los nombres de los paquetes de todas las aplicaciones instaladas, una por línea.
  • for app in $(pm list packages); dorecorrería esa lista y ejecutaría el "comando interno" para cada paquete por separado
  • pm clear ${app:8}elimina los datos de cada paquete especificado por $app, cortando los primeros 8 caracteres ( pm listantepone cada nombre de aplicación por la cadena package:, que debemos cortar)

Para verificar en la línea de comando, puede copiar y pegar la siguiente línea:

adb shell 'for app in $(pm list packages); do echo pm clear ${app:8}; done'

(nota: cuando se ejecuta desde una línea de comandos de Windows, tendrá que usar comillas dobles (¡gracias a Jesse por esta sugerencia!) – en Linux/Unix/Mac quédese con las comillas simples o las variables se expandirían "al revés fin")

Eso es una "ejecución en seco", que no hace nada más que enumerar los comandos que se ejecutarían directamente en el bloque de código anterior. Puede usar el resultado de eso para eliminar los datos de cada aplicación manualmente, eligiendo las que le interesen. 1

Para dar un comando de ejemplo producido por esto: pm clear com.facebook.katanaeliminaría los datos de la aplicación de Facebook.


1: Esto podría ser una parte importante, ya que el ciclo realmente borraría los datos de todas las aplicaciones (incluidas las aplicaciones del sistema), lo que podría no ser exactamente lo que busca. Puede restringir eso automáticamente a, por ejemplo, aplicaciones de usuario pasando el parámetro -3(para "solo aplicaciones de terceros") al pm listcomando, es decir pm list packages -3, .

+1 eso ${app:8}fue algo nuevo para aprender. Gracias por la explicación. @JesseTweed Creo que sería bueno limpiar los comentarios. :)
@JesseTweed para la depuración, omita la :8parte para ver el contenido de la $appvariable por completo. También intente ejecutar solo la pm list packagesparte para ver su salida. Este último generalmente produce un montón de líneas en el formato package:com.foobar.app; si eso se ve diferente en su caso, ese será el problema. ¿Qué obtienes de este último? ¿Coincide el formato? Si es así, es posible que el shell de su dispositivo no entienda la sintaxis de ${app:8}; entonces intente $(echo $app | awk -F":" '{print $2}')en su lugar.
Por favor, lo primero es lo primero, Jesse: ¿Qué pm list packagesproduce en su dispositivo? (solo las primeras líneas: la salida completa no se ajusta a un comentario de todos modos;)
Difícil de creer que ese es el resultado de un simple pm list packages(que solo enumera los nombres de los paquetes, pero no antepone los comandos). for app in $(pm list packages); do echo pm clear ${app:8}; doneEl resultado en su último comentario es más bien lo que produciría el completo : el resultado que quería tener: los comandos para "borrar todos los datos de la aplicación sin realizar un restablecimiento de fábrica". Aunque es posible que desee verificar esas declaraciones antes de ejecutarlas, para no borrar demasiadas aplicaciones :)
Como eso funciona bien y sin problemas en Linux, y escribes algo sobre "cmd", supongo que estás usando Windows. El último Windows que usé fue el de "Playgroups" en los años 90, así que me temo que no puedo ayudarte mucho con "Batch scripting". Lo único que se me ocurre es poner la parte ADB en un archivo (p. ej. pmclean.sh), y luego usar un paso doble: adb push pmclean.sh /sdcard/pmclean.shmás adb shell sh /sdcard/pmclean.sh(opcionalmente seguido de adb shell rm /sdcard/pmclean.shpara eliminar el script nuevamente).
Lo siento, como escribí: Con Windows estoy fuera. Puede intentar encontrar otro lugar donde pueda escribir (¿realmente lo empujó a /sdcard, y no a otro lugar? Con Kitkat y superior, podría imaginar un "permiso denegado", pero un "solo lectura" me deja suponga que trató de escribir en otro lugar, por ejemplo, /o /system).
Me acabo de enterar de esto y pensé que debería compartirlo aquí. Si toma adb shell 'for app in $(pm list packages); do echo pm clear ${app:8}; done'y reemplaza las comillas simples con comillas dobles como esta, adb shell "for app in $(pm list packages); do echo pm clear ${app:8}; done"se ejecutará en un archivo por lotes de Windows.
¡Muchas gracias, Jesse! Pensé en sugerir eso, pero con comillas dobles no funciona en Linux (bueno, al menos no sin más modificaciones, ya que el shell local expandiría el previsto $variablespara el Droid;) Integraré esto con mi respuesta: la gloria por esa parte es para ti, por supuesto :)