Мобильность: Android, adb и вседозволенность. Часть 1

Всем привет! Вы же наверняка знаете, что такое Android? Все мы с ним сталкивались по жизни, а кто-то возможно и работал с ним. Сегодня хочу затронуть следующие аспекты работы с Android:

  • ADB
  • Надстройки интерфейсов

Все замечания прошу описывать в комментариях.

Android Debug Bridge (ADB)

ADB — это универсальный инструмент командной строки, который позволяет общаться с устройством на базе ОС Android, выполнять различные команды и проводить отладку на устройстве. Для того, чтобы установить ADB вам потребуется скачать Android SDK. Для запуска необходима предустановленная Java 8, с заданной системной переменной JAVA_HOME, либо с прописанным путем до исполнительного файла java в системной переменной PATH. Android SDK в свою очередь входит в поставку Android Studio — если нет желания устанавливать IDE, то можно скачать только пакет SDK tools для своей операционной системы, и дальше выполнить следующие действия:

  1. Распаковать архив
  2. Перейти в папку ./tools/bin
  3. Запустить консоль в этой папке
  4. Выполнить команду sdkmanager(.bat/.sh) platform-tools и дождаться ее завершения
  5. После чего по пути ../../platform-tools у вас будут находиться все необходимые файлы последней актуальной версии

Так же рекомендую прописать расположение папки platform-tools в системной переменной PATH, для удобства использования adb в любой другой папке.
Для того, чтобы взаимодействовать с телефоном, на телефоне должна быть включена Отладка по USB, в противном случае подключиться к телефону вы не сможете. Так же, владельцам Windows <10 придется устанавливать дополнительные драйвера (можно установить через sdkmanager), начиная с неизвестного для меня момента времени Windows 10 имеет необходимые драйвера в комплекте поставки, либо умеет их очень быстро ставить с интернета — в связи с чем проблем с их установкой не возникает. А теперь перейдем непосредственно к консольным командам, которые позволят нам творить некоторую магию.

Запуск сервера
adb start-server

Т.к. ADB является приложением с клиент-серверной архитектурой, в качестве сервера выступает ваш компьютер, а подключенный телефон или планшет является клиентом. Эта команда позволяет нам запустить этот самый сервер. Но на самом деле она не так важна — при выполнении любой другой команды, требующей запущенного сервера, сервер будет инициализирован автоматически.

Остановка сервера
adb kill-server

Если сервер вам больше не нужен, его так же можно остановить.

Получение списка подключенных устройств
$ adb devices
List of devices attached
86a25ef2        device

Для того чтобы убедиться, что соединение между телефоном и сервером установлено — можно выполнить эту команду. Если напротив идентификатора устройства написано device — значит устройство успешно подключено. Если же unathorized — значит нужно разблокировать устройство, переподключить кабель и дать разрешение на подключение к компьютеру (появится на экране). Если же ваше устройство не отображается, нужно решать вопрос с драйверами.

$ adb devices -l
List of devices attached
86a25ef2               device product:gemini model:MI_5 device:gemini transport_id:1

Если же у вас большое количество подключенных устройств, и вы хотите разобраться — что есть что, то можно выполнить ту же команду, но только с параметром -l — в результате вы получите более подробный вывод.

Включение отладки по WIFI
$ adb tcpip 5555
restarting in TCP mode port: 5555
$ adb connect <device ip>:5555
connected to <device ip>:5555
$ adb devices
List of devices attached
<device ip>:5555     device

Для того, чтобы настроить режим отладки по WIFI необходимо, чтобы устройство и ваш компьютер находились в одной сети WIFI, или просто были доступны друг для друга.
Порядок действий следующий:

  1. Подключаете устройство и убеждаетесь, что отладка работает
  2. Выполняете команду adb tcpip 5555
  3. Отключаете кабель от устройства
  4. Выполняете команду adb connect <device ip>:5555
  5. Проверяете список подключенных устройств
  6. PROFIT!
