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


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.