Cómo borrar datos de la aplicación mediante programación

152

Estoy desarrollando pruebas automatizadas para una aplicación de Android (usando Robotium). Para asegurar la consistencia y confiabilidad de las pruebas, me gustaría comenzar cada prueba con un estado limpio (de la aplicación bajo prueba). Para hacerlo, necesito borrar los datos de la aplicación. Esto se puede hacer manualmente en Configuración / Aplicaciones / Administrar aplicaciones / [Mi aplicación] / Borrar datos

¿Cuál es la forma recomendada de hacer esto mediante programación?

usuario597603
fuente
¿Es factible usar la herramienta adb para borrar los datos entre lanzamientos de aplicaciones? adb -w
smith324 01 de
Desafortunadamente, esta opción no está disponible (la ayuda de adb está desactualizada).
user597603
Esto sería genial Al depurar problemas de la base de datos, tengo que navegar tanto a la opción Borrar datos que realmente interrumpe mi flujo.
Jason Prado
Aquí se explica cómo hacerlo a través de Android Studio: stackoverflow.com/q/31713579/905686 .
user905686
Específicamente, haga esto: stackoverflow.com/a/57461180/94557
Matt Wolfe el

Respuestas:

171

Puede usar la herramienta de administrador de paquetes para borrar los datos de las aplicaciones instaladas (similar a presionar el botón 'borrar datos' en la configuración de la aplicación en su dispositivo). Entonces, usando adb podrías hacer:

adb shell pm clear my.wonderful.app.package
edovino
fuente
1
En Android 2.1-actualización1, desafortunadamente esto rinde Error: unknown command 'clear'.
Paul Lammertsma
@Palani: funciona para mí para cualquier versión anterior a 2.1-r1 (andoid-7). algun mensaje de error?
edovino
1
El comando anterior se conecta al shell de Android y ejecuta "pm clear my.wonderful.app.package" en Android. En mi dispositivo, el comando "pm" no tiene la opción "borrar". No tiene nada que ver con SDK. Depende del firmware del dispositivo.
Palani
m en busca de datos claros de navegador (defaut) y cromo aplicaciones del navegador en el dispositivo androide programmaticaly de mi ayuda app.Please androide para ello ..
Brijesh Patel
No funciona en todos los dispositivos, pero es maravilloso para los dispositivos en los que funciona
Cory Trese
34

Siguiendo la respuesta de @edovino, la forma de borrar todas las preferencias de una aplicación mediante programación sería

private void clearPreferences() {
    try {
        // clearing app data
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear YOUR_APP_PACKAGE_GOES HERE");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Advertencia : la aplicación forzará el cierre.

Sebastiano
fuente
55
Si tiene algún código de prueba ejecutándose después de esto, falla.
rajath
¿Ejecutar esto requiere que los permisos se declaren en el manifiesto?
reubenjohn
1
No, no requiere ningún permiso especial.
Sebastiano
Gracias, me salvaste la vida!
Sidd
1
si no quiero forzar el cierre de la aplicación, entonces?
NJ
22

puede borrar los datos de la aplicación SharedPreferences con esto

Editor editor = 
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();

y para borrar la aplicación db, esta respuesta es correcta -> Borrar la base de datos de la aplicación

guleryuz
fuente
14

Desde la versión 19 de API es posible llamar a ActivityManager.clearApplicationUserData ().

((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();
Joakim
fuente
13
Solo para tu información, llamar a esto terminará tu aplicación.
Zach Rattner
8

Verifique este código para:

@Override
protected void onDestroy() {
// closing Entire Application
    android.os.Process.killProcess(android.os.Process.myPid());
    Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
    editor.clear();
    editor.commit();
    trimCache(this);
    super.onDestroy();
}


public static void trimCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);

        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}


public static boolean deleteDir(File dir) {
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // <uses-permission
    // android:name="android.permission.CLEAR_APP_CACHE"></uses-permission>
    // The directory is now empty so delete it

    return dir.delete();
}
Hare Krishna
fuente
6

Si solo tiene que borrar algunas preferencias compartidas, entonces esta solución es mucho mejor .

@Override
protected void setUp() throws Exception {
    super.setUp();
    Instrumentation instrumentation = getInstrumentation();
    SharedPreferences preferences = instrumentation.getTargetContext().getSharedPreferences(...), Context.MODE_PRIVATE);
    preferences.edit().clear().commit();
    solo = new Solo(instrumentation, getActivity());
}
Thomas Keller
fuente
¿No requiere esto que esté habilitado el "modo de instrumentación" ? ¿Cuál es ese modo de todos modos?
ADTC
Sí, esto requiere una aplicación "instrumentada", es decir, su prueba se ejecuta junto con el código de su aplicación en un dispositivo real en proceso , lo que significa que puede acceder a todo el estado de su aplicación y cambiarlo en el tiempo de ejecución para fines de prueba.
Thomas Keller
¿Qué debería estar en (...)?
NickUnuchek
@NickUnuchek El nombre del archivo de preferencias.
Thomas Keller
3

Usando Contexto , podemos borrar archivos específicos de la aplicación como preferencia, archivo de base de datos. He utilizado el siguiente código para las pruebas de IU con Espresso.

    @Rule
    public ActivityTestRule<HomeActivity> mActivityRule = new ActivityTestRule<>(
            HomeActivity.class);

    public static void clearAppInfo() {
        Activity mActivity = testRule.getActivity();
        SharedPreferences prefs =
                PreferenceManager.getDefaultSharedPreferences(mActivity);
        prefs.edit().clear().commit();
        mActivity.deleteDatabase("app_db_name.db");
    }
Ronak Poriya
fuente
3

La forma más sencilla de hacer esto es

private void deleteAppData() {
         try {
        // clearing app data
        String packageName = getApplicationContext().getPackageName();
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear "+packageName);

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Esto borrará los datos y eliminará su aplicación de la memoria. Es equivalente a la opción de borrar datos en Configuración -> Administrador de aplicaciones -> Su aplicación -> Borrar datos.

Esto eliminará los datos por completo y forzará el cierre de la aplicación.

Jain Summved
fuente
No agregue la misma respuesta a varias preguntas. Responda la mejor y marque el resto como duplicados. Consulte ¿Es aceptable agregar una respuesta duplicada a varias preguntas?
FelixSFD
1
¿Cómo podemos lograr esto sin cerrar la aplicación?
Omkar Ghurye
2

Esta solución realmente me ha ayudado:

Al utilizar a continuación dos métodos, podemos borrar los datos mediante programación.

    public void clearApplicationData() {
    File cacheDirectory = getCacheDir();
    File applicationDirectory = new File(cacheDirectory.getParent());
    if (applicationDirectory.exists()) {
    String[] fileNames = applicationDirectory.list();
        for (String fileName : fileNames) {
            if (!fileName.equals("lib")) {
                deleteFile(new File(applicationDirectory, fileName));
            }
        }
    }
}
    public static boolean deleteFile(File file) {
    boolean deletedAll = true;
    if (file != null) {
        if (file.isDirectory()) {
            String[] children = file.list();
            for (int i = 0; i < children.length; i++) {
                deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
            }
        } else {
            deletedAll = file.delete();
        }
    }

    return deletedAll;
}
Priyanka SN
fuente
2

si la versión de Android está por encima de kitkat, también puede usar esto

public void onClick (Ver vista) {

    Context context = getApplicationContext(); // add this line
    if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
            .clearApplicationUserData();
        return;
    }
Tushar Saha
fuente
0

¿Cuál es la forma recomendada de hacer esto mediante programación?

La única opción posible es ejecutar el comando ADB adb shell pm clear packageantes de la prueba. El mayor problema es que es una especie de dolor de cabeza que combina la ejecución de pruebas y los comandos de shell.

Sin embargo, nosotros (en Mediafe) vinimos con alguna solución que puede funcionar para usted en un dispositivo no rooteado normal. Todo lo que necesitas hacer es agregar una anotación. Todo lo demás se realiza ejecutando un script bash simple .

Simplemente agregue una @ClearDataanotación antes de CUALQUIERA de sus pruebas y tada 🎉, el comando ADB clear se ejecutará antes de la ejecución de la prueba.

Este es un ejemplo de tal prueba:

@Test
@ClearData
public void someTest() {
    // your test
}

La idea es la siguiente

  1. Lea todas las pruebas usando adb shell am instrument -e log true
  2. Cree un plan de ejecución analizando el resultado de (1)
  3. Ejecute el plan de ejecución línea por línea

Usando la misma idea, estas son todas las opciones que puede admitir fácilmente:

  • Borrar datos
  • Borrar barra de notificaciones
  • Parametrizar
  • Filtrar y ejecutar por etiquetas

Usa solo anotaciones. Me gusta esto:

@Test
@ClearData
@Tags(tags = {"sanity", "medium"})
@Parameterized.Repeat(count = 3)
public void myTest() throws Exception {
    String param = params[index];
    // ...
}

¡Prima! 🎁 Para cada prueba fallida:

  • Recoge Logcat + stacktrace
  • Grabar video (mp4)
  • Dump DB (sqlite)
  • Volcado de preferencias compartidas predeterminadas (xml)
  • Recopile archivos dumpsys como: batería, netstats y otros.

En general, es fácil agregar más opciones, ya que las pruebas se ejecutan una por una desde el script bash en lugar de desde la tarea gradle.

📗 La publicación completa del blog : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

📘 El código fuente con ejemplos : https://github.com/medisafe/run-android-tests

Espero que esto responda la pregunta de 6 años;)

Sromku
fuente