Как программно очищать данные приложения

Я разрабатываю автоматические тесты для приложения Android (с использованием Robotium). Чтобы обеспечить согласованность и надежность тестов, я хотел бы начать каждый тест с чистого состояния (тестируемого приложения). Для этого мне нужно очистить данные приложения. Это можно сделать вручную в настройках/Приложения/Управление приложениями/[Мое приложение]/Очистить данные

Каков рекомендуемый способ сделать это программно?

Ответ 1

Вы можете использовать инструмент диспетчера пакетов для очистки данных для установленных приложений (аналогично нажатию кнопки "clear data" в настройках приложения на вашем устройстве). Поэтому, используя adb, вы можете:

adb shell pm clear my.wonderful.app.package

Ответ 2

Следуя за ответом @edovino, способ очистки всех программных предпочтений программ был бы

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();
    }
}

Предупреждение: приложение будет принудительно закрываться.

Ответ 3

вы можете очистить данные приложения SharedPreferences с помощью этого

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

и для очистки приложения db, этот ответ правильный → Очистка базы данных приложений

Ответ 4

Из API версии 19 можно вызвать ActivityManager.clearApplicationUserData().

((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();

Ответ 5

Проверьте этот код на:

@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();
}

Ответ 6

Если у вас есть только пара общих настроек для очистки, то это решение намного приятнее.

@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());
}

Ответ 7

Используя Context, мы можем очистить определенные файлы приложения, такие как preference, файл базы данных. Я использовал ниже код для тестирования пользовательского интерфейса с помощью 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");
    }

Ответ 8

если версия для Android находится выше kitkat, вы также можете использовать это

if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
                .clearApplicationUserData();
        return;
    }

Ответ 9

Самый простой способ сделать это -

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();
    } 
}

Это очистит данные и удалит ваше приложение из памяти. Это эквивалентно опции очистки данных в разделе "Настройки" → "Диспетчер приложений" - "Приложение" → "Очистить данные".

Это полностью удалит данные, а также закроет приложение

Ответ 10

Каков рекомендуемый способ сделать это программно?

Единственная возможная опция - запустить команду ADB adb shell pm clear package перед тестом. Самая большая проблема заключается в том, что это головная боль, сочетающая выполнение тестов и команд оболочки.

Однако мы (в Mediafe) пришли с некоторым решением, которое может работать на вас на обычном невращаемом устройстве. Все, что вам нужно сделать, это добавить аннотацию. Все остальное делается простым запуском bash script.

Просто добавьте аннотацию @ClearData до ЛЮБОГО из ваших тестов и tada 🎉, команда ADB clear будет выполнена до выполнения теста.

Это пример такого теста:

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

Идея следующая

  • Прочитайте все тесты, используя adb shell am instrument -e log true
  • Строить план выполнения, анализируя вывод из (1)
  • Запуск плана выполнения по строкам

Используя ту же идею, вы можете настроить все:

  • Очистить данные
  • Очистить панель уведомлений
  • Параметрирование
  • Фильтровать и запускать теги

Используйте только аннотации. Вот так:

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

Бонус! 🎁 Для каждого неудавшегося теста:

  • Собрать Logcat + stacktrace
  • Запись видео (mp4)
  • Dump DB (sqlite)
  • Общие настройки по умолчанию для dump (xml)
  • Соберите файлы dumpsys, такие как: аккумулятор, netstats и другие.

В общем, легко добавить дополнительные параметры, поскольку тесты выполняются один за другим из bash script, а не из задачи gradle.

📗 Полная запись в блоге: https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

📘 Исходный код с примерами: https://github.com/medisafe/run-android-tests

Надеюсь, что это ответит на 6-летний вопрос;)