- Запуск приложений в Android Virtual Device на удаленном Linux-сервере
- Требования и инструменты
- Шаг 1. Разворачиваем SDK
- Шаг 2. Создаем и запускаем Android Virtual Device
- Шаг 3. Запуск приложений
- Шаг 4. Настройка удаленной отладки
- How to Setup Android Emulator Without Installing Android Studio in Linux
- Install Command Line Tools
- Install Required Packages
- Find Correct System Image to Use
- Download System Image and Corresponding Packages
- Create a New AVD
- Run Emulator
- Conclusion
- About the author
- Nitesh Kumar
Запуск приложений в Android Virtual Device на удаленном Linux-сервере
В процессе работы над одним проектов возникла ситуация, когда необходимо проводить в автоматическом режиме ряд операций из мобильного приложения. Поскольку набор входных данных, которые вводит пользователь для работы приложения меняется, была необходима реализация, которая позволила бы имитировать действия пользователя. Более того, необходимо было, чтобы приложение запускалось автоматически на удаленном linux-сервере, выполняло действия и сохраняло результаты. О том, как решал данную задачу, я и хочу рассказать читателям.
Первая часть задачи решалась достаточно просто — взять библиотеку для тестирования мобильных приложений и реализовать необходимую логику. Выбор пал на Robotium. Во-первых, он бесплатный, во-вторых он позволяет достаточно удобно работать с тестируемым приложением, по крайней мере для меня. Не буду акцентировать внимание на реализации тестов, этому посвящены другие статьи, напомню только, что в результате получается еще одно приложение, которое умеет запускать тестируемое приложение, анализировать, что оно отображает и т.д. Вторая часть работы имела гораздо больше всевозможных подводных камней, но обо всем по порядку.
Требования и инструменты
Главным требованием было то, что приложение должно запускаться на linux-сервере. Для меня это значило, что привычного мне, заядлому «виндузятнику», графического интерфейса не будет со всеми вытекающими из этого сложностями. Также среди полезных пожеланий была возможность вести отладку все на том же сервере при необходимости.
- Среда разработки — IntelliJ IDEA;
- Удаленный сервер linux — Debian 7;
- Android SDK;
- Putty — для реализации удаленной отладки.
Шаг 1. Разворачиваем SDK
- Копируем архив на нашу linux-машину и распаковываем в нужный каталог;
- Далее обновляем наш SDK.
Тут два варианта. Первый, когда вы точно знаете, что вам необходимо, тогда получаем список доступных библиотек:
В результате получим длинный список доступных для скачивания пакетов, выбираем нужные и даем команду для из загрузки:
./android update sdk --no-ui –filter
Второй вариант скачать все, что доступно на текущий момент. Мне он оказался ближе, потому что сам я не разработчик Android и не был уверен, что выберу все, что нужно:
Шаг 2. Создаем и запускаем Android Virtual Device
Теперь нам необходимо создать наше виртуальное устройство, тут тоже ничего сложного, команда для этого стандартная:
./android create avd --name --target –b
Имя устройства — ну тут все и так понятно.
Порядковый номер версии ОС Android — его можно увидеть в списке доступных версий для создания устройства. Сам список можно получить командой:
Набор инструкций процессора — какой процессор эмулировать, если для версии Android использовался только один вариант процессора, то данный параметр можно проигнорировать, иначе в ответ на команду утилита выдаст сообщение о необходимости явно указать набор инструкций, а также укажет возможные варианты. Например, у меня значение этого параметра было default/armeabi.
После этого создает папку с набором файлов виртуального устройства, расположен он в каталоге */.android/avd, который находится или в директории root, или в директории, где расположен сам SDK (зависит от прав пользователя). Имя каталога с файлами совпадает с именем виртуального устройства.
Теперь запускаем наше устройство. Напоминаю, что в условии стоит, что сервер у нас с терминальным доступом, а значит никаких графических библиотек у нас не было, нет и не будет. Но надо отдать ребятам из Google должное, они и этот случай предусмотрели:
-no-window — указывает на запуск с отключенным экраном.
Имя устройства — имя, которое мы указали при создании устройства выше.
Более подробное описание и другие ключи для запуска можно найти здесь.
Теперь нужно дождаться, пока устройство загрузится:
Теперь нам осталось только установить наши приложения: основное, которое обращается к серверу, и robotium-приложение, которое умеет обращаться к основному и выполнять действия:
-r — данный ключ показывает, что если приложение уже существует, то перезаписать его.
Имя приложения — имя вашего apk-файла с расширением.
На многих ресурсах я встречал упоминание, что AVD можно переносить просто скопировав файлы с одной машины на другую, но у меня не получилось: linux при попытке запуска бодро ругнулся на отсутствие файла kernel.ini, хотя на созданном непосредственно в linux-е эмуляторе никаких файлов с таким именем не наблюдалось. Но поскольку создание эмулятора дело минутное, я махнул на это рукой.
Шаг 3. Запуск приложений
Запустить robotium-приложение достаточно просто (я приведу конкретный пример для наглядности):
./adb -s emulator-5554 shell am instrument -w -e class com.example.robotium.Kernel com.example/android.test.InstrumentationTestRunner
emulator-5554 – имя эмулятора, обычно оно стандартно, если эмулятор запущен в системе один, но посмотреть список доступных запущенных устройство можно командой:
e class com.example.robotium.Kernel – имя класса в robotium-приложении, непосредственно выполняющего тесты.
com.example– имя package из файла AndroidManifest.xml для robotium-приложения.
Казалось бы, вот и финиш, но не тут-то было. Приложение стартовало, какое-то время выполнялось и выпадало с ошибкой. Все оказалось банально, при запуске эмулятор стартует с заблокированным экраном – и ему все равно отображается этот экран или нет. Одна из первых ссылок в поисковике советует нам просто вбить команду:
./adb shell input keyevent 82
Тест на своей windows-машине показал, что это работает, причем независимо от того запущен эмулятор с параметром –no-window, и без него. А вот запуск на debian-е не дал ничего, ошибка повторялось, а значит причина в другом, предположил я. Долгие поиски не дали ничего конкретного, видимо, мало кому приходит в голову гонять тесты для GUI на терминальном сервере. В основном встречались комментарии, что поскольку тесты эти для gui, то и работать они при отключенном экране не могут, мол, нет GUI отображающегося, нет и тестов для них. Но у меня ситуация была из разряда «партия сказала надо» и придти с таким ответом к своему teamlead-у я не мог, поэтому я взял за аксиому, что экран просто не разблокировался, к сожалению проверить визуально как оно было на самом деле я не смог, сервер терминальный все-таки. Добавил дополнительные проверки на состояние экрана в момент запуска и действительно оказалось, что экран мало того, что не разблокирован, но и еще выключен – подвела-таки команда.
Проблему решить помогла программная разблокировка. Для этого в robotium-приложении добавляем код:
PowerManager.WakeLock wl; PowerManager pm = (PowerManager) solo.getCurrentActivity().getApplicationContext().getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "INFO"); wl.acquire(); KeyguardManager km = (KeyguardManager) solo.getCurrentActivity().getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock kl; kl = km.newKeyguardLock("name"); kl.disableKeyguard();
Чтобы данный код заработал в файл AndroidManifest.xml необходимо добавить следующие строчки:
Следует отметить, что добавлять нужно не в файл robotium-приложения, а в файл тестируемого приложения, потому что вся работа с ОС Android ведется именно через него, а значит ему и нужны все права на доступ.
После этого еще раз выполняем описанную ранее команду — ура, все запустилось все работает.
Шаг 4. Настройка удаленной отладки
К сожалению, с нуля, ни сама Android SDK, ни IDEA не умеют работать с виртуальными устройствами на удаленных серверах, а значит заставим их думать, что устройство здесь, рядом. Для этого настроим в Putty туннель к нашему серверу. Для этого надо добавить два порта — для устройства emulator-5554 это будут порты 5554 и 5555. Для уточнения на всякий случай пример на изображении:
Теперь на удаленном сервере выключаем сервис ADB:
А на локальной машине запускаем или перезапускаем (сразу выключив):
Теперь если выполнить команду ./adb devices — мы увидим удаленные запущенные устройства. К сожалению, запускать эмуляторы удаленно мы не можем, только видеть уже запущенные, ну и работать с ними. Теперь, при запуске robotium-приложения непосредственно из IDEA в диалоге выбора устройства мы увидим и наш удаленный эмулятор (см. изображение). С ним можно работать точно так же как и с локальным.
Спасибо за внимание, надеюсь данный пост будет полезен еще кому-то, потому что мне его в свое время очень не хватало.
How to Setup Android Emulator Without Installing Android Studio in Linux
This article will explain how to install the official Android emulator as a standalone application in Linux. The official Android emulator comes with the “Android Studio” application development suite. However, if you are not interested in developing Android apps and just want a working emulator without installing Android Studio, this article should help you. All the steps mentioned in the article are tested on Ubuntu 20.04 LTS version.
Install Command Line Tools
Download the latest version of “Android Command Line Tools” from here (scroll down to the command line section).
Extract the downloaded archive and make a new folder named “tools” inside “cmdline-tools” directory. Copy and paste all files from “cmdline-tools” folder to “tools” folder. Your final directory layout should look like this:
Install Required Packages
Go to the “tools/bin” folder, launch a new terminal window and run the following command to update repository details:
Next, run the following command to list available and installed packages:
Install some packages required for the Android emulator to work:
Find Correct System Image to Use
Next you need to make a note of the system image you want to load in the Android emulator. To get a list of downloadable system images, run the command below:
You should get some output similar to this:
You will see some numbers like “27”, “28” etc. in the name of system images. These numbers denote Android API levels. Find the Android version corresponding to the API levels from here and make a note of the appropriate system image you want to use in the emulator and the API level number.
Download System Image and Corresponding Packages
Next, download the following packages using the same API level number you finalized in the step above:
$ . / sdkmanager “platforms;android- 30 ” “system-images;android- 30 ;google_apis_playstore;x86_64” “build-tools;30.0.2”
For instance, if you decided to use “system-images;android-29;default;x86_64” as the system image, the command would change to:
$ . / sdkmanager “platforms;android- 29 ” “system-images;android- 29 ;default;x86_64” “build-tools;29.0.3”
You can always use the “list” switch to find correct command and version numbers:
Create a New AVD
AVD or “Android Virtual Device” is a set of configuration parameters that defines values for a virtual device that will emulate a real Android hardware device.
To create a new AVD, you need to use the system image you downloaded in the step above. Run the following command to create a new AVD:
$ . / avdmanager create avd -n “my_avd_30” -k “system-images;android- 30 ;google_apis_playstore;x86_64”
Replace “my_avd_30” with any name of your choice. You may be prompted to alter some configuration parameters. Follow on-screen instructions and change the values as per your requirements.
Confirm that the AVD has been successfully created using the command below:
You should get some output similar to this:
Available Android Virtual Devices:
Name: my_avd_30
Path: /home/nit/.android/avd/my_avd_30.avd
Target: Google Play (Google Inc.)
Based on: Android 11.0 (R) Tag/ABI: google_apis_playstore/x86_64
Sdcard: 512 MB
Note the path of AVD in the output above. At the same path, you can find a “config.ini” file that can be used to change configuration parameters of the AVD.
Run Emulator
Go to “emulator” folder (up a few directories) and use the following command to launch the emulator:
Replace “my_avd_30” with the name of your own AVD you created in the step above. Your Android emulator should be now up and running:
You can create as many as AVDs as you want and each AVD / System Image will be treated separately.
Conclusion
Android emulator provides an excellent way to emulate real life Android devices on your desktop PC. You can use the emulator to test some apps that are yet in development or you can use the emulator to regularly run Android compatible apps and games on a Linux PC. The performance of the emulator will depend on your system’s horsepower, virtualization technologies available on your PC and your system’s compatibility with the KVM kernel module.
About the author
Nitesh Kumar
I am a freelancer software developer and content writer who loves Linux, open source software and the free software community.