Использование am через adb shell: кратко и на практике

Команда am позволяет запускать активности, сервисы и отправлять интенты прямо из adb shell — достаточно подключить устройство (adb devices), выполнить adb shell и использовать am start, am broadcast, am startservice и т.д. Ниже — компактное практическое руководство с командами и трюками.

Подготовка и базовый синтаксис

  1. Включите USB‑отладку в настройках разработчика и подключите устройство:
    • Проверка: adb devices
    • Войти в shell: adb shell
  2. Общий формат: am <команда> [параметры]
    Основные команды: start, startservice, broadcast, force-stop, kill, dumpheap.

Пример простого запуска activity:

adb shell am start -n com.android.settings/.Settings
  • -n package/activity — явно указывает компонент.
  • -a — action, -d — data (URI), -t — MIME, --es/--ei — extras (строка/инт).

Тестируйте команды сначала на эмуляторе AVD: не придется восстанавливать разрешения или рисковать данными.

Запуск активностей, интентов и сервисов (примеры)

  • Запуск главного экрана приложения:
adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n com.example.app/.MainActivity
  • Открыть URL в браузере:
adb shell am start -a android.intent.action.VIEW -d "https://example.com"
  • Передать extra:
adb shell am start -a android.intent.action.SEND -t "text/plain" --es "android.intent.extra.TEXT" "Пример"
  • Запуск сервиса:
adb shell am startservice -n com.example/.MyService
adb shell am stopservice -n com.example/.MyService
  • Отправка broadcast:
adb shell am broadcast -a com.example.ACTION_TEST --es message "Hello"

Работа с пользователями и флагами

  • Выполнить для конкретного пользователя: --user 0
  • Запуск без добавления в историю: добавить флаг -f 0x20000000

Продвинутые команды, отладка и трюки

  • Принудительная остановка приложения:
adb shell am force-stop com.example.app
  • Убить процесс:
adb shell am kill com.example.app
  • Дамп кучи:
adb shell am dumpheap com.example.app /sdcard/app_heap.hprof
  • Логи ActivityManager:
adb logcat ActivityManager:I *:S
  • Скрипт автоматизации (пример .sh):
#!/system/bin/sh
am start -n com.android.camera/.Camera
sleep 2
input keyevent 26

Сравнение ключевых опций am

ОпцияЧто делаетПример
startЗапускает activityam start -n pkg/.Activity
startserviceЗапускает сервисam startservice -n pkg/.Service
broadcastОтправляет интентam broadcast -a ACTION
force-stopПринудительно останавливает appam force-stop pkg
killЗавершает процессam kill pkg
dumpheapСнимает дамп памятиam dumpheap pkg /sdcard/heap.hprof

На Android 12+ некоторые команды ограничены политиками безопасности. Для операций с системными/чувствительными приложениями могут потребоваться root-права или особые разрешения. Не экспериментируйте с банковскими приложениями.

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

  • Неправильно указан component: убедитесь в точном имени пакета и Activity (adb shell pm list packages и pm dump помогают`).
  • Команда игнорируется: проверьте права (особенно на Android 12+), попробуйте эмулятор.
  • Интент не доставлен: проверьте action/data/MIME и наличие соответствующего receiver/activity.

FAQ

  • Как узнать имя activity?
    Используйте adb shell dumpsys package com.example.app | grep -A 10 "Activity" или смотрите манифест в исходниках.
  • Можно ли отправлять extras сложных типов?
    Да: --es (string), --ei (int), --ez (boolean). Для сериализуемых объектов нужен другой подход.
  • Нужно ли root?
    Большинство команд работают без root; но операции с системными сервисами или dumpheap могут потребовать повышенных прав.

Используйте am --help для полного списка опций и экспериментируйте на тестовых устройствах — это ускорит отладку и автоматизацию.