Программирование, радиоэлектроника,
саморазвитие и частичка из моей жизни здесь...

Массовая установка APK файлов в Android смартфон, Linux ADB и Python

Приводится простой скрипт на Python, который позволяет выполнить автоматическую установку большого количества необходимых пакетов в Android-смартфон. Пакеты могут быть разбросаны или же рассортированы по разным папкам, для установки нужно всего лишь указать в скрипте имена файлов (*.apk) и директории в которых производить поиск.

Содержание:

  1. Репозиторий F-Droid
  2. Что такое Android Debug Bridge, установка
  3. Примеры работы с Android Debug Bridge
  4. Скрипт автоматической установки APK пакетов
  5. Заключение

В статье расскажу вам о каталоге приложений F-Droid, ADB и других полезностях, а также приведу полный код скрипта на Питоне, который можно запускать на Linux (можно попробовать адаптировать и под Windows).

Многие, кто пользуется смартфоном на Android, знают насколько затратной по времени бывает установка необходимого набора программ после выполненного сброса устройства к заводским настройкам.

Для облегчения подобной задачи был написан простой в настройке и использовании скрипт на Python, который использует ADB и позволяет в автоматическом режиме выполнить установку определенного списка программ, которые сохранены на диске в виде APK-файлов (Android PacKage).

Репозиторий F-Droid

Как правило Google PlayMarket и подобные платформы распространения пакетов не позволяют сохранять установщики программ на диск, тем самым жестко привязывая пользователей к своим сервисам, навязывая себя и заставляя регистрироваться и предоставлять информацию о себе и своем устройстве.

Существует проект под названием F-Droid (Free Android Software) - это репозиторий со свободным программным обеспечением под Android, программы с открытыми исходными кодами (Open Source Software).

F-Droid логотип

Рис. 1. Логотип проекта F-Droid (копилефт инсайд).

На момент написания статьи в репозитории насчитывается более 1800 пакетов, рассортированных по категориям и с удобным поиском.

Для использования F-Droid не обязательно регистрироваться, программы можно загружать и устанавливать:

  • при помощи установленного приложения-каталога F-Droid (на подобии пакета PlayMarket);
  • прямо с сайта;
  • из ранее скачанных с сайта APK-пакетов.

Конечно же можно использовать и другие сайты для получения APK-файлов, но прежде чем доверить доступ таким источникам к своему смартфону следует хорошенько задуматься, здесь уже действуйте на свой страх и риск.

Что такое Android Debug Bridge, установка

Android Debug Bridge (ADB) - шина отладки для Android, гибкая консольная утилита, которая позволяет взаимодействовать с эмулятором или подключенным физическим Android устройством.

Android Debug Bridge (ADB) в Linux

Рис. 2. Android Debug Bridge (ADB).

При помощи данной утилиты можно выполнять самые разные задачи:

  • Установка и удаление пакетов программ;
  • Копирование файлов с устройства и на устройство;
  • Проброс сетевых портов (TCP);
  • Получение доступа к консоли устройства (VirtualTerminal);
  • Выполнение shell-команд на устройстве для самых разных задач;
  • Прошивка устройства;
  • Очищение раздела /data;
  • Просмотр логов и другой полезной информации;
  • Перезагрузка устройства;
  • и другие.

Полную документацию по утилите можно почитать на страничке для разработчиков Android.

Итак, в руках у нас есть очень мощный инструмент, при помощи которого можно выполнить автоматизацию и настройку Android-устройства, производить правки файловой системы и переконфигурацию сервисов.

Для установки утилиты "adb" под GNU Debian Linux, Ubuntu, Mint нужно выполнить команду:

sudo apt-get install android-tools-adb

Прежде чем использовать утилиту необходимо включить на устройстве режим USB-отладки (USB debugging) в меню настроек (system settings) - установки для разработчиков (Developer options).

Если вы используете на своем устройстве прошивку "Cyanogen Mod" или другую с версией Android 4.2 и выше то пункт меню "Developer options" по умолчанию скрыт. Для его разблокировки необходимо выполнить следующее: идем в настройки (Settings) - О телефоне (About phone) - делаем 7 нажатий на строке которая содержит "Build number".

Теперь можно подключить ваше Android-устройство к компьютеру и начать пользоваться ADB, к примеру давайте посмотрим увидит ли ADB наш телефон (выводим список подключенных устройств):

adb devices

на экран будет выведен список серийных номеров для подключенных устройств, к примеру (смартфон Samsung):

List of devices attached 
M110d45615dd    device

Если же ваше устройство не определяется, то возможно что необходимо добавить правила для доступа к USB в Linux. В данном случае определим производителя нашего устройства (VendorID), выполним команду:

lsusb

В полученном списке устройств находим наше Android-устройство:

Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 044: ID 18d1:4e26 Google Inc.

В примере подключено Android-устройство от Google (Гуглофон Nexus), VendorID=18d1, ProductID=4e26.

Отключаем наше устройство от компьютера и создадим файл с правилом для USB-подсистемы:

sudo nano /etc/udev/rules.d/51-android.rules

Поместим в этот файл вот такие строчки:

# My Android device
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e26", MODE="0664", OWNER="username"

Здесь: 18d1 и 4e26 - коды производителя и устройства, которые мы получили раньше, username - имя пользователя под которым вы работаете в Linux (измените на свое). Режим файла-устройства "0664" дает пользователю(владельцу) username доступ на чтение и запись, группе доступ на чтение и запись, а остальным - только чтение.

Выходим из редактора и сохраняем файл. Теперь чтобы задействовать новый файл с правилом для подсистемы USB сделаем его доступным на чтение для всех пользователей и выполним перезагрузку правил UDEV (менеджер устройств ядра Линукс):

sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload

Теперь подключаем Android-устройств по USB и пробуем снова команду "adb devices", устройство должно определиться.

Примеры работы с Android Debug Bridge

Теперь, когда наше подключенное по USB Android-устройство определяется при помощи утилиты ADB можно выполнять различные команды.

Работа с пакетами

adb install /home/user/my_game.apk

Приведенная выше команда выполнит выгрузку и установку на подключенное устройство пакета из папки /home/user/ под названием my_game.apk.

adb install -r /home/user/my_game.apk

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

А теперь получим список имен установленных пакетов:

adb shell pm list packages

Зная имя пакета можно выполнить его удаление:

adb uninstall org.coolreader

Данная команда удалит пакет Cool Reader (удобная читалка для книг).

Передача файлов

Загрузка файла cool_concert.mkv с компьютера на устройство:

adb push /home/user/cool_concert.mkv /sdcard/Videos/cool_concert.mkv

Загрузка файла foto1.jpg с устройства (из папки /sdcard/temp/) на компьютер:

adb pull /sdcard/temp/foto1.jpg /home/user/Pictures/foto1.jpg

Отладочная информация

adb bugreport > bug_report.txt

В файл bug_report.txt будет собрано огромное количество статистической и отладочной информации (несколько МБ) о системе, железе, процессах, ядре, пакетах, различные логи и еще много всего. Информация будет полезна разработчику и тем кто интересуется внутренним миром своего смартфона.

Консоль

Теперь давайте поработаем с консолью. Важно заметить что для работы в ОС Android большинства Unix-подобных консольных команд должен быть установлен пакет инструментов BusyBox, который является швейцарским армейским ножем для встроенных систем, содержит в едином бинарном файле большое количество UNIX-утилит по типу "bunzip", "top", "cat", "mkdir" и т.п.

adb shell

Данная команда откроет нам интерактивный удаленный терминал (Shell) на подключенном Android-устройстве. Здесь можно выполнять разные команды из мира Linux, запускать программы, работать с файлами и директориями и т.п. Например для просмотра заполненности файловых систем можно набрать в удаленном терминале "df".

Команда htop запущенная через ADB на Android устройстве при помощи удаленного терминала

Рис. 3. Команда htop запущенная через ADB на Android устройстве при помощи удаленного терминала.

Если же нам нужно просто выполнить команду на устройстве без интерактивного режима то воспользуемся похожей командой:

adb shell df

На устройстве будет выполнена команда "df" и ее вывод отобразится у нас в консоли.

Резервное копирование программ и настроек

Для создания резервной копии следует выполнить команду:

adb backup -f android_backup.bak -all

Полная резервная копия программ и настроек будет сохранена на компьютере в файл android_backup.bak. Для последующего восстановления из резервной копии необходимо выполнить команду:

adb restore android_backup.bak

Это очень полезная команда, которая позволит вам не тратить время на настройки и установку программ после сброса телефона к заводским настройкам.

Управление устройством

Перезагрузка устройства:

adb reboot

Перезагрузка устройства в режим восстановления (Recovery):

adb reboot recovery

Перезагрузка устройства в в меню загрузчика (Bootloader):

adb reboot bootloader

Это далеко не все полезные команды из арсенала ADB, не стоит забывать что при помощи данной утилиты нам в руки попадает такой мощный инструмент на подключенном устройстве как консоль (Shell). В консоли вообще можно творить как чудеса...так и по неаккуратности убить операционную систему, так что будьте внимательны и осведомлены в том какие команды выполняете!

Скрипт автоматической установки APK пакетов

Данный скрипт будет полезен как для установки программ на одиночный телефон или Android-устройство, так и для установки набора программ на несколько телефонов.

Алгоритм работы скрипта:

  1. Проверяем установлен ли ADB, выводим версию установленной утилиты;
  2. Определяем подключено ли Android-устройство, выводим его серийный номер;
  3. Рекурсивно собираем из указанных директорий с пакетами пути и имена всех файлов *.apk;
  4. Выводим количество пакетов для установки, запрашиваем подтверждение на установку;
  5. Установка всех указанных пакетов, выполняя их поиск в дереве каталогов по имени файла;
  6. Выводим статистику и напоминание о необходимости отключения USB ADB в Android для безопасности.

Для примера, пусть пакеты у нас содержатся в двух директориях на разных разделах жесткого диска, структура:

/media/Software
  |
   -- Android
        |
         -- org.connectbot_377.apk
         -- com.jecelyin.editor_39.apk
/media/Linux_Soft
  |
   -- Android_games
  |     |
  |      -- Wargus-0.26.apk
  |      -- SNesoid_2.2.3.apk
   -- Android_tools
        |
         -- android.androidVNC_13.apk

Файлы пакетов могут размещаться где-угодно в дереве каталогов, скрипт будет искать их по имени. Нам нужно лишь указать корневые директории и список файлов для поиска.

Исходный код скрипта:

#!/usr/bin/env python

import os
import sys
import re
import subprocess
import time

# List of files-packages to be installed
packages_to_install = {
	# SSH and telnet client, and terminal emulator
	'ConnectBot':		'org.connectbot_377.apk',
	# Editor for developers with syntax highlight
	'920 Editor':		'com.jecelyin.editor_39.apk',
	# Warcraft II clone for Android
	'Wargus':		'Wargus-0.26.apk',
	# Game consoles emulator
	'SNesoid':		'SNesoid_2.2.3.apk',
	# VNC client for Android
	'androidVNC':		'android.androidVNC_13.apk',
}

# Folders list for searching packages
archives_dirs = [ 
	'/media/Software/',
	'/media/Linux_Soft/',
]

adb_bin_path = '/usr/bin/adb'


def run_in_shell(command):
	""" Run command and get it's output """
	process = subprocess.Popen(
		command, 
		shell = True, 
		stdout = subprocess.PIPE, 
		stderr = subprocess.PIPE
	)
	out, err = process.communicate()
	if not process.returncode:
		return out
	return "  Error: %s" % err

# Checking for ADB binary
if not os.path.isfile(adb_bin_path):
	print "Error: ADB tool not found."
	print "To install in Linux run: 'sudo apt-get install android-tools-adb'"
	sys.exit()
print run_in_shell(adb_bin_path + ' version').strip()

# Checking for Android device
output = run_in_shell(adb_bin_path + ' devices')
if not 'tdevice' in output:
	print "Error: No Android devices found."
	print "Connect device and enable ADB USB debuging."
	sys.exit()
m = re.search(r'([a-z0-9]+tdevice)', output, flags=re.IGNORECASE)
print("Android device SN: %s" % m.group(0).replace("tdevice", ''))

# Collect *.apk files
apk_files = {}
print "\nAchive dirs found:"
for archive_dir in archives_dirs:
	archive_dir = os.path.abspath(archive_dir)
	apk_files_count = 0
	for root, subdirs, files in os.walk(archive_dir):
		for filename in files:
			if '.apk' in filename:
				apk_files[filename] = os.path.join(root, filename)
				apk_files_count += 1
	print("+ [%i packages] %s" % (apk_files_count, archive_dir))
	apk_files_count = 0

# Confirmation
packages_count = len(packages_to_install)
confirmation = raw_input("\nInstall %i packages (yes/no) ?  " % packages_count)
if not (confirmation =='yes' or confirmation =='y'):
	sys.exit()

