adb shell pm: полное руководство по управлению пакетами Android

Команда adb shell pm вызывается, когда нужно удалить системное приложение без root, вернуть отключённый пакет или выяснить, почему Package Manager отвечает ошибкой Failure [DELETE_FAILED_INTERNAL_ERROR] при попытке стереть предустановленную программу. Утилита pm (package manager) — это интерфейс командной строки к системному сервису Android, который хранит сведения обо всех установленных пакетах: их имена, разрешения, состояние и принадлежность пользователям.

В отличие от графических настроек, pm позволяет работать с пакетами, скрытыми из списка приложений, управлять отдельными пользователями устройства и выполнять действия, недоступные через стандартное меню. Для работы потребуется включённая отладка по USB и установленный Android SDK Platform-Tools на компьютере — это официальный инструментарий Google, скачивать его стоит только с сайта для разработчиков Android.

⚠️ Внимание: команды pm выполняются с правами оболочки (shell), поэтому ошибка в имени пакета может отключить системный компонент. Перед массовыми действиями снимите список пакетов и сохраните его в файл.

Подготовка: подключение устройства через ADB

Прежде чем вводить первую команду, убедитесь, что устройство видно компьютеру. На смартфоне откройте настройки разработчика и включите отладку по USB — сам раздел появляется после многократного нажатия на пункт «Номер сборки» в сведениях о телефоне. Точное расположение пунктов зависит от оболочки производителя, поэтому при расхождениях сверьтесь с документацией своей модели.

Подключите кабель и проверьте связь:

adb devices

Если в выводе стоит статус unauthorized, на экране смартфона нужно подтвердить запрос на разрешение отладки. Статус device означает, что можно переходить к командам pm. Пустой список обычно указывает на проблему с драйвером или кабелем — смените порт USB и проверьте, что кабель поддерживает передачу данных, а не только зарядку.

☑️ Подготовка к работе с adb shell pm

Выполнено: 0 / 4

Базовый синтаксис и просмотр списка пакетов

Общий формат вызова прост: adb shell pm <подкоманда> [параметры]. Самая востребованная операция — вывод перечня установленных пакетов. Команда adb shell pm list packages покажет все пакеты, а фильтры сузят выборку до нужной категории.

  • 📦 pm list packages -s — только системные приложения;
  • 📱 pm list packages -3 — только сторонние, установленные пользователем;
  • 🚫 pm list packages -d — отключённые пакеты;
  • 🔍 pm list packages | grep имя — поиск по фрагменту имени (на Windows вместо grep используйте findstr).

Чтобы узнать подробности о конкретном пакете — версию, путь к APK, разрешения, — используется adb shell pm dump имя.пакета. Вывод объёмный, поэтому его удобно перенаправить в файл и изучать в текстовом редакторе.

📊 Для чего вы чаще всего используете adb shell pm?
Удаление предустановленных приложений
Отключение системных компонентов
Диагностика и просмотр пакетов
Восстановление удалённого пакета

Удаление и отключение приложений

Главное, что нужно понимать: на устройстве без root системные приложения физически не стираются из раздела /system. Команда pm uninstall с параметром --user 0 удаляет пакет только для текущего пользователя — APK остаётся в прошивке и может быть возвращён. Это делает операцию относительно безопасной и обратимой.

adb shell pm uninstall -k --user 0 com.example.app

Флаг -k сохраняет данные и кэш приложения — полезно, если планируется переустановка. Альтернативный, более мягкий вариант — отключение пакета без удаления:

adb shell pm disable-user --user 0 com.example.app

Отключённый пакет перестаёт работать и исчезает из лаунчера, но при этом его проще вернуть командой adb shell pm enable com.example.app. Для пакетов, удалённых через uninstall --user 0, восстановление выполняется иначе — через cmd package install-existing имя.пакета.

⚠️ Внимание: не отключайте и не удаляйте пакеты, назначение которых вам неизвестно. Удаление компонентов вроде системного лаунчера, служб телефонии или Package Installer способно привести к неработоспособности устройства вплоть до необходимости сброса к заводским настройкам.

Основные подкоманды pm: сводная таблица

Ниже собраны наиболее применимые подкоманды. Набор поддерживаемых операций может отличаться в зависимости от версии Android — полный список для конкретного устройства выводится командой adb shell pm без аргументов.

КомандаНазначениеПример
pm list packagesСписок установленных пакетовpm list packages -3
pm uninstallУдаление пакета для пользователяpm uninstall -k --user 0 pkg
pm disable-userОтключение пакета без удаленияpm disable-user --user 0 pkg
pm enableВключение отключённого пакетаpm enable pkg
pm clearОчистка данных приложенияpm clear pkg
pm grant / revokeВыдача и отзыв разрешенийpm grant pkg permission.CAMERA

Обратите внимание: pm clear полностью стирает данные приложения — аккаунты, настройки, локальные файлы. Действие необратимо, поэтому применяйте его осознанно.

Работа с разрешениями и пользователями

Подкоманды pm grant и pm revoke управляют разрешениями уровня runtime. Например, выдать приложению доступ к местоположению можно так:

adb shell pm grant com.example.app android.permission.ACCESS_FINE_LOCATION

Этот приём часто используется для утилит автоматизации, которым требуются разрешения, недоступные через стандартный диалог. Отозвать разрешение можно аналогичной командой revoke. Полный перечень запрошенных пакетом разрешений виден в выводе pm dump в секции requested permissions.

Отдельная область — многопользовательский режим. Команда pm list users показывает всех пользователей устройства, а параметр --user в других подкомандах указывает, к кому применяется действие. Идентификатор основного пользователя в Android — 0, именно поэтому в инструкциях по удалению bloatware везде фигурирует --user 0.

Типичные ошибки и их решение

Чаще всего при работе с pm встречаются несколько повторяющихся проблем. Разберём их без лишней теории.

  • Failure [DELETE_FAILED_INTERNAL_ERROR] — система запрещает удаление защищённого пакета; попробуйте disable-user вместо uninstall.
  • Failure [DELETE_FAILED_USER_RESTRICTED] — на устройстве действует профиль ограничений или корпоративная политика; действие блокируется администратором устройства.
  • Unknown package — опечатка в имени пакета либо пакет уже отсутствует; проверьте точное имя через pm list packages.
  • ❗ Команда adb не распознаётся в терминале — Platform-Tools не добавлены в PATH; запускайте adb из папки, куда распакован архив.

Если команда зависает без вывода, проверьте, не отозвано ли разрешение на отладку — иногда после обновления системы авторизацию нужно подтверждать заново. Помогает перезапуск сервера командой adb kill-server с последующим повторным подключением.

Чем pm отличается от cmd package

Начиная с Android 7 часть функций pm дублируется сервисом cmd package (например, cmd package install-existing). Обе команды обращаются к одному системному сервису PackageManagerService, но pm — классический интерфейс, а cmd package — более новый. Для восстановления удалённых пакетов используйте именно cmd package install-existing, у pm такой подкоманды нет.

Восстановление удалённых пакетов и меры предосторожности

Если после удаления системного приложения что-то пошло не так, верните пакет на место:

adb shell cmd package install-existing com.example.app

Команда сработает только для пакетов, удалённых через --user 0, — физически стёртые из прошивки компоненты так не восстановить. Поэтому root-удаление системных приложений и pm uninstall --user 0 — принципиально разные по риску операции.

Перед любой массовой чисткой предустановленного ПО сохраните исходный список пакетов в файл: adb shell pm list packages > packages_backup.txt. Это займёт секунды, но даст точную карту для отката. А если устройство после экспериментов ведёт себя нестабильно, крайняя мера — сброс к заводским настройкам: он вернёт все пакеты, удалённые для пользователя 0, поскольку системный раздел не изменялся.

Часто задаваемые вопросы

Нужен ли root для работы adb shell pm?

Нет. Команды pm выполняются с привилегиями оболочки ADB, которых достаточно для отключения и удаления приложений для текущего пользователя. Root требуется только для физического удаления APK из системного раздела.

Что означает параметр --user 0 в команде удаления?

Это идентификатор основного пользователя устройства. Указание --user 0 удаляет приложение только для этого профиля, оставляя APK в прошивке, что позволяет восстановить пакет позже.

Как вернуть приложение, удалённое через pm uninstall?

Используйте команду adb shell cmd package install-existing имя.пакета. Она работает для пакетов, удалённых с флагом --user 0. Если пакет был лишь отключён, достаточно adb shell pm enable имя.пакета.

Почему pm uninstall выдаёт ошибку DELETE_FAILED?

Возможные причины: пакет защищён системой, на устройстве действует корпоративная политика или профиль ограничений. Попробуйте вместо удаления отключить пакет командой pm disable-user --user 0 — она срабатывает чаще.

Можно ли через pm очистить данные приложения без удаления?

Да, команда adb shell pm clear имя.пакета стирает все данные и настройки приложения, оставляя сам пакет установленным. Учтите, что действие необратимо: аккаунты и локальные файлы приложения будут потеряны.