воскресенье, 31 января 2016 г.

Android Screencast. Управление Android устройством через ADB.

В этом посте я вкратце расскажу вам об одном из вариантов управления Android устройством через ADB. Для чего это может понадобиться? Самая распространенная ситуация - это вариант, в котором экран устройства у вас поврежден, например, разбит, а получить доступ к устройству нужно. Например, для копирования данных или выполнения каких-либо других действий. Также возможно рассмотреть и другие сценарии использования, такие как выполнение определенной последовательности действий в автоматическом режиме. Что это может быть? Да что угодно ... К примеру, у вас есть какое-то важное для вас приложение на котором установлен "защитный PIN-код", который вы забыли. При этом вы знаете что код состоит из 4 цифр, например, от 0000 до 9999. Понятно что такой вариант "защиты" практически ни от чего не защищает, ну разве что от случайного человека, который взял в руки ваш телефон. Но если вы действительно забыли этот код, подобрать его не так сложно. Надо всего лишь попробовать все комбинации от 0000 до 9999 ... Правда сколько времени у вас на этой уйдет, если пытаться сделать это вручную? Думаю сценарий понятен, нужно написать небольшой скрипт, который автоматически будет нажимать в нужные кнопки на экране (пример, естественно, учебный, в большинстве случаев есть масса других способов "вытащить" такой пароль из приложения).

Что нам понадобится? Конечно же немного теории. Для начала, например, рекомендую ознакомиться с этой статьей - Автоматизация тестирования Android приложений, из которой самое главное в рамках поставленных нами задач - это работа с Event'ами. Т.е. сначала мы можем записать в лог с помощью команды adb shell getevent -t > events.txt определенное действие, а потом воспроизвести его. Здесь я сразу перейду к результатам (экспериментировать мы будем на моем Micromax Q415 Canvas Pace 4G). Для того чтобы произвести эмуляцию нажатия (тапа) по экране в месте с определенными координатами X,Y необходимо выполнить следующий сценарий:

adb shell sendevent /dev/input/event0 3 57 3
adb shell sendevent /dev/input/event0 3 53 X
adb shell sendevent /dev/input/event0 3 54 Y

adb shell sendevent /dev/input/event0 1 330 1 
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 1 330 0
adb shell sendevent /dev/input/event0 0 0 0 

Чтобы разобраться что к чему, если что-то непонятно можно прочитать еще вот эту статью - Простая автоматизация нагрузочного UI тестирования для Android QA инженера. Если вкратце, то сначала мы задаем координаты нажатия, потом делаем touch down (1 330 1) и затем touch up (1 330 0). Событие 0 0 0 здесь - это так называемый разделитель событий. Откуда я взял конкретные коды событий? Из лога ... т.е. запустил запись событий в лог, с помощью команды приведенной выше, кликнул по определенному месту экрана, остановил запись в лог, выделил из него нужное, а затем просто воспроизвел записанную последовательность.

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

В этом варианте, когда управлять устройством хочется при помощи мышки с ПК и видеть результат своих действий нам поможет проект AndroidScreencast от xSAVIKx. На данный момент последняя версия приложения v.0.0.5.1S. Скачать именно эту версию можно с GitHub'а - androidscreencast-0.0.5.1S.jar или с зеркала, отсюда - android_screencast.7z .

В последнем архиве в "комплект" уже входит jar-файл, драйвера ADB и platform-tools, т.е. adb.exe и все сопутствующее. Да, естественно, для общения с устройством через ADB - в нем должна быть включена "Отладка по USB" в опциях разработчика. Скачиваем архив android_screencast.7z и распаковываем в отдельную папку. Далее подключаем устройство с помощью USB-кабеля к ПК и запускаем Android Screencast - java -jar androidscreencast-0.0.5.1S.jar (на ПК должна быть установлена Java версии >= 7):


И сразу же видим рабочий стол нашего устройства. Все управляется мышкой, также можно посылать в аппарат определенные нажатия через меню Execute Keycode, просматривать содержимое папок (Explore):


И многое другое. Часть функционала правда может не работать, но для выполнения базовых задач того что есть вполне хватит.

p.s. Есть правда и некоторые "нюансы". Например, для того чтобы устройством можно было управлять через ADB - на нем должна быть включена отладка по USB, а на ПК, к которому вы его подключаете - должен быть принят запрос RSA авторизации. Если на устройстве уже разбит экран и вы не можете осуществить по нему ни одного нажатия, а отладка по USB при этом выключена или RSA-авторизация не принята, то, естественно, что т.к. у вас нет доступа к устройству через ADB - все описанное работать не будет. Однако, если доступ через ADB есть - то материал приведенный в посте окажет значительную помощь. На самом деле отладку через USB можно попытаться включить и другими способами, например, прямым редактированием соответствующих настроек в ФС Android, а RSA авторизацию для ADB и вовсе отключить, например, пересобрав boot.img ... но это уже гораздо более обширная тема. Кому интересно вот небольшая подборка полезных ссылок:


p.p.s. Ну и напоследок одна мысль, скорее в качестве идеи. Предположим, что мы попали в ситуацию, когда отладка по USB на устройстве у нас выключена, но установлен какой-нибудь кастомный recovery. Можно подготовить соответствующий update.zip, содержащий утилиту sqlite для arm и shell скрипт автоматизирующий все действия по включению отладки по USB. В этом случае для включения отладки по USB нам придется лишь прошить подготовленный нами zip через custom recovery. Но это уже в качестве предмета для самостоятельного изучения.

2 комментария :

  1. как подтвердить RSA? Если убил рекавери и прошивку. Тело видится в adb как неавторизованное. Серый экран ничего не подтвердишь. Как быть?

    ОтветитьУдалить
    Ответы
    1. Мне кажется тут проще восстановить recovery или, если есть, возможность прошить кастомный recovery, откуда уже можно будет восстановить прошивку. Что за тело, MTK / Qualcomm? Модель?

      Удалить