Как программно очищать данные приложения
Я разрабатываю автоматические тесты для приложения 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-летний вопрос;)