Скриншоты приложения являются важной частью презентации приложения, поскольку с их помощью пользователь сможет понять, как приложение выглядит и какие функции оно выполняет. Очень часто скриншоты помогают убедить потенциального пользователя скачать и установить себе приложение. Однако если приложение локализовано на большое количество языков, создание скриншотов может оказаться весьма трудоемкой задачей, поскольку придётся выполнять одни и те же операции раз за разом для каждой локали.
Инструменты fastlane помогают автоматизировать этот процесс, используя для этого утилиту под названием screengrab. Screengrab создаёт скриншоты для разных типов устройств и локалей, использующихся в приложении.
Примечание: разработчики на данный момент не реализовали поддержку fastlane на Windows, поэтому нет никаких гарантий, что на этой ОС screengrab будет работать корректно. По этой причине в примере ниже будет использоваться дистрибутив Linux.
Преимущества использования screengrab:
- Экономия времени при создании десятков скриншотов для каждого языка.
- Можно наглядно увидеть, как приложение выглядит на разных языках.
- Обновление скриншотов при изменении дизайна.
- Полная интеграция с fastlane.
Screengrab использует возможности встроенных тестов Android в сочетании с Espresso для взаимодействия с приложением. Таким образом, при настройке screengrab нужно будет создать UI-тест с помощью Espresso для того, чтобы утилита смогла выполнять свою работу. При создании новых проектов в Android Studio все средства для использования Espresso уже добавлены в проект.
Перед тем, как начать использовать в своём проекте screengrab, нужно установить Rubygems, которая представляет собой систему управления пакетами, позволяющую устанавливать программы и библиотеки, написанные на Ruby. Для этого воспользуется следующей командой.
Для Fedora:
sudo dnf install ruby-devel
Для Ubuntu:
sudo apt-get install ruby-dev
Теперь можно установить screengrab с помощью команды gem.
sudo gem install fastlane
После этого начнётся скачивания и установка инструментов fastlane (учтите, что это может занять некоторое время).
После того, как установка будет завершена, можно будет перейти к настройке проекта. Для этого запустим Android Studio, в файле build.gradle модуля приложения нужно добавить следующую зависимость в блок dependencies.
dependencies { ... androidTestImplementation 'tools.fastlane:screengrab:1.2.0' }
Кроме того, нужны зависимости, с помощью которых будут создаваться тесты в приложении.
dependencies { ... testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.1' }
Espresso входит в состав библиотеки поддержки, с его помощью можно быстро и удобно внедрять тесты в свой проект. Также в этом же файле нужно добавить следующую строку в блок defaultConfig.
defaultConfig { ... testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' }
Синхронизируем проект, чтобы добавить зависимости. Далее нужно добавить несколько специальных разрешений в файл AndroidManifest.xml, которые нужны для работы screengrab. Чтобы эти разрешения не попали в релизную сборку приложения, можно создать ещё один файл AndroidManifest.xml и разместить его по следующему пути: src/debug/AndroidManifest.xml. В этом файле нужно указать разрешения, представленные ниже.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.androidtools.rifles_guns_shoot_sounds"> <!-- Позволяют разблокировать экран устройства --> <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <!-- Позволяют сохранять и извлекать скриншоты --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!-- Позволяет менять локали --> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/> </manifest>
Примечание: начиная с версии Android 4.2 уровень защиты разрешения android.permission.CHANGE_CONFIGURATION был изменён с “dangerous” на “system|signature|development“. Это означает, что приложение должно быть подписано ключом подписи прошивки, либо располагаться в системном разделе устройства. С помощью ADB можно выдать это разрешение, введя команду:
adb shell pm grant <имя_пакета> android.permission.CHANGE_CONFIGURATION
Теперь настало время создать тест, который будет перемещаться по экранам приложения и делать скриншоты. Для этого открыть любой класс (например. MainActivity) и нажать комбинацию Cltr + Shift + T, после чего выбрать Create new test. Появится диалоговое окно, в котором будет предложено ввести название теста, указать пакет и выбрать методы (если необходимо). В поле Testing Library лучше нужно также выбрать JUnit4.
После этого Android Studio предложит выбрать папку, где будет находиться тест.
Здесь при написании кода для теста важны два момента:
- Для автоматической смены локалей нужно будет добавить следующее правило:
@ClassRule public static final LocaleTestRule localeTestRule = new LocaleTestRule();
- Для того, чтобы сделать скриншот с помощью screengrab, нужно воспользоваться следующим методом:
Screengrab.screenshot("название_скриншота");
Этот метод будет сохранять скриншот в память устройства, затем после выполнения теста screengrab заберёт скриншоты из хранилища.
Не будем вдаваться в подробности написания теста, поэтому ниже будет показан пример теста для одного из наших приложений “Звуки выстрелов”
@RunWith(JUnit4.class) public class MainActivityTest { @ClassRule public static final LocaleTestRule localeTestRule = new LocaleTestRule(); @Rule public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class); @Test public void testTakeScreenshot() { Screengrab.screenshot("content_menu"); onView(withId(R.id.btn_start)).perform(click()); Screengrab.screenshot("start_clicked"); onView(withId(R.id.recyclerView)).perform( RecyclerViewActions.actionOnItemAtPosition(45, click())); Screengrab.screenshot("item_clicked"); onView(allOf(withId(R.id.iv_info), isDisplayed())).perform(click()); Screengrab.screenshot("info"); onView(withText(R.string.caliber_text)).perform(pressBack()); onView(allOf(withId(R.id.iv_share), isDisplayed())).perform(click()); Screengrab.screenshot("share"); onView(withId(R.id.btn_share_sound)).perform(pressBack()); onView(withId(R.id.iv_favorite)).perform(click()); Screengrab.screenshot("add_to_favorite"); onView(allOf(withId(R.id.iv_favorite_list), isDisplayed())).perform(click()); Screengrab.screenshot("favorite_list"); onView(withId(R.id.list_favorite)).perform(pressBack()); onView(withId(R.id.iv_favorite)).perform(click()); onView(allOf(withId(R.id.iv_info), isDisplayed())).perform(pressBack()); onView(withId(R.id.recyclerView)).perform(pressBack()); onView(withId(R.id.btn_about)).perform(click()); Screengrab.screenshot("about"); } }
Чтобы проверить, корректно ли работает тест, можно запустить его, нажав правой кнопкой мыши на класс теста и выбрав Run. Если что-то пойдёт не так, Android Studio вернёт ошибку при выполнении теста.
Теперь, когда тест готов, можно перейти к подготовке screengrab. Для этого в папке с файлами приложения (по умолчанию папка называется <корневая папка проекта>/app/) создать новую папку, назвав её fastlane. Внутри неё создадим файл без какого-либо расширения и назовём его Screengrabfile. Он будет служить конфигурационным файлом для screengrab, в котором можно задать различные параметры. Screengrab перед началом работы будет подхватывать данные из этого файла, избавив тем самым от их ввода при каждом старте. В этой же папке после выполнения работы будут сохраняться сделанные скриншоты.
В нём можно задать такие параметры как:
- Список локалей, для которых необходимо сделать скриншоты.
- Пути до APK-файлов с приложением.
Напишем конфигурацию для нашего приложения, в результате получилось следующее:
locales ['en-US', 'ru-RU', 'ko-KO', 'de-DE', 'fr-FR', 'pt-PT', 'pt-BR', 'zh-CN', 'ar-AR', 'es-ES', 'ja-JA' ] clear_previous_screenshots true tests_apk_path 'build/outputs/apk/screengrab/debug/1_app-screengrab-debug.apk' app_apk_path 'build/outputs/apk/screengrab/debug/1_app-screengrab-debug.apk'
Как нетрудно догадаться, locales перечисляет все языки, для которых нужно сделать скриншоты. Строка clear_previous_screenshots true удаляет скриншоты, выполненные при предыдущем запуске, из папки. tests_apk_path и app_apk_path задают пути для APK-файла.
В этой же папке создадим ещё один файл без расширения и назовём его Appfile. В нём нужно добавить следующую строку.
package_name "имя_пакета"
Это необязательно, но избавляет от необходимости каждый раз вводить имя пакета при запуске screengrab.
Теперь осталось дело за малым.
Нужно создать APK-файл с тестом, для этого в Andorid Studio на вкладке Terminal нужно ввести следующую команду.
./gradlew assembleAndroidTest
Примечание: если у вас в приложении несколько вариантов сборки, либо у вас создана отдельная ветка для тестов, вы можете воспользоваться следующей командой, чтобы собрать конкретный вариант.
./gradlew assemble<название ветки><тип сборки>AndroidTest
Например, если flavor задан “screengrab”, а тип сборки – debug, то команда будет иметь вид:
gradlew assembleDebug assemblescreengrabDebugAndroidTest
Затем в терминале Linux нужно перейти в директорию, где была создана папка fastlane, после чего ввести команду.
fastlane screengrab
При этом эмулятор или устройство должно быть подключено и готово к запуску теста. Screengrab подхватит настройки, которые мы задали в файлах Screengrabgile и Appfile, после чего начнёт прогонять тесты на всех локалях, делая при этом скриншоты. В зависимости от того, как много вам нужно сделать скриншотов и насколько большим оказался тест, это может занять некоторое время.
Как только работа завершится, на экране появится уведомление об успешном сохранении скриншотов вместе с их количеством. Сохранённые скриншоты можно будет найти в папке, где был запущен fastlane screengrab (в нашем случае, в папке fastlane), в ней появится новая папка metadata/android/, в которой по локалям будут распределны все сделанные скриншоты.
Теперь всё что осталось это добавить получившиеся скриншоты в Google Play и обновить приложение. Таким образом, благодаря screengrab можно автоматизировать такой утомительный процесс, как создание скриношотов.