Практическое использование adb shell am: шаблоны и кейсы

adb shell am позволяет запускать Activity, Service и отправлять Broadcast, формируя intents (action, data, component, extras, флаги) из консоли — достаточно знать синтаксис am start, am startservice и am broadcast.

Кратко — что нужно запомнить: формат команды adb shell am <subcommand> [опции] [INTENT], ключевые подкоманды start, startservice, start-foreground-service, broadcast, force-stop, и набор опций для action, data, component, extras и флагов.

Быстрый старт: синтаксис и базовые команды

Основной паттерн:

adb shell am <subcommand> [параметры INTENT]

Частые подкоманды:

  • start — запустить Activity.
  • startservice / start-foreground-service — запустить сервис.
  • broadcast — отправить broadcast.
  • force-stop — принудительная остановка приложения.

Ключи для Intent:

  • -n package/.Activity — конкретный компонент.
  • -a ACTION — action.
  • -d URI — data URI.
  • -c CATEGORY — category.
  • -t MIME_TYPE — тип данных.
  • -f FLAGS — флаги (маска, hex).
  • Extras: --es (String), --ei (int), --el (long), --ez (boolean), --ef (float), --esa (String[]).

Если не уверены в имени Activity/Receiver — смотрите манифест в Android Studio или используйте adb shell dumpsys package your.package / dumpsys activity.

Запуск Activity и работа с Intent (практика)

  1. Запуск по component (надежно):
adb shell am start -n com.example.app/.MainActivity

При полном имени:

adb shell am start -n com.example.app/com.example.app.ui.MainActivity
  1. Deep link (action + data):
adb shell am start -a android.intent.action.VIEW -d "https://example.com/product/123" com.example.app

Если не указывать package — Android покажет chooser, если есть несколько обработчиков.

  1. Запуск как LAUNCHER:
adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n com.example.app/.MainActivity
  1. Передача extras:
adb shell am start -n com.example.app/.ProfileActivity --es "source" "push" --ei "userId" 12345 --ez "featureEnabled" true

Для массивов:

adb shell am start -n com.example.app/.ListActivity --esa "tags" "news,sport,tech"
  1. Флаги стека (bitmask):
adb shell am start -n com.example.app/.MainActivity -f 0x10008000

0x10008000 = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP. Флаги задаются одним числом (OR битов).

Флаги указываются как шестнадцатеричная маска. Чтобы получить нужное значение — объединяйте значения флагов (OR).

  1. Передача сложных структур: am не создаёт Parcelable — передавайте JSON в строковом extra и парсите в приложении:
adb shell am start -n com.example.app/.OrderActivity --es "order_json" '{"id":42,"price":99.9}'

Экранируйте кавычки/символы в командной строке.

Сервисы, broadcast, отладочные кейсы и шаблоны

  • Запуск обычного сервиса:
adb shell am startservice -n com.example.app/.SyncService --es "source" "manual"
  • Запуск foreground service:
adb shell am start-foreground-service -n com.example.app/.LocationService
  • Отправка broadcast:
adb shell am broadcast -a com.example.app.ACTION_SYNC --es "reason" "manual"

С указанием Receiver:

adb shell am broadcast -n com.example.app/.SyncReceiver -a com.example.app.ACTION_SYNC
  • Force-stop приложения:
adb shell am force-stop com.example.app

(для очистки данных используйте adb shell pm clear com.example.app — это уже pm)

Практические кейсы:

  • Тест deep link: эмулируете ссылку и проверяете парсинг параметров.
  • UI-тесты: сразу открываете нужный экран, передавая debug-only Activity и параметры.
  • Тест пуша: запуск Activity с action, эмулирующий поведение пуша.
  • Отладка BroadcastReceiver: отправляете кастомный action и проверяете onReceive.

Мини‑шпаргалка команд

КомандаЧто делает
am start -n package/.ActivityЗапускает Activity по component
am start -a ACTION -d URI [package]Запускает Intent с action/data
am startservice -n package/.ServiceЗапускает сервис
am start-foreground-service -n package/.ServiceЗапускает foreground service
am broadcast -a ACTIONОтправляет broadcast
am force-stop packageОстанавливает приложение

Частые ошибки

  • Error: Activity class does not exist — опечатка в имени, неверный applicationId или Activity недоступна в данном build variant.
  • SecurityException — компонент не экспортирован (android:exported="false") или требуются системные разрешения.
  • Intent вызывает chooser — не указали пакет, и есть несколько обработчиков.
  • Проблемы с кавычками/экранированием — используйте правильную комбинацию одинарных/двойных кавычек в оболочке.

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

FAQ

  • Как узнать полное имя Activity?
    • Через Android Studio (Profile or Debug APK) или adb shell dumpsys package your.package.
  • Можно ли передать Parcelable через am?
    • Нет — передавайте JSON/строку и десериализуйте внутри приложения.
  • Как составить mask флагов?
    • Берёте значения флагов из документации и объединяете (OR). В командной строке указываете итог в hex, например -f 0x20000000.
  • Am работает с эмулятором и реальным устройством?
    • Да — при подключённом устройстве/эмуляторе через adb.

Если нужно — соберу конкретные шаблоны команд под ваш сценарий (UI‑тесты, deep link, эмуляция пуша, профилирование).