Установка APK, adb install:
Базовый сценарий: APK лежит на компьютере, ставим на подключенное устройство.
Код: Выделить всё
$ adb install app-release.apk
Performing Streamed Install
Success
Если пакет уже стоит, установка упадет:
Код: Выделить всё
adb: failed to install app-release.apk: Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install com.example.app without first uninstalling.]
Код: Выделить всё
adb install -r app-release.apk
Опция -d разрешает даунгрейд, то есть установку версии с меньшим versionCode поверх более новой. Без нее получите INSTALL_FAILED_VERSION_DOWNGRADE:
Код: Выделить всё
adb install -r -d app-1.0.apk
Опция -g сразу выдает приложению все runtime-разрешения, заявленные в манифесте (работает с Android 6.0). Незаменима в автотестах, не придется прокликивать диалоги:
Код: Выделить всё
adb install -r -g app-debug.apk
Код: Выделить всё
adb: failed to install app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
Код: Выделить всё
adb install -t app-debug.apk
Код: Выделить всё
adb install --abi armeabi-v7a app-release.apk
Split APK и App Bundle:
Google Play давно раздает приложения в формате App Bundle, поэтому на устройстве приложение часто состоит из нескольких APK: базовый плюс сплиты под архитектуру, плотность экрана и язык. Один base.apk без сплитов не встанет, получите INSTALL_FAILED_MISSING_SPLIT. Для набора есть install-multiple:
Код: Выделить всё
$ adb install-multiple base.apk split_config.arm64_v8a.apk split_config.ru.apk split_config.xxhdpi.apk
Performing Streamed Install
Success
Не путайте с install-multi-package: эта команда ставит несколько независимых пакетов одной атомарной сессией, либо встанут все, либо ни один. Устройство должно быть на Android 10 или новее:
Код: Выделить всё
adb install-multi-package app.apk companion-watch.apk
Код: Выделить всё
java -jar bundletool.jar build-apks --bundle=app.aab --output=app.apks --connected-device
java -jar bundletool.jar install-apks --apks=app.apks
Код: Выделить всё
$ adb uninstall com.example.app
Success
Код: Выделить всё
adb uninstall -k com.example.app
Отдельный прием против предустановленного хлама: pm uninstall с указанием пользователя удаляет приложение только для этого пользователя, системный раздел не трогает и root не требует:
Код: Выделить всё
$ adb shell pm uninstall --user 0 com.miui.analytics
Success
Код: Выделить всё
adb shell cmd package install-existing com.miui.analytics
Код: Выделить всё
$ adb shell pm list packages
package:com.android.settings
package:org.telegram.messenger
package:ru.vk.store
Код: Выделить всё
$ adb shell pm list packages -3 yandex
package:ru.yandex.searchplugin
package:ru.yandex.taxi
Код: Выделить всё
$ adb shell pm list packages -f com.example.app
package:/data/app/~~7sKjf1Qw==/com.example.app-9hGt3A==/base.apk=com.example.app
Код: Выделить всё
$ adb shell pm list packages -i -3
package:org.telegram.messenger installer=com.android.vending
package:ru.yandex.searchplugin installer=ru.vk.store
package:com.example.app installer=null
pm path и dumpsys package:
Точные пути всех APK пакета выдает pm path:
Код: Выделить всё
$ adb shell pm path com.example.app
package:/data/app/~~7sKjf1Qw==/com.example.app-9hGt3A==/base.apk
package:/data/app/~~7sKjf1Qw==/com.example.app-9hGt3A==/split_config.arm64_v8a.apk
Полное досье на пакет дает dumpsys package (подробнее о dumpsys в главе 9):
Код: Выделить всё
adb shell dumpsys package com.example.app
Код: Выделить всё
versionCode=1042 minSdk=26 targetSdk=35
versionName=2.14.1
firstInstallTime=2026-03-02 11:48:07
lastUpdateTime=2026-06-09 09:15:33
runtime permissions:
android.permission.CAMERA: granted=true
android.permission.POST_NOTIFICATIONS: granted=false
Код: Выделить всё
adb shell "dumpsys package com.example.app | grep -E 'version|InstallTime|UpdateTime'"
Код: Выделить всё
$ adb shell pm clear com.example.app
Success
Включение и отключение, pm enable и pm disable:
Полный pm disable из shell запрещен, это привилегия root:
Код: Выделить всё
$ adb shell pm disable com.android.chrome
Exception occurred while executing 'disable':
java.lang.SecurityException: Shell cannot change component state for com.android.chrome/null to 2
Код: Выделить всё
$ adb shell su -c "pm disable com.android.chrome"
Package com.android.chrome new state: disabled
Код: Выделить всё
$ adb shell pm disable-user --user 0 com.android.chrome
Package com.android.chrome new state: disabled-user
Код: Выделить всё
$ adb shell pm enable --user 0 com.android.chrome
Package com.android.chrome new state: enabled
Разрешения, pm grant и pm revoke:
Команды работают только с runtime-разрешениями (protection level dangerous) и только если разрешение объявлено в манифесте приложения. Успех молчаливый, вывода нет:
Код: Выделить всё
adb shell pm grant com.example.app android.permission.CAMERA
adb shell pm revoke com.example.app android.permission.ACCESS_FINE_LOCATION
Код: Выделить всё
$ adb shell pm grant com.example.app android.permission.READ_CONTACTS
Exception occurred while executing 'grant':
java.lang.SecurityException: Package com.example.app has not requested permission android.permission.READ_CONTACTS
Код: Выделить всё
$ adb shell pm grant com.example.app android.permission.INTERNET
Exception occurred while executing 'grant':
java.lang.SecurityException: Permission android.permission.INTERNET requested by com.example.app is not a changeable permission type
Частые ошибки установки и что с ними делать:
INSTALL_FAILED_UPDATE_INCOMPATIBLE: подписи старой и новой версии не совпадают, классика при попытке накатить debug-сборку поверх релиза из маркета. Решение одно: удалить пакет и поставить заново, данные при этом теряются.
INSTALL_FAILED_INSUFFICIENT_STORAGE: кончилось место в /data. Проверьте adb shell df -h /data и почистите устройство.
INSTALL_FAILED_USER_RESTRICTED: фирменная боль владельцев Xiaomi и Poco. В настройках разработчика MIUI/HyperOS нужно отдельно включить "Установка через USB", иногда система требует войти в Mi-аккаунт и подождать.
INSTALL_PARSE_FAILED_NO_CERTIFICATES: APK не подписан или подпись повреждена. Релизные сборки подписывайте до установки.
Если adb install вообще молчит или ругается на device offline и unauthorized, это не про пакеты, вернитесь к главе 3 и проверьте подключение.
На этом с управлением пакетами все. Установленное приложение надо как-то запускать и дергать его экраны, этим займемся в главе 12 про am, а в следующей главе подключим logcat и посмотрим, что приложения пишут в лог.