Pull to refresh

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

Reading time 3 min
Views 26K
Доброго времени суток, уважаемые Хабравчане! Так сложилось, что мне часто приходиться устанавливать .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 — для отображения прогрессбара. затем по окончании установки читаем информацию из лога и выводим сообщение о результате установки. Выглядит это так:




После создания скрипта делаем его исполняемым, и запускаем его.
Надеюсь, что статья будет полезна. Спасибо за внимание.
Tags:
Hubs:
+13
Comments 12
Comments Comments 12

Articles