Автоматизация создания скриншотов с помощью Screengrab

Скриншоты приложения являются важной частью презентации приложения, поскольку с их помощью пользователь сможет понять, как приложение выглядит и какие функции оно выполняет. Очень часто скриншоты помогают убедить потенциального пользователя скачать и установить себе приложение. Однако если приложение локализовано на большое количество языков, создание скриншотов может оказаться весьма трудоемкой задачей, поскольку придётся выполнять одни и те же операции раз за разом для каждой локали.

Инструменты 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 предложит выбрать папку, где будет находиться тест.

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

  1. Для автоматической смены локалей нужно будет добавить следующее правило:
    @ClassRule public static final LocaleTestRule localeTestRule = new LocaleTestRule();
  2. Для того, чтобы сделать скриншот с помощью 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 можно автоматизировать такой утомительный процесс, как создание скриношотов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *