В Android есть ли способ одновременно очистить все данные приложения без сброса настроек? Я работаю в библиотеке, и у нас есть планшеты Android для оплаты покупок, которые могут использовать посетители, и после того, как посетитель закончит использовать планшет, мы хотим удалить имя пользователя из всех приложений, которые клиент мог использовать, чтобы их имя пользователя не осталось на приложение. Я знаю, что кнопка «Очистить данные» в диспетчере приложений очистит имя пользователя, но нам пришлось бы делать это для каждого приложения, и мы бы предпочли делать это в одном экземпляре, а не по одному за раз. Любая помощь будет оценена.
Это можно сделать с помощью 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
${app:8}
было ново для изучения. Спасибо за объяснение. @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
выдало бы завершение: вывод, который вы хотели получить - команды «очистить все данные приложения без сброса настроек к заводским». Хотя вы можете проверить эти операторы перед их выполнением, чтобы не очищать слишком много приложений :)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.$variables
для Droid;) Я интегрирую это со своим ответом - слава за эту часть достается вам, конечно :)
Хьюи