Работа с логами устройства
$ adb logcat
...a lot of logs...

Logcat является одной из самых популярных утилит. Для удобной работы с ней есть приложение Monitor поставляемое вместе с ADB в Platform-tools для Android SDK и так же Zero Helper позволяет легко взаимодействовать с Logcat. Но эти утилиты мы рассмотрим в одной и следующих заметок.

Отображение

Начиная с Android 6.0 Marshmallow стандартный вид логов сильно изменился в сравнении с предыдущими версиями ОС. Для того, чтобы вернуть им привычный краткий вид достаточно добавить следующий параметр:

$ adb logcat -v brief
D/PhoneStatusBar( 2437): removeNotification key=android.os.Binder@8c98235 keyCode=147423797 old=null
...

Весь список доступных модификаторов:

  • brief
  • long
  • proccess
  • raw
  • tag
  • threadtime (default для >=Android 6.0)
  • time
Фильтрация

Стандартными средствами logcat можно фильтровать следующие вещи:

  • Приоритет — соответствует приоритету, с которым разработчик логирует то или иное сообщение в системный журнал
    • Verbose (V)
    • Debug (D)
    • Info (I)
    • Warn (W)
    • Error (E)
    • Fatal (F)
    • Silent (S) — не выводить ничего
  • Тэг (Tag) — cоответствует тэгу установленному для конкретного приложения/сервиса

Примеры

  • adb logcat *:E — фильтрация всех ошибок
  • adb logcat ActivityManager:V *:S — вывод всех сообщения с тэгом ActivityManager
  • adb logcat DEBUG:F chromium:V *:F — вывод всех фатальных сообщений с тэгом DEBUG, всех сообщений с тэгом chromium, вывод всех фатальных сообщений
Работа с приложениями
Установка
$ adb install /path/to/file.apk

После чего будет произведена попытка установить заданный файл APK (указывается путь к файлу на вашем компьютере). Но ничего не получится, если у вас уже установлено приложение с аналогичным названием (например: com.android.vending — Google Play). Для того, чтобы позволить обновить версию приложения — необходимо добавить параметр -r, например:

$ adb install -r /path/to/file.apk

В случае, если вы пытаетесь установить версию старее, чем уже имеется на вашем устройстве, вам поможет параметр -d для того, чтобы не потерять данные приложения. DISCLAIMER: Такой способ даунгрейда может приводить к различным ошибкам в работе приложения. Используйте на свой страх и риск

$ adb install -r -d /path/to/file.apk

Если вы попытаетесь установить обновление приложения, подпись которого отличается от подписи уже установленного — обновить будет нельзя.
Если вы попытаетесь установить приложение, которое предоставляет какой-то общий интерфейс для других приложений, например если это приложения одного разработчика и они как-то связываются друг с другом, и его подпись так же будет отличаться от остальных — установить его так же не удастся.

Удаление
$ adb uninstall org.telegram.messenger

Для удаления приложения необходимо знать название пакета, иначе ничего не выйдет. Если вам по какой-то причине необходимо сохранить все данные вашего приложения — добавьте параметр -k перед названием пакета.

Обмен файлами с устройством
$ adb push /path/on/pc /path/on/device
$ adb pull /path/on/device /path/on/pc

Для обмена данными с устройством можно использовать команды push — для отправки данных на устройство, и pull — для получения данных с него. Для этих команд так же справедливы маски, т.е. если вы хотите отправить все png файлы из папки на устройство, достаточно указать на них так: /path/*.png. На устройство по умолчанию рекомендую копировать всё по пути /sdcard — так вы сможете быстро получить доступ ко всем необходимым файлам в корне внутренней памяти, даже если SD-карта не установлена в устройстве.
На этом первая часть рассказа про команды adb и работы с ними окончена. В следующей части будут рассмотрены команды которые выполняются непосредственно на устройстве через adb shell.