Практическое использование 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 (практика)
- Запуск по component (надежно):
adb shell am start -n com.example.app/.MainActivity
При полном имени:
adb shell am start -n com.example.app/com.example.app.ui.MainActivity
- 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, если есть несколько обработчиков.
- Запуск как LAUNCHER:
adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n com.example.app/.MainActivity
- Передача 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"
- Флаги стека (bitmask):
adb shell am start -n com.example.app/.MainActivity -f 0x10008000
0x10008000 = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP. Флаги задаются одним числом (OR битов).
Флаги указываются как шестнадцатеричная маска. Чтобы получить нужное значение — объединяйте значения флагов (OR).
- Передача сложных структур: 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.
- Через Android Studio (Profile or Debug APK) или
- Можно ли передать Parcelable через am?
- Нет — передавайте JSON/строку и десериализуйте внутри приложения.
- Как составить mask флагов?
- Берёте значения флагов из документации и объединяете (OR). В командной строке указываете итог в hex, например
-f 0x20000000.
- Берёте значения флагов из документации и объединяете (OR). В командной строке указываете итог в hex, например
- Am работает с эмулятором и реальным устройством?
- Да — при подключённом устройстве/эмуляторе через adb.
Если нужно — соберу конкретные шаблоны команд под ваш сценарий (UI‑тесты, deep link, эмуляция пуша, профилирование).