Як програмно очистити дані програми


152

Я розробляю автоматизовані тести для додатків для Android (використовую Robotium). Щоб забезпечити послідовність та надійність тестів, я хотів би почати кожне тестування з чистого стану (програми, що перевіряється). Для цього мені потрібно очистити дані програми. Це можна зробити вручну в Налаштуваннях / Програмах / Керування програмами / [Мій додаток] / Очистити дані

Який рекомендований спосіб зробити це програмно?


Чи можливо використовувати інструмент adb для очищення даних між запуском програми? adb -w
— smith324

На жаль, ця опція недоступна (довідка adb застаріла).
— користувач597603

Це було б так чудово. Під час налагодження проблем із базою даних я повинен так сильно перейти до параметра Очистити дані, і це дійсно порушує мій потік.
— Джейсон Прадо

Як це зробити через Android Studio, обговорюється тут: stackoverflow.com/q/31713579/905686 .
— користувач905686

Конкретно зробіть це: stackoverflow.com/a/57461180/94557
— Метт Вулф

Відповіді:


171

Ви можете використовувати інструмент менеджера пакунків, щоб очистити дані про встановлені додатки (подібно до натискання кнопки "очистити дані" в налаштуваннях програми на пристрої). Отже, використовуючи adb, ви можете зробити:

adb shell pm clear my.wonderful.app.package

1
На Android 2.1-update1 це, на жаль, дає результати Error: unknown command 'clear'.
— Пол Ламмерцма

@Palani: працює для мене для будь-якої версії вище 2.1-r1 (andoid-7). якісь повідомлення про помилки?
— edovino

1
Команда вгорі підключається до оболонки Android та виконує "pm clear my.wonderful.app.package" в android. У моєму пристрої команда "pm" не має опції "clear". Це нічого не пов'язане з sdk. Це залежить від прошивки пристрою.
— Палані

м шукаю чіткі дані браузера (за умовчанням) та хромованих програм для браузерів у програмах Android пристроїв з мого додатка для Android. Будь ласка, допоможіть для цього ..
— Brijesh Patel,

Працює не на кожному пристрої, але це чудово для пристроїв, на яких він працює
— Cory Trese

34

Після відповіді на @ 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();
    }
}

Попередження : додаток буде закрито.


5
Якщо у вас після цього працює який-небудь тестовий код, він не працює.
— Раджат

Чи вимагає виконання цього вимоги та дозволів оголошуватись у маніфесті?
— reubenjohn

1
Ні, для цього не потрібен спеціальний дозвіл.
— Себастьяно

Thx, ти врятував мені життя!
— Sidd

1
якщо я не хочу примушувати закривати програму?
— NJ

22

ви можете очистити дані програми SharedPreferences за допомогою цього

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

а для очищення програми db ця відповідь правильна -> Очищення бази даних програми


14

З версії API 19 можна викликати ActivityManager.clearApplicationUserData ().

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

13
Просто FYI, зателефонувавши до цього, ваш додаток буде припинено.
— Zach Rattner

8

Перевірте цей код на:

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

Чи не вимагає цього "режиму приладів" увімкнути? Що це за режим?
— ADTC

Так, для цього потрібна "інструментальна" програма, тобто ваш тест проходить поряд з кодом програми на реальному пристрої, який перебуває в процесі роботи , а це означає, що ви можете отримати доступ до всього стану вашої програми та змінити її під час виконання для тестування.
— Томас Келлер

що має бути в (...)?
— NickUnuchek

@NickUnuchek Назва файлу налаштувань.
— Томас Келлер

3

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

3

Найпростіший спосіб це зробити

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

Це очистить дані та видалить ваш додаток із пам'яті. Це еквівалентно параметру очищення даних у розділі Налаштування -> Диспетчер програм -> Ваша програма -> Очистити дані.

Це повністю видалить дані, а також змусить закрити додаток


Не додайте однакову відповідь на кілька запитань. Дайте відповідь найкращому, а решту позначте як дублікати. Див. Чи прийнятно додати дублюючу відповідь на кілька запитань?
— FelixSFD

1
Як ми можемо досягти цього без закриття програми
— Омкар Гурі

2

Це рішення мені дуже допомогло:

Використовуючи нижче два методи, ми можемо очистити дані програмно

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

2

якщо версія Android вище kitkat, ви можете також використовувати це

публічна недійсна onClick (Перегляд подання) {

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

0

Який рекомендований спосіб зробити це програмно?

Єдиний можливий варіант - запустити команду ADB adb shell pm clear packageперед тестом. Найбільша проблема полягає в тому, що це свого роду головний біль, що поєднує виконання тестів і команд оболонки.

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

Просто додайте @ClearDataанотацію перед будь-яким із ваших тестів та тада 🎉, перед виконанням тесту буде виконано чітку команду ADB.

Це приклад такого тесту:

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

Ідея така

  1. Прочитайте всі тести, використовуючи adb shell am instrument -e log true
  2. План побудови виконання шляхом аналізу результатів з (1)
  3. Запустіть план виконання рядки за рядком

Використовуючи ту саму ідею, це всі варіанти, які ви можете легко підтримати:

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

Використовуйте лише примітки. Подобається це:

@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)
  • Вивантажити налаштування спільного користування за замовчуванням (xml)
  • Збирайте файли dumpsys, такі як: акумулятор, нетстати та інші.

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

📗 Повна публікація в блозі : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

📘 Вихідний код із прикладами : https://github.com/medisafe/run-android-tests

Сподіваюся, що це відповідає на 6 років питання;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.