Код: Выделить всё
adb shell am startКод: Выделить всё
adb shell cmd activity start-activityЗапуск Activity по компоненту:
Самая частая операция. Синтаксис компонента: пакет/класс. Если класс лежит в корне пакета, его можно сократить до точки с именем класса.
Код: Выделить всё
adb shell am start -n com.android.settings/.Settings
Starting: Intent { cmp=com.android.settings/.Settings }
Код: Выделить всё
adb shell cmd package resolve-activity --brief com.example.app
com.example.app/com.example.app.ui.MainActivity
Код: Выделить всё
adb shell monkey -p com.example.app -c android.intent.category.LAUNCHER 1
Код: Выделить всё
adb shell am start -S -W -n com.example.app/.ui.MainActivity
Stopping: com.example.app
Starting: Intent { cmp=com.example.app/.ui.MainActivity }
Status: ok
LaunchState: COLD
Activity: com.example.app/.ui.MainActivity
TotalTime: 734
WaitTime: 761
Complete
Intent без явного компонента:
Флаг -a задаёт action, -d передаёт data URI, -c добавляет категорию. Система сама подберёт обработчик, как при обычном неявном Intent.
Код: Выделить всё
adb shell am start -a android.intent.action.VIEW -d https://cyberlake.ru
Starting: Intent { act=android.intent.action.VIEW dat=https://cyberlake.ru/... }
Код: Выделить всё
-c android.intent.category.BROWSABLEКлассическая ловушка: символы ? и & в URL. Команда уходит во второй шелл на устройстве, и без кавычек & оборвёт её, отправив остаток в фон. Оборачивайте либо весь remote-кусок, либо сам URL:
Код: Выделить всё
adb shell "am start -a android.intent.action.VIEW -d 'https://cyberlake.ru/search?q=adb&page=2'"
Строка кладётся через -e или его полный синоним --es, boolean через --ez, int через --ei. Есть и остальные типы: --el (long), --ef (float), --eu (URI), --esa (массив строк через запятую), --eia (массив int).
Код: Выделить всё
adb shell am start -n com.example.app/.DebugActivity --es env staging --ez mock_api true --ei retry_count 3
Starting: Intent { cmp=com.example.app/.DebugActivity (has extras) }
Код: Выделить всё
adb shell am start -n com.example.app/.NoteActivity --es title '"Отчет за июнь"'
Сервис запускается через am start-service (историческое написание startservice тоже работает):
Код: Выделить всё
adb shell am start-service -n com.example.app/.SyncService
Starting service: Intent { cmp=com.example.app/.SyncService }
Код: Выделить всё
Error: Not found; no service started.Код: Выделить всё
Error: app is in background uid UidRecord{...}Код: Выделить всё
adb shell am start-foreground-service -n com.example.app/.SyncService
Код: Выделить всё
adb shell am broadcast -a com.example.app.ACTION_DEBUG -n com.example.app/.DebugReceiver --ez verbose true --ei level 3
Broadcasting: Intent { act=com.example.app.ACTION_DEBUG flg=0x400000 cmp=com.example.app/.DebugReceiver (has extras) }
Broadcast completed: result=0
Код: Выделить всё
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=12345, uid=2000
Код: Выделить всё
adb shell settings put global sysui_demo_allowed 1
adb shell am broadcast -a com.android.systemui.demo -e command enter
adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1000
adb shell am broadcast -a com.android.systemui.demo -e command exit
force-stop убивает все процессы пакета и снимает его задачи:
Код: Выделить всё
adb shell am force-stop com.example.app
Код: Выделить всё
adb shell am kill com.example.app
adb shell am kill-all
Что сейчас запущено:
Код: Выделить всё
adb shell am stack list
RootTask id=1 bounds=[0,0][1080,2400] displayId=0 userId=0 visible=true
taskId=74: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.Settings }
Код: Выделить всё
adb shell dumpsys activity activities | grep -i resumedactivity
topResumedActivity=ActivityRecord{a1b2c3 u0 com.android.settings/.Settings t74}
Код: Выделить всё
adb shell ps -A | grep com.example.app
u0_a217 14233 876 15234500 189456 0 0 S com.example.app
Звонок. DIAL открывает номеронабиратель с подставленным номером, CALL начинает вызов сразу: у shell есть разрешение CALL_PHONE, так что звонок реально пойдёт. Аккуратнее с короткими и платными номерами.
Код: Выделить всё
adb shell am start -a android.intent.action.DIAL -d tel:+74951234567
adb shell am start -a android.intent.action.CALL -d tel:+74951234567
Код: Выделить всё
adb shell am start -a android.intent.action.SENDTO -d sms:+79091234567 --es sms_body '"Тестовое сообщение с ADB"'
Код: Выделить всё
adb shell am start -a android.settings.SETTINGS
adb shell am start -a android.settings.WIFI_SETTINGS
adb shell am start -a android.settings.BLUETOOTH_SETTINGS
adb shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:com.example.app
adb shell am start -a android.settings.APPLICATION_DEVELOPMENT_SETTINGS
Частые ошибки:
Error type 3:
Код: Выделить всё
Error type 3
Error: Activity class {com.example.app/com.example.app.MainActivity} does not exist.
Код: Выделить всё
pm list packages --user 10 | grep exampleКод: Выделить всё
am start --user 10 -n ...Permission Denial при запуске чужой внутренней Activity:
Код: Выделить всё
java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.example.app/.InternalActivity } from null (pid=12345, uid=2000) not exported from uid 10217
Третья по частоте проблема - кавычки, мы её разобрали выше: если extras или URL внезапно обрезаются, почти наверняка локальный шелл съел ваши кавычки или & ушёл в фон.
На этом с ActivityManager всё. В следующей главе займёмся его соседом, оконным менеджером wm: размеры, плотность, дисплеи.