adb shell и удаленная оболочка:
Команда adb shell открывает оболочку прямо на устройстве. На Android это mksh (/system/bin/sh), а большинство привычных утилит дает toybox, урезанный аналог coreutils. Режимов два. Интерактивный:
Код: Выделить всё
$ adb shell
akita:/ $Второй режим, одноразовый запуск команды:
Код: Выделить всё
$ adb shell getprop ro.build.version.release
15Классическая ловушка: подстановка путей. Звездочку раскрывает ваша локальная оболочка, а не устройство. Поэтому шаблоны берите в кавычки:
Код: Выделить всё
adb shell "ls /sdcard/DCIM/Camera/*.jpg"Для полноэкранных утилит вроде top при одноразовом запуске нужен псевдотерминал, его дает флаг -t:
Код: Выделить всё
adb shell -t toppwd показывает текущий каталог. Сессия начинается с корня:
Код: Выделить всё
akita:/ $ pwd
/Код: Выделить всё
akita:/ $ cd /sdcard/Download
akita:/sdcard/Download $ ls -la
total 24180
drwxrws--- 2 u0_a187 media_rw 4096 2026-06-10 21:14 .
drwxrws--x 18 u0_a187 media_rw 4096 2026-06-09 18:02 ..
-rw-rw---- 1 u0_a187 media_rw 24739840 2026-06-10 21:14 platform-tools_r36.0.0-linux.zipcat выводит содержимое файла:
Код: Выделить всё
akita:/ $ cat /proc/version
Linux version 5.15.149-android14-11-g... (build@build-host) ...Код: Выделить всё
akita:/ $ mkdir -p /data/local/tmp/run/logs
akita:/ $ touch /data/local/tmp/run/logs/start.marker
akita:/ $ ls /data/local/tmp/run/logs
start.marker
akita:/ $ rm -rf /data/local/tmp/runКод: Выделить всё
$ adb push strace-arm64 /data/local/tmp/strace
$ adb shell chmod 755 /data/local/tmp/strace
$ adb shell /data/local/tmp/strace -VПосмотреть SELinux-контексты файлов можно флагом -Z:
Код: Выделить всё
akita:/ $ ls -lZ /data/local/tmpadb shell работает от пользователя shell с uid 2000 в SELinux-домене shell:
Код: Выделить всё
akita:/ $ id
uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid) context=u:r:shell:s0Код: Выделить всё
akita:/ $ ls /data/data/com.android.chrome
ls: /data/data/com.android.chrome: Permission deniedКод: Выделить всё
$ adb shell run-as com.example.myapp ls -la filesПередача файлов, adb push и adb pull:
Копирование не требует входа в shell. push льет с компьютера на устройство, pull обратно. Удаленный путь всегда пишется с прямыми слешами, даже на Windows:
Код: Выделить всё
$ adb push app-debug.apk /data/local/tmp/
app-debug.apk: 1 file pushed, 0 skipped. 39.1 MB/s (24752148 bytes in 0.604s)Код: Выделить всё
$ adb pull /sdcard/DCIM/Camera ./camera_backup
/sdcard/DCIM/Camera/: 184 files pulled, 0 skipped. 30.6 MB/s (1289748480 bytes in 40.2s)Код: Выделить всё
adb pull -a /sdcard/Documents/contract_2024.pdfКод: Выделить всё
adb push --sync ./assets /sdcard/test_assetsЧастые ошибки:
Код: Выделить всё
$ adb push hosts /system/etc/hosts
adb: error: failed to copy 'hosts' to '/system/etc/hosts': remote couldn't create file: Read-only file systemКод: Выделить всё
$ adb push tool.bin /data/
adb: error: failed to copy 'tool.bin' to '/data/tool.bin': remote couldn't create file: Permission deniedadb root и adb unroot:
Демон adbd на устройстве обычно работает от пользователя shell. Команда adb root перезапускает его от root, после чего любой adb shell, push и pull сразу получают полные права. Но работает это только на сборках userdebug и eng: образы эмулятора без Google Play, инженерные прошивки, многие кастомы вроде LineageOS. На обычном магазинном смартфоне:
Код: Выделить всё
$ adb root
adbd cannot run as root in production buildsКод: Выделить всё
$ adb shell getprop ro.debuggable
1Код: Выделить всё
$ adb root
restarting adbd as root
$ adb shell id
uid=0(root) gid=0(root) groups=0(root) context=u:r:su:s0Не путайте adb root с root через Magisk (глава 15): там adbd остается обычным, а права вы поднимаете уже внутри сессии командой su.
Обратно к обычному режиму:
Код: Выделить всё
$ adb unroot
restarting adbd as non rootРазделы /system, /vendor и /product смонтированы только на чтение и защищены dm-verity, проверкой целостности блоков. adb remount перемонтирует их на запись. Нужен adb root, то есть все та же сборка userdebug, плюс разблокированный загрузчик. Первая попытка на свежем устройстве обычно упирается в verity:
Код: Выделить всё
$ adb root
$ adb remount
dm_verity is enabled on the system partition.
Use "adb disable-verity" to disable verity.
If you do not, remount may succeed, however, you will still not be able to write to these volumes.
remount failedКод: Выделить всё
adb root
adb disable-verity
adb reboot
adb wait-for-device
adb root
adb remount
remount succeededПосле успешного remount проходит то, что раньше падало:
Код: Выделить всё
$ adb push hosts /system/etc/hosts
hosts: 1 file pushed, 0 skipped. 2.1 MB/s (12288 bytes in 0.006s)В следующей главе займемся менеджером пакетов: установка и удаление приложений, и связка adb push в /data/local/tmp плюс pm install там встретится в первых же примерах.