Как облегчить установку .apk на Android или GUI для adb install

Доброго времени суток, уважаемые Хабравчане! Так сложилось, что мне часто приходиться устанавливать .apk-файлы на Android-устройства — работаю тестировщиком. И вот в очередной раз, открывая терминал и набирая команду для установки очередного приложения, я задумался о том, как можно избавиться от рутинной работы. Статья предназначена для новичков, по-этому будет много пояснений.
Для начала давайте вспомним синтаксис команды: adb install <путь к файлу>. Если подключено 2 и более устройств, то получим:
error: more than one device and emulator
- waiting for device -
Так как adb не знает, куда ставить приложение. Чтобы явно указать устройство, используется синтаксис adb -s <ID_device> installl <путь к файлу>. Чтобы получить ID_device, необходимо дать команду adb devices, которая выведет список подключенных устройств:
List of devices attached
LGOTMS409c0d device
HT0BTHG02888 device
С помощью скрипта, приведенного ниже, можно сделать процесс установки более дружелюбным к пользователю.
Листинг скрипта:
#!/bin/bash

DEV_LIST=$(adb devices | awk '/device$/{if (NR!=1) {print $1}}')
#Указываем путь к директории, где лежат .apk файлы
DIR_PATH="/home/dn010891laa/Загрузки/"
while [ -z "$DEV_LIST" ]; do
zenity --question --title="Не подключено ни одно Android-устройство" --text="Проверить заново?" --height=100 --width=400
 if [ $? -eq "0" ]; then 
	DEV_LIST=$(adb devices | awk '/device$/{if (NR!=1) {print $1}}')
 else
	notify-send "ADB" "Операция отменена"
	exit
 fi
done
path=$(find "$DIR_PATH" -name "*.apk*" | zenity --list --title "Найденные файлы в директории "$DIR_PATH"" --column "Список всех .apk" --height=370 --width=600)
 if [ $? -eq "1" ];
	then exit
 fi
if [ $(echo "$DEV_LIST" | wc -l) -ne "1" ]
then
    DEV_NAME=$(zenity --list --title "На какое устройство будет произведена установка?" --column "Доступные устройства" $(echo "$DEV_LIST" | xargs))
 if [ $? -eq "1" ];then 
	notify-send "ADB" "Операция отменена"
	exit
 fi
else
    DEV_NAME="$DEV_LIST"
fi
adb -s "$DEV_NAME" install "$path" | tee /tmp/installlog.txt | zenity --progress --text "Установка "$path" на устройство "$DEV_NAME"" --pulsate --auto-close --no-cancel
log=$(cat /tmp/installlog.txt)
zenity --info --title="Результат установки" --text="$log"
rm /tmp/installlog.txt
killall adb
exit

Теперь по-порядку:
1.
Для взаимодействия с пользователем используется Zenity — графический интерфейс для командной строки. Ознакомиться с параметрами командной строки можно в просторах Интернет, например, тут, или выполнив в терминале zenity --help
DIR_PATH — это путь, где по-умолчанию сложены все apk, лично мне удобен такой вариант. Если путь к файлу не постоянный — нужно стереть строку с DIR_PATH, а для переменной path указать zenity --file-selection --title="Выберите apk для установки" --file-filter=*.apk — тогда будет открываться окно «Выбрать файл» с выбором любого пути и фильтром по расширению файлов *.apk.
2.
 DEV_LIST=$(adb devices | awk '/device$/{if (NR!=1) {print $1}}')
— Получаем вывод команды adb devices, удаляем лишний текст из строк, в данном случае текст «device», и выводим все строки, кроме первой, так как там содержится ненужный текст «List of devices attached» — это все присваиваем переменной DEV_LIST.
3.
 while [ -z "$DEV_LIST" ]</code>: <code>-z
— возвращает true, если длинна строки равна 0, думаю, что в теле цикла все и так понятно.
4.
 path=$(find "$DIR_PATH" -name "*.apk*" | zenity --list --title "Найденные файлы в директории "$DIR_PATH"" --column "Список всех .apk" --height=370 --width=600)
— ищем все файлы с расширением *.apk по заданному пути, и выводим результат в список через zenity — выбранный путь присваиваем переменной path
5.
 if [ $(echo "$DEV_LIST" | wc -l) -ne "1" ]
— читаем список устройств, получаем количество строк, если строк больше, чем 1, тогда строим список:
 DEV_NAME=$(zenity --list --title "На какое устройство будет произведена установка?" --column "Доступные устройства" $(echo "$DEV_LIST" | xargs))
, выбранное значение присвоится DEV_NAME.
6.
 adb -s "$DEV_NAME" install "$path" | tee /tmp/installlog.txt | zenity --progress --text "Установка "$path" на устройство "$DEV_NAME"" --pulsate --auto-close --no-cancel
— даем команду на установку, параллельно пишем ход установки в log файл, и передаем параметры в zenity --progress — для отображения прогрессбара. затем по окончании установки читаем информацию из лога и выводим сообщение о результате установки. Выглядит это так:




После создания скрипта делаем его исполняемым, и запускаем его.
Надеюсь, что статья будет полезна. Спасибо за внимание.
Поделиться публикацией

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 12

    +1
    Доброго времени суток,
    у меня все не доходили руки(кармы не достаточно) написать статью на хабре о разработке, которую ведем я и мой товарищ. Она имеет название APM(android-packages-manager). Вот тут мы выложили исходники android-packages-manager, вот тут(mac/win/nix) можно скачать сразу архив, распаковать и пользоваться. По задумке даже не нужно устанавливать Android SDK. Хотя в настройках можно указать путь к более новым adb и aapt.

    После написание этого приложения мы не представляем себе жизнь без него. Надеюсь оно поможет вам и многом другим.
      0
      APM лучшее приложение для управления пакетами! Пользуюсь им с ранней беты :) Рад, что вы опубликовали проект! Молодцы.
        0
        Мы давно опубликовали проект, вот только не пиарили его.
        Если будут пожелания пиши мне в личку или в виде issues на github, посмотрим что можно сделать ;)
          0
          А еще лучше pull-request ;)
            0
            Ну это идеальный вариант для нашего не идеального кода :)
        0
        Судя по всему, что-то очень хорошее у вас получилось. Подскажите где можно посмотреть какую-нибудь документацию или хотябы как этим пользоваться
          0
          Увы документации пока нет, и не предвидится. Отсутствие документации связано с тем что на нее нет времени, так как приложение разрабатывалось для личного пользования, то и документации с самого начала не предвиделось.

          Для запуска приложения необходима Java 6+, а запуск можно произвести из командной строки(как пример: «java -jar apm-0.7.1.jar»). Плюс если у Вас стоит nix*, то вам нужно выставить права на запуск для файлов adb и aapt

          Сам графический интерфейс приложения надеюсь будет понятен

          ЗЫ
          Еще раз приношу извинения за отсутствие документации. И мы уже начинаем задумываться о ее написании. Так же мы подумываем написать статью о приложении на habrahabr, но пока мы хотим привести приложение в более человечный вид и исправить уже известные проблемы.
            0
            Было бы неплохо, если бы в Linux окно запускалось в «родном» окне GTK, а не в кастомных нарисованных темах. Лично меня это разрбажает)
              0
              сейчас идёт разработка в направлении поддержки системных тем, но они пока выглядят очень кривой.
                0
                Разработка еще ведется? Или уже все, что есть — то есть :)
                  0
                  Времени нет развивать проект, так что можно сказать то что есть. Если есть охота, то из develop ветки можно собрать билд с поддержкой тем.
                    0
                    Спасибо за ответ :)

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое