Очистить все данные приложения на планшете Android без сброса настроек?

В Android есть ли способ одновременно очистить все данные приложения без сброса настроек? Я работаю в библиотеке, и у нас есть планшеты Android для оплаты покупок, которые могут использовать посетители, и после того, как посетитель закончит использовать планшет, мы хотим удалить имя пользователя из всех приложений, которые клиент мог использовать, чтобы их имя пользователя не осталось на приложение. Я знаю, что кнопка «Очистить данные» в диспетчере приложений очистит имя пользователя, но нам пришлось бы делать это для каждого приложения, и мы бы предпочли делать это в одном экземпляре, а не по одному за раз. Любая помощь будет оценена.

В меню «Настройки» > «Хранилище » вы можете удерживать категорию «Кэшированные данные» и удалять кэшированные данные всех приложений одновременно. Я не уверен, что это очистит учетные данные, но это может быть полезно.

Ответы (1)

Это можно сделать с помощью ADB и небольшого сценария — хотя я в настоящее время не уверен, может ли для этого потребоваться root (конечно, вы понимаете, что я не хочу пробовать это на любом из моих рабочих устройств прямо сейчас ;):

#!/система/бин/ш
для приложения в $(pm list packages); делать
  вечер очистить ${приложение:8}
сделанный

Этот фрагмент вы можете сохранить в файл (например clear_data.sh, ) или напрямую выполнить для копирования-вставки при подключении к устройству с помощью adb shell.


Некоторое объяснение того, что это делает, поскольку на стороне ОП были некоторые проблемы:

  • pm list packagesдает список с именами пакетов всех установленных приложений, по одному в строке.
  • for app in $(pm list packages); doбудет перебирать этот список и выполнять «внутреннюю команду» для каждого пакета отдельно
  • pm clear ${app:8}удаляет данные из каждого пакета, указанного $app, вырезая первые 8 символов ( pm listдобавляет перед каждым именем приложения строку package:, которую нам нужно обрезать)

Чтобы проверить в командной строке, вы можете скопировать и вставить следующий однострочный код:

adb shell 'for app in $(pm list packages); do echo pm clear ${app:8}; done'

(примечание: при запуске из командной строки Windows вам придется использовать двойные кавычки (спасибо Джесси за эту подсказку!) конец")

Это «пробный прогон», ничего не делающий, кроме перечисления команд над блоком кода, который будет выполняться напрямую. Вы можете использовать его вывод для удаления данных из каждого приложения вручную, выбирая те, которые вас интересуют.

Чтобы привести пример команды, созданной этим: pm clear com.facebook.katanaудалит данные приложения Facebook.


1: Это может оказаться важной частью, поскольку цикл действительно удалит данные из всех приложений (включая системные приложения), что может быть не совсем тем, что вам нужно. Вы можете автоматически ограничить это, например, пользовательскими приложениями, передав параметр -3(только для «сторонних приложений») команде , pm listт.е.pm list packages -3

+1 это ${app:8}было ново для изучения. Спасибо за объяснение. @JesseTweed Я думаю, что очистка комментариев была бы хорошей. :)
@JesseTweed для отладки, опустите часть, чтобы полностью :8увидеть содержимое переменной . $appТакже попробуйте запустить только pm list packagesчасть, чтобы увидеть результат. Последний обычно создает кучу строк в формате package:com.foobar.app— если в вашем случае это выглядит иначе, это будет проблемой. Что вы получаете от последнего? Формат соответствует? Если это так, вполне возможно, что оболочка вашего устройства не понимает синтаксис ${app:8}; тогда попробуйте $(echo $app | awk -F":" '{print $2}')вместо этого.
Пожалуйста, обо всем по порядку, Джесси: что pm list packagesпроизводит ваше устройство? (только первые несколько строк - весь вывод все равно не помещается в комментарий;)
Трудно поверить, что это результат простого pm list packages(в котором перечислены только имена пакетов, но нет команд). Вывод в вашем последнем комментарии - это скорее то, что for app in $(pm list packages); do echo pm clear ${app:8}; doneвыдало бы завершение: вывод, который вы хотели получить - команды «очистить все данные приложения без сброса настроек к заводским». Хотя вы можете проверить эти операторы перед их выполнением, чтобы не очищать слишком много приложений :)
Поскольку это прекрасно и гладко работает в Linux, и вы пишете что-то о «cmd» — я предполагаю, что вы используете Windows. Последней Windows, которую я использовал, была та, что использовалась для «Игровых групп» в 90-х, поэтому, боюсь, я не смогу вам сильно помочь с «Пакетным скриптингом». Единственное, что я могу придумать, это поместить часть ADB в файл (например pmclean.sh), а затем использовать двойной шаг: adb push pmclean.sh /sdcard/pmclean.shплюс adb shell sh /sdcard/pmclean.sh(необязательно с последующим adb shell rm /sdcard/pmclean.shудалением сценария снова).
Сорри, как я уже писал: С виндой у меня кончилось. Вы можете попробовать найти другое место, куда вы могли бы писать (вы действительно отправили его туда /sdcard, а не куда-то еще? С Kitkat и выше я мог представить себе «отказано в доступе» — но «только для чтения» скорее позволяет мне предположим, вы пытались писать где-то еще, например, /или /system).
Я только что узнал об этом и решил, что должен поделиться этим здесь. Если вы возьмете adb shell 'for app in $(pm list packages); do echo pm clear ${app:8}; done'и замените одинарные кавычки двойными кавычками, как это, adb shell "for app in $(pm list packages); do echo pm clear ${app:8}; done"он будет работать в пакетном файле Windows.
Большое спасибо, Джесси! Я думал предложить это, но с двойными кавычками это не работает в Linux (ну, по крайней мере, не без дальнейших модификаций - поскольку локальная оболочка расширила бы предназначенную $variablesдля Droid;) Я интегрирую это со своим ответом - слава за эту часть достается вам, конечно :)