# Installing packages
print '\nInstalling packages...'
stats = {
	'installed': 0, 
	'total_size': 0,
	'errors': [],
	'time_start': time.time()
}
for package_name in packages_to_install:
	print('---> %s' % package_name)
	package_filename = packages_to_install[package_name]
	if package_filename in apk_files:
		package_path = apk_files[package_filename]
		output = run_in_shell(
			adb_bin_path + 
			' install ' + 
			package_path.replace(" ", " ").replace('&', '&')
		)
		time.sleep(1)
		print output
		if any(x in output for x in ['Error:', 'Failure']):
			stats['errors'].append(package_filename)
			continue
		stats['total_size'] += os.stat(package_path).st_size
		stats['installed'] += 1
	else:
		stats['errors'].append(package_filename)
		print('  Error: package file not found: %s \n' % package_filename)
		
# Show stats info
print 'Packages installation stats:'
print('+ Installed: %i' % stats['installed'])
print('+ Errors: %i' % len(stats['errors']))
for error_file in stats['errors']:
	print('  - %s' % error_file)
print('+ Total size: %i KB' % int(stats['total_size']/1024))
print('+ Total time: %.2f seconds' % (time.time() - stats['time_start']))
print "\nWarning! Don't forget to turn OFF ADB in your Android Device."

В массиве (словаре) packages_to_install мы указываем список пакетов для установки, а именно в формате " 'Название_программы': 'имя_файла_пакета.apk', ".

В массиве (кортеже) archives_dirs нужно указать корневые директории в которых будет рекурсивно производиться поиск указанных файлов-пакетов (apk). Это могут быть как отдельные директории на диске, так и точка монтирования (диск, подмонтированная флешка и т.п.) целиком.

В переменной adb_bin_path содержится путь к исполняемому файлу утилиты ADB. Узнать где у вас в Linux системе располагается данный файл можно при помощи команды:

whereis adb

Содержимое скрипта сохраняем в файле под любым удобным именем, например "android_apk_installer.py", даем файлу права на исполнение и запускаем:

chmod +x android_apk_installer.py
./android_apk_installer.py

По завершению работы скрипт выведет статистику, в которой будет указано сколько пакетов установлено, а в которых возможно имеются ошибки (или же просто файлы не найдены), затраченное время на установку и суммарный размер всех установленных пакетов.

Пример вывода скрипта с установкой двух пакетов на смартфон от Samsung приведен ниже:

Android Debug Bridge version 1.0.31
Android device SN: M110d45615dd

Achive dirs found:
+ [120 packages] /media/Software
+ [364 packages] /media/Linux_Soft

Install 2 packages (yes/no) ?  y

Installing packages...
---> SNesoid
        pkg: /data/local/tmp/SNesoid_2.2.3.apk
Success

---> androidVNC
        pkg: /data/local/tmp/android.androidVNC_13.apk
Success

Packages installation stats:
+ Installed: 2
+ Errors: 0
+ Total size: 913 KB
+ Total time: 8.71 seconds

Warning! Don't forget to turn OFF ADB in your Android Device.

Таким образом указав директории в которых искать пакеты и имена файлов для установки мы можем многократно выполнить установку необходимого нам программного обеспечения на устройства под управлением Android OS.

Данный скрипт можно без больших усилий переделать для выполнения под другими ОС, например под Windows или Mac OS X.

По завершению работы с ADB настоятельно рекомендую отключить в настройках режим USB-отладки, поскольку это может нести опасность для вашего телефона в случае его, пусть даже временного, попадания "не в те руки и не в то время".

При помощи кратковременного подключения к вашему телефону по USB ADB вам за считанные секунды могут установить стороннее шпионское и вредоносное ПО, так что лучше перекрыть такую возможность, безопасности много не бывает!

Скачать скрипт android_apk_installer.zip (2 КБ).

Заключение

Данная статья - это краткая экскурсия в мир возможностей отладки и программирования для Android-устройств при помощи невероятно мощной утилитки ADB.

Приведенный скрипт очень простой и может быть укорочен буквально до 20 строчек кода, сохраняя при этом основной функционал - установку apk-файлов по ADB.

Теперь, зная принципы работы с Android Debug Bridge можно написать и другие полезные скрипты для автоматизации на любом удобном языке: C, Perl, Python, Shell, PHP, Ruby и других.

Если статья оказалась полезной - помочь проекту можно тут: 👍 ПОМОЩЬ, 🎁 DONATE
6 6462 Python