- ADB (Android Debug Bridge)
- Shell
- Список доступных команд (часть)
- Logcat
- Backup Manager
- Monkey Stress Tester — Обезьяна с гранатой
- Запись видео с экрана
- Соединение через Wi-Fi
- Shell-скриптинг в среде Android
- Особенности Android-окружения
- Первый пример
- Автозапуск
- Запуск скриптов до и после установки прошивки
- Что еще?
- Вместо выводов
ADB (Android Debug Bridge)
Клиент-серверное приложение, которое предоставляет доступ к работающему эмулятору или устройству. С его помощью можно копировать файлы, устанавливать скомпилированные программные пакеты и запускать консольные команды. Используя консоль, вы можете изменять настройки журнала и взаимодействовать с базами данных SQLite, которые хранятся на устройстве. В старых версиях SDK программа находилась в папке tools, теперь находится в папке platform-tools.
Состоит из трёх компонентов: фоновой службы (демона), работающей в эмуляторе, сервиса, запущенного на компьютере разработчика, и клиентской программы (наподобие DDMS), которая связывается со службой через Сервис.
Что бы увидеть весь список параметров и команд, которые можно запустить при помощи adb, введите в командной строке следующее (или в окне студии Terminal):
Если у вас есть файл приложения APK и вы хотите его установить на эмуляторе, то используйте команду:
d:\program.apk — это путь к файлу, который хотите установить в эмулятор. После этого установленное приложение появится в эмуляторе. Если приложение слишком большое (несколько мегабайт), то придётся немного подождать, пока установится. Во время установки в консоли курсор будет мигать, а потом появится надпись Success, что означает успешную установку программы.
Также можно удалить ненужную программу по имени его пакета:
Чтобы получить список запущенных эмуляторов и их серийные номера, используйте команду:
Вы увидите приблизительно такую картину:
Зная имя устройства, вы можете запустить на нужном устройстве требуемую команду:
Перезагрузить устройство. Если устройств несколько, то нужно указать нужное устройство.
Чтобы перезапустить сервер:
Сделать бэкап и восстановить из бэкапа можно так:
Для копирования файлов с устройства на компьютер и обратно используются команды pull и push.
Shell
Чтобы запустить оболочку (shell) на подключённом устройстве, выполните следующую команду:
С ним часто используют команды am и pm. Это не время, а сокращение от Application manager и Package Manager. Например, можно запустить сервис через намерение:
Для просмотра всех установленных приложений (пакетов):
Предоставить разрешение приложению/запретить.
Узнать информацию о конкретном приложении.
Получить список доступных системных свойств.
Если вы знаете свойство, то можно запросить его значение напрямую.
Получить список всех будильников.
Информация о всех видимых активностях.
Символ # обозначает приглашение оболочки (shell prompt).
Вы можете просмотреть список команд, доступных при работе в оболочке, введя следующую информацию по приглашению оболочки:
Список доступных команд (часть)
Чтобы просмотреть список каталогов и файлов, находящихся на корневом уровне (root-level), введите в командной строке оболочки следующую команду:
Для просмотра списка баз данных используйте команду:
В этом каталоге содержится список пакетов, установленных на устройстве. Для примера исследуем пакет com.android.providers.contacts:
Эта команда отобразит файл contacts.db и др., представляющие собой базу данных SQLite.
Logcat
Backup Manager
Monkey Stress Tester — Обезьяна с гранатой
Monkey ([android-sdk-path]**/platform-tools) — утилита для генерации случайных жестов на эмуляторе или устройстве, что напоминает движения глупой мартышки.
Для просмотра всех файлов базы данных *.db используйте команду:
Вы увидите, что в Android имеются следующие базы данных (зависимости от версии Android набор может варьироваться):
alarms.db
contacts.db
downloads.db
internal.db
settings.db
mmssms.db
telephony.db
Можно активировать команду sqlitе3 для одной из перечисленных баз данных, введя следующую информацию:
Для завершения работы с sqlite3 напишите:
Обратите внимание: приглашение для adb — это #, а приглашение для sqlitе3 — это sqlite>.
Запись видео с экрана
Вы можете записать видео с экрана вашего устройства (на эмуляторе не работает):
Затем можно сбросить на компьютер.
где /sdcard/my_app.mp4 – путь к файлу с видео (sdcard) и его имя (my_app.mp4).
Максимальное время записи равно трём минутам. Можно прервать запись (Ctrl+C).
Также вы можете управлять качеством записи, разрешением и другими параметрами с помощью следующих команд:
—size Задает разрешение, например: 1280×720. По умолчанию этот параметр установлен в соответствии с разрешением главного экрана устройства (если поддерживается), или 1280×720 – если нет.
—bit-rate Задает скорость потока видео (мегабиты в секунду). По умолчанию – 4 Мб/сек. Например, для записи со скоростью 6 Мб/сек, вам нужно будет ввести следующую команду:
—time-limit Задает максимальную длительность видео в секундах. По умолчанию установлено максимальное значение – 180 сек (3 минуты).
—rotate Поворот видео на 90 градусов. Экспериментальная опция.
—verbose Отображать информацию о процессе записи в окне командной строки.
В Android Studio вы можете начать запись через кнопку записи в панели Android DDMS (Alt-6).
Если вы хотите, чтобы на видео отображались «отпечатки» касаний к экрану, включите в настройках устройства в разделе для разработчиков опцию «Показывать нажатия» или «отображать касания».
Соединение через Wi-Fi
Обычно для тестирования программы на реальном устройстве использует USB-соединение. Предположим, кот уволок куда-то USB-кабель или расшатал USB-порт (ага, валите всё котов). В этом случае можно попробовать использовать Wi-Fi. Описанный ниже способ не гарантирует работоспособность на всех устройствах. Пробуйте.
Сначала соединитесь обычным способом через USB (не знаю, как вы собираетесь это сделать, если у вас утащили кабель и сломали порт). Включите Wi-Fi на компьютере и на устройстве.
Убедитесь, что устройство присоединено.
Ответ (у вас будет свой набор символов):
Меняем режим работы с USB на TCP/IP:
Теперь вам надо узнать IP-адрес вашего устройства. Пример для Nexus 7: Запускаем Настройки | О планшете | Общая информация | IP-адрес. Перепишите адрес на бумажку. Запускаем команду с этим адресом (у вас будет свой адрес).
Теперь можете отсоединить кабель. Отдайте его коту, пусть играет.
Проверяем, что устройство по прежнему на связи.
Отлично! Запускайте приложение и оно по воздуху установится на устройстве.
Учтите, что передача данных будет идти медленнее и для больших приложений будет не слишком удобно использовать данный способ. Хотя я особых тормозов не заметил для учебных примеров.
Если вам надо вернуться к старому способу, то вызываем команду:
Указанный способ очень удобен. Недаром на баше есть такие строчки:
Слава Wi-Fi! Котэ не может его перегрызть.
А вот другому повезло меньше и на баше описана его ситуация:
Звонок в техподдержку одного интернет-провайдера.
ТП(техподдержка): Добрый день! Я вас слушаю.
А (абонент): У меня тут проблема возникла.
ТП: Какая у вас проблема?
А: Я гонял кота шашкой и перерубил кабель.
Если бы абонент позаботился о настройке через Wi-Fi, то и проблемы бы не было.
Источник
Shell-скриптинг в среде Android
Android основан на ядре Linux, включает в себя набор стандартных UNIX-команд и простой шелл sh. Все это значит, что мы можем не только использовать командную строку для выполнения низкоуровневых операций, но и писать шелл-скрипты, которые будут выполнять функции, недоступные из графического интерфейса. В этой статье мы поговорим о том, что с их помощью можно сделать и зачем все это нужно.
Сразу оговорюсь, что в этой статье речь пойдет о шелл-скриптах в традиционном для Linux понимании, без использования инструментов вроде SL4A, QPython или Roboto. Главное назначение таких скриптов — изменение поведения системы, параметров ядра, работа с демонами (ADB, например) и тому подобное. Скрипты могут стартовать на этапе загрузки ОС, установки новой прошивки, после тапа по кнопке или же по традиции — из терминала.
В статье я расскажу, как писать такие скрипты, как заставить их стартовать автоматически, привязывать к определенному системному событию. В качестве бонуса также объясню, как заставить консоль восстановления (recovery) выполнить необходимые тебе действия перед установкой или сразу после установки новой прошивки. Начинаем.
Особенности Android-окружения
В самой своей основе, там, где нет Java и Dalvik, Android представляет собой минималистичный Linux-дистрибутив со всеми свойственными ему атрибутами: ядром, системой инициализации, набором библиотек, демонов, консольных команд и, конечно же, шеллом. Последний — это не что иное, как mksh из MirBSD, переименованный в sh; простой командный интерпретатор с поддержкой языковых конструкций классического Bourne shell из UNIX и автодополнением по нажатию Tab.
В качестве комплекта базовых UNIX-команд здесь используется toolbox, своего рода урезанная альтернатива BusyBox, которая позволяет вызывать несколько разных команд из одного бинарника (с помощью симлинков). Toolbox включает в себя очень ограниченный набор команд, в котором нет не только grep или sort, но даже cp. Поэтому для полноценной работы со скриптами настоятельно рекомендуется установка BusyBox, благо в маркете полно бесплатных инсталляторов.
Сам шелл располагается не совсем по адресу, поэтому «шибанг» в скриптах будет выглядеть несколько по-иному, а именно #!/system/bin/sh. Зато о расположении бинарников можно не думать вообще, так как в переменной $PATH всегда прописаны правильные значения. Каталогов для поиска команд тут всегда три: /system/bin/, /system/sbin/ и /system/xbin/ для внешних бинарников. Туда обычно устанавливается BusyBox.
Основное назначение скриптинга в Android — работа с ядром и системными утилитами. Ядро тут стандартное и экспортирует все те же интерфейсы /proc и /sys, через которые можно рулить железом и состоянием системы. Плюс есть набор специфичных для Android утилит, которые будут очень полезны при разработке скриптов:
- pm — менеджер пакетов, позволяет устанавливать, удалять и перемещать софт;
- am — менеджер активностей (Activity), может быть использован для запуска приложений;
- dumpsys — дамп в консоль массы различной информации о состоянии системы;
- screencap — утилита для снятия скриншота;
- screenrecord — утилита для записи скринкастов;
- getprop/setprop — команды для чтения и изменения системных переменных;
- start/stop — запуск и остановка системных служб;
- input — позволяет отправлять в текущее окно кей-коды (эмуляция клавиатуры);
- service — утилита для управления Java-сервисами, имеет очень много возможностей;
- svc — позволяет управлять Wi-Fi, USB-подключением и питанием.
Часть вывода команды dumpsys
Первый пример
Теперь давайте попробуем написать первый скрипт. Делать это лучше на компе, а еще лучше в Linux или редакторе, который умеет создавать текстовые файлы без символа возврата каретки (который при открытии в Android будет выглядеть как ^M в конце каждой строки). Наш первый скрипт будет состоять всего из двух строк, которые делают бэкап всех установленных приложений на карту памяти. Его код (требует BusyBox):
Сохраняем (пусть он называется apk_backup.sh) и перекидываем на смартфон с помощью ADB:
Теперь его нужно запустить. Проще всего сделать это с помощью все того же ADB:
Примерно таким же образом скрипт можно запустить из консоли на самом смартфоне/планшете:
Само собой, такой способ не очень удобен. Поэтому нам нужен какой-то быстрый способ запуска скрипта. Наиболее удобное из найденных мной решений — это приложение QuickTerminal. Устанавливаем, запускаем, переходим на вкладку Quick Command, нажимаем кнопку «+», вбиваем имя (произвольное) и команду (sh /sdcard/apk_backup.sh), в поле Output Type выбираем либо Dialog Output, либо Nothing. В первом случае во время выполнения скрипта на экране появится окно с результатом, во втором все пройдет в фоне. Кому что удобнее. Далее сохраняем и получаем кнопку, с помощью которой скрипт можно будет запустить быстро и легко.
Теперь напишем скрипт, который восстановит наш бэкап:
В нем мы задействовали команду pm с опцией install и флагами -t и -r, которые заставляют систему устанавливать приложения, даже если они подписаны тестовым ключом или уже установлены. Также можно использовать флаг -s, который принуждает приложения к установке на карту памяти (если такая возможность есть), или -f — установка во внутреннюю память устройства.
Почти все команды Android имеют подробную справку
Имея рут, можно даже сделать бэкап настроек всех приложений с помощью копирования и архивации каталога /data/data/, однако восстановить его будет очень проблематично, так как в Android каждое приложение исполняется от имени созданного специально для него Linux-юзера и хранит настройки внутри каталога, принадлежащего этому пользователю. Проблема здесь в том, что идентификатор Linux-юзера для каждого приложения генерируется динамически, поэтому после восстановления бэкапа в заново установленной системе идентификаторы не будут совпадать и приложения не смогут прочитать свои настройки. Придется вручную выяснять ID юзера для каждого приложения и менять права доступа на каталоги с данными.
С другой стороны, мы можем использовать встроенный в Android Backup Manager, позволяющий сторонним приложениям использовать возможности системы для бэкапа и восстановления приложений и их данных. Управлять им можно из консоли (а значит, и с помощью скриптов), но сам по себе он никакого бэкапа не производит, а возлагает эту работу на сторонние приложения. Helium — одно из таких приложений. Если установить и настроить его, операцию бэкапа и восстановления можно будет заскриптовать. Например, следующий простой скрипт сделает резервную копию всех сторонних приложений:
Конструкция $
Автозапуск
«Это все круто, но скрипты должны запускаться сами», — скажешь ты и будешь абсолютно прав. Без автозапуска от скриптов толку мало, но это легко исправить, если воспользоваться все тем же Tasker. Он умеет запускать любые шелл-команды в ответ на любое событие. Чтобы воспользоваться этой функциональностью, достаточно создать новый профиль, выбрать событие (для бэкапа лучшим событием будет время), затем добавляем действие, выбираем Script -> Run Shell, вбиваем команду (sh /sdcard/script.sh), выбираем, если необходимо, файл для записи результата и включаем профиль.
Другой популярный способ автозапуска — это использование средств автоматического исполнения скриптов при загрузке в сторонних прошивках. Сегодня почти все сколько-нибудь известные кастомные прошивки умеют стартовать скрипты из каталога /system/etc/init.d/, а в стоке такую функциональность можно получить с помощью приложения Universal init.d из маркета. С последним, однако, надо быть осторожным, так как оно запускает скрипты не на раннем этапе загрузки, как это происходит в том же CyanogenMod, а уже после полной загрузки системы.
Итак, что мы можем поместить в автозагрузку? Например, скрипт запуска демона ADB в сетевом режиме:
Для подключения к нему с ПК набираем такую команду:
Также мы можем применить некоторые оптимизации подсистемы виртуальной памяти:
Ну или подогнать механизм lowmemorykiller (автоматическое убийство фоновых приложений при нехватке памяти) под наши нужды:
Ну и конечно же, автоматический выбор планировщика процессов:
Все это можно сделать с помощью специализированного софта, но зачем загружать систему дополнительным ПО, которое еще и будет висеть в фоне, когда можно обойтись несколькими простыми скриптами?
Как запустить скрипт с помощью Tasker
Запуск скриптов до и после установки прошивки
Почти каждый, кто устанавливает на свой гаджет стороннюю прошивку, также ставит поверх нее пакет с фирменными приложениями Google (gapps), который включает в себя маркет, YouTube, Gmail и другой софт. Каждый раз, когда происходит обновление прошивки, раздел /system, содержащий ее и gapps, полностью стирается, но приложения Google всегда остаются на месте. Это происходит потому, что, кроме всего прочего, gapps содержит в своем составе специальный скрипт, который размещается в каталоге /system/addon.d/ и запускается консолью восстановления до и после установки прошивки. Этот скрипт делает бэкап и восстановление приложений Google.
Мы можем использовать эту возможность для выполнения наших собственных действий до и после установки прошивки. Вот так, например, выглядит мой скрипт восстановления, который ничего не бэкапит, но подчищает прошивку от мусора сразу после ее установки:
Скрипт удаляет рингтоны, уведомления, движок синтеза речи и несколько приложений. Все эти действия запускаются в ответ на передачу скрипту опции командной строки restore (это делает консоль восстановления после установки прошивки), однако также предусмотрены и варианты обработки таких опций, как backup, pre-backup, post-backup, pre-restore и post-restore. Здесь это просто заглушки, но если бы мы захотели сделать бэкап некоторых файлов и приложений перед установкой прошивки, мы могли бы добавить их в блок backup, как это сделано в скрипте /system/addon.d/70-gapps.sh:
Этот кусок скрипта прекрасно иллюстрирует, как сделать бэкап файлов. Ключевые элементы здесь: функция listfiles, которая при запуске выводит листинг файлов, и функция backupfile, которая является частью консоли восстановления (определена в файле /tmp/backuptool.functions). Она делает бэкап файлов в цикле.
Содержимое /system/addon.d/ в CyanogenMod 11 на Motorola Defy
Скрипт бэкапа приложений Google
По словам разработчика mksh, изначально пользовательские версии Android-смартфонов вообще не должны были иметь в своем составе шелл, но после выпуска смартфона для разработчиков HTC (T-Mobile) G1 он фактически стал стандартной частью системы.
Версии Android 2.3 и ниже вместо mksh использовали минималистичный шелл ash, который входит в базовый комплект всех BSD-систем.
Чтобы получить одни и те же скрипты на всех устройствах, можно использовать приложение DropSync или FolderSync (автоматическая синхронизация через Dropbox).
Что еще?
С помощью скриптов в Android можно сделать намного больше, чем бэкапы и настройка параметров системы. Вот, например, скрипт, который просыпается каждые десять минут и, если уровень заряда батареи стал меньше 30%, отключает Wi-Fi и Bluetooth:
Чтобы скрипт работал в фоне, достаточно вызвать его следующим образом:
А это скрипт, который позволяет быстро заполнять формы, требующие ввода имэйла и пароля (в приложениях и на веб-сайтах):
Запускать его можно разными способами. Либо перед запуском приложения, установив задержку:
Либо повесить на какое-то событие Tasker, например на взмах смартфоном. Другой вариант — использовать буфер обмена. В Android, чтобы вставить нужный текст в буфер обмена, достаточно выполнить такую команду:
Не ахти как удобно, зато работает. Как мы можем использовать такую функциональность? Например, сделать простенький скрипт clip.sh:
Соль в том, что скрипт можно вызывать через удаленный ADB либо вообще поместить в /system/etc/init.d/, заменив $1 на нужный текст. Так нужные нам данные всегда будут под рукой, а бесполезный на смартфоне механизм копирования/вставки получит хоть какое-то назначение. Консольные команды можно использовать и для более высокоуровневых операций, например позвонить по указанному номеру:
Или просто открыть окно номеронабирателя с нужным номером:
Примерно таким же образом можно отправить SMS:
Скрипт принимает два аргумента: номер телефона и содержимое SMS. После запуска он откроет окно SMS-приложения, вставит в него нужный текст, а затем нажмет кнопку Enter для отправки, после чего окно закроется.
Другие полезные при скриптинге команды:
- Перезагрузка в режим recovery:
- Мягкая перезагрузка (без перезапуска ядра):
- Открыть нужное приложение (в данном примере — «Настройки»):
- Сообщить приложениям о низком уровне заряда батареи (есть софт, который при этом снижает свою активность):
- Проиграть файл (может не сработать):
- Отключить указанное приложение (можно организовать цикл для отключения bloatware по списку):
- Получить список приложений, которые имеют уведомления в строке состояния:
- Оптимизировать внутренние базы данных с настройками (можно добавить скрипт в автозагрузку, требуется BusyBox):
- Переключить Wi-Fi-тизеринг на основной интерфейс (нужно для обмана операторов, которые ограничивают скорость соединения при раздаче интернета по Wi-Fi):
Для «отлова» нажатий кнопок можно использовать команду getevent
Вместо выводов
Для кого-то все описанное в статье может показаться несколько надуманным. Дескать, все это можно сделать с помощью стандартного софта и Tasker. Но зачем использовать тяжелый Java-софт там, где нужное действие можно выполнить с помощью простенького скрипта, который не занимает лишней памяти и может быть легко перенесен на другое устройство? Скрипты удобны, просты, быстро отрабатывают и дают возможность тонкой настройки под себя.
Источник