Demystifying Maestro’s UI Testing Implementation
Что такое Maestro?
Фреймворк для UI-тестирования Android, iOS и веб-приложений.
Использует YAML для описания команд.
Maestro Studio: веб-инструмент для генерации YAML-файлов, отображения дерева UI и запуска тестов.
Как работает Maestro?
Установка APK: CLI устанавливает собственные APK (test APK + инструментальный APK).
GRPC-сервер:
Запускается внутри инструментального APK через adb instrument.
Используется для взаимодействия между CLI и устройством.
UiAutomator:
Считывает иерархию UI (в формате XML).
Выполняет команды взаимодействия.
ADB: CLI также использует команды ADB для управления устройством.
Ожидание событий: CLI делает регулярные скриншоты, сравнивает их и отслеживает изменения экрана.
Что такое Maestro?
Фреймворк для UI-тестирования Android, iOS и веб-приложений.
Использует YAML для описания команд.
Maestro Studio: веб-инструмент для генерации YAML-файлов, отображения дерева UI и запуска тестов.
Как работает Maestro?
Установка APK: CLI устанавливает собственные APK (test APK + инструментальный APK).
GRPC-сервер:
Запускается внутри инструментального APK через adb instrument.
Используется для взаимодействия между CLI и устройством.
UiAutomator:
Считывает иерархию UI (в формате XML).
Выполняет команды взаимодействия.
ADB: CLI также использует команды ADB для управления устройством.
Ожидание событий: CLI делает регулярные скриншоты, сравнивает их и отслеживает изменения экрана.
https://android-developers.googleblog.com/2025/01/orientation-and-resizability-changes-in-android-16.html?m=1&s=31
Будет больно
(c) Черновик канала @droidgr
Будет больно
(c) Черновик канала @droidgr
Android Developers Blog
The future is adaptive: Changes to orientation and resizability APIs in Android 16
Build adaptive apps that support various screen sizes and orientations, promoting consistent user experiences across different Android devices.
Разбираем использование runBlocking в Android:
👉 Что такое runBlocking?
Функция, которая запускает новую корутину и блокирует текущий поток до её завершения.
Часто используется в примерах для демонстрации корутин в main() функции.
👉 Почему стоит быть осторожным с runBlocking в Android?
Блокирует текущий поток, что на Android может привести к замораживанию UI и возникновению ANR (Application Not Responding).
Особенно критично при выполнении операций ввода-вывода в главном потоке.
👉 Пример неправильного использования:
´´´
class MainViewModel(private val mainRepository: MainRepository) : ViewModel() {
// Не рекомендуется
private fun fetchPosters() = runBlocking {
mainRepository.fetchPosters()
}
}
´´
В этом примере runBlocking блокирует главный поток, что может привести к проблемам с отзывчивостью приложения.
👉 Рекомендуемые альтернативы:
Используйте viewModelScope для запуска корутин, что обеспечивает автоматическую отмену задач при уничтожении ViewModel.
Применяйте launch или async для асинхронных операций без блокировки главного потока.
(c) Черновик канала @droidgr
👉 Что такое runBlocking?
Функция, которая запускает новую корутину и блокирует текущий поток до её завершения.
Часто используется в примерах для демонстрации корутин в main() функции.
👉 Почему стоит быть осторожным с runBlocking в Android?
Блокирует текущий поток, что на Android может привести к замораживанию UI и возникновению ANR (Application Not Responding).
Особенно критично при выполнении операций ввода-вывода в главном потоке.
👉 Пример неправильного использования:
´´´
class MainViewModel(private val mainRepository: MainRepository) : ViewModel() {
// Не рекомендуется
private fun fetchPosters() = runBlocking {
mainRepository.fetchPosters()
}
}
´´
В этом примере runBlocking блокирует главный поток, что может привести к проблемам с отзывчивостью приложения.
👉 Рекомендуемые альтернативы:
Используйте viewModelScope для запуска корутин, что обеспечивает автоматическую отмену задач при уничтожении ViewModel.
Применяйте launch или async для асинхронных операций без блокировки главного потока.
(c) Черновик канала @droidgr
getstream.io
Exercise Caution When Using runBlocking on Android
Explore the internal mechanism of runBlocking and the reasons why you exercise caution when using runBlocking.
Разбираем библиотеку Immutable Collections в Kotlin:
👉 Почему стандартные коллекции Kotlin не всегда безопасны?
Стандартные коллекции (List, Set, Map) по умолчанию изменяемы, что может привести к непреднамеренным изменениям данных.
Даже коллекции, созданные с помощью listOf(), setOf(), mapOf(), являются только "только для чтения", но не по-настоящему неизменяемыми.
👉 Что предлагает библиотека Immutable Collections?
Предоставляет действительно неизменяемые коллекции, которые предотвращают случайные изменения и повышают безопасность в многопоточных средах.
Использует структурное разделение для оптимизации производительности и предотвращения ненужного копирования данных.
👉 Как начать использовать?
Добавьте зависимость в build.gradle.kts:
Создание неизменяемых коллекций:
Оригинальные immutableList и immutableMap остаются без изменений.
👉 Преимущества в Jetpack Compose:
Избежание ненужных рекомпозиций: Неизменяемые коллекции помогают Compose отслеживать изменения состояния и предотвращают избыточные обновления UI.
Стабильность состояния: Благодаря структурному разделению, изменения создают новые объекты, сохраняя неизменность предыдущих версий, что улучшает производительность.
Предсказуемое поведение UI: Исключение случайных мутаций данных обеспечивает более надежную работу интерфейса.
Подробнее о библиотеке Immutable Collections и её использовании читайте в статье:
#Kotlin #ImmutableCollections #JetpackCompose #AndroidDevelopment
(c) Черновик канала @droidgr
👉 Почему стандартные коллекции Kotlin не всегда безопасны?
Стандартные коллекции (List, Set, Map) по умолчанию изменяемы, что может привести к непреднамеренным изменениям данных.
Даже коллекции, созданные с помощью listOf(), setOf(), mapOf(), являются только "только для чтения", но не по-настоящему неизменяемыми.
👉 Что предлагает библиотека Immutable Collections?
Предоставляет действительно неизменяемые коллекции, которые предотвращают случайные изменения и повышают безопасность в многопоточных средах.
Использует структурное разделение для оптимизации производительности и предотвращения ненужного копирования данных.
👉 Как начать использовать?
Добавьте зависимость в build.gradle.kts:
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5")
}
Создание неизменяемых коллекций:
import kotlinx.collections.immutable.*
val immutableList = persistentListOf("A", "B", "C")
val immutableSet = persistentSetOf(1, 2, 3)
val immutableMap = persistentMapOf("key1" to 100, "key2" to 200)
Добавление и удаление элементов:
kotlin
Копировать
Редактировать
val newList = immutableList.add("D") // Создает новый список
println(newList) // Вывод: [A, B, C, D]
val newMap = immutableMap.put("key3", 300)
println(newMap) // Вывод: {key1=100, key2=200, key3=300}
Оригинальные immutableList и immutableMap остаются без изменений.
👉 Преимущества в Jetpack Compose:
Избежание ненужных рекомпозиций: Неизменяемые коллекции помогают Compose отслеживать изменения состояния и предотвращают избыточные обновления UI.
Стабильность состояния: Благодаря структурному разделению, изменения создают новые объекты, сохраняя неизменность предыдущих версий, что улучшает производительность.
Предсказуемое поведение UI: Исключение случайных мутаций данных обеспечивает более надежную работу интерфейса.
Подробнее о библиотеке Immutable Collections и её использовании читайте в статье:
#Kotlin #ImmutableCollections #JetpackCompose #AndroidDevelopment
(c) Черновик канала @droidgr
Carrion.dev
Exploring Kotlin’s Immutable Collections Library
Exploring Kotlin’s Immutable Collections Library, use it in Compose to improve performance.
Разбираем, что происходит при нажатии кнопки "Старт" в Android Studio:
👉 Шаг 1: Сборка приложения
Команда: ./gradlew assembleDebug
Описание: Компилирует код и генерирует APK-файл в директории app/build/outputs/apk/debug/.
👉 Шаг 2: Запуск эмулятора
Команды:
emulator -list-avds
emulator -avd <имя_эмулятора>
Описание: Первая команда отображает список доступных виртуальных устройств, вторая запускает выбранный эмулятор.
👉 Шаг 3: Установка APK на устройство
Команда: adb install -r app/build/outputs/apk/debug/app-debug.apk
Описание: Устанавливает или переустанавливает APK на подключенное устройство или эмулятор.
👉 Шаг 4: Запуск приложения
Команда: adb shell am start -n <package_name>/<activity_name>
Описание: Запускает указанную Activity приложения на устройстве.
Эти команды позволяют управлять процессом сборки и запуска приложения напрямую из терминала, что особенно полезно для разработчиков, предпочитающих минималистичные среды разработки.
Подробнее о процессе читайте в статье:
#AndroidStudio #CommandLine #AndroidDevelopment
(c) Черновик канала @droidgr
👉 Шаг 1: Сборка приложения
Команда: ./gradlew assembleDebug
Описание: Компилирует код и генерирует APK-файл в директории app/build/outputs/apk/debug/.
👉 Шаг 2: Запуск эмулятора
Команды:
emulator -list-avds
emulator -avd <имя_эмулятора>
Описание: Первая команда отображает список доступных виртуальных устройств, вторая запускает выбранный эмулятор.
👉 Шаг 3: Установка APK на устройство
Команда: adb install -r app/build/outputs/apk/debug/app-debug.apk
Описание: Устанавливает или переустанавливает APK на подключенное устройство или эмулятор.
👉 Шаг 4: Запуск приложения
Команда: adb shell am start -n <package_name>/<activity_name>
Описание: Запускает указанную Activity приложения на устройстве.
Эти команды позволяют управлять процессом сборки и запуска приложения напрямую из терминала, что особенно полезно для разработчиков, предпочитающих минималистичные среды разработки.
Подробнее о процессе читайте в статье:
#AndroidStudio #CommandLine #AndroidDevelopment
(c) Черновик канала @droidgr
Medium
Behind the Scenes: What Happens When You Press the Start button in Android Studio?
As Android developers, we frequently rely on Android Studio’s “Run” or “Start” button to build, deploy, and launch our applications on…
Сделал небольшое саммари по AI для Android:
https://www.linkedin.com/feed/update/urn:li:activity:7379572553406730240/
https://www.linkedin.com/feed/update/urn:li:activity:7379572553406730240/
Linkedin
GitHub - mobile-next/mobile-mcp: Model Context Protocol Server for Mobile Automation and Scraping (iOS, Android, Emulators, Simulators…
AI for Android development. Here's what you need to know:
- Your dependency injection framework can now help you write the perfect prompt to solve crashes. Koin, a popular service locator for Kotlin, has introduced a new feature in its Kotzilla platform…
- Your dependency injection framework can now help you write the perfect prompt to solve crashes. Koin, a popular service locator for Kotlin, has introduced a new feature in its Kotzilla platform…
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI.
В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось, что таких приложений на удивление мало, хотя, казалось бы, программ с погодой тьма.
Я слишком ленив, чтобы писать всё с нуля, поэтому попробую сделать это одним махом. План следующий:
👉 Взять обычный шаблон.
👉 Сгенерировать основу через Kiro.
👉 Сделать ревью кода.
👉 Докрутить с помощью Claude и руками.
Из плохих новостей: мой старый аккаунт разработчика снесли за то, что я забыл пройти верификацию в мае. Придётся создавать новый, чистый.
#weather_app
В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось, что таких приложений на удивление мало, хотя, казалось бы, программ с погодой тьма.
Я слишком ленив, чтобы писать всё с нуля, поэтому попробую сделать это одним махом. План следующий:
👉 Взять обычный шаблон.
👉 Сгенерировать основу через Kiro.
👉 Сделать ревью кода.
👉 Докрутить с помощью Claude и руками.
Из плохих новостей: мой старый аккаунт разработчика снесли за то, что я забыл пройти верификацию в мае. Придётся создавать новый, чистый.
#weather_app
😁2👍1
Антоха Разраб c AI
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI. В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось…
Продолжаем #build_in_public. Немного технических деталей по будущему виджету
Откуда будем брать данные о погоде?
Open-Meteo (open-meteo.com). Это открытое и бесплатное API, что идеально подходит, пока проект некоммерческий. Никаких ключей и сложной регистрации.
Как будем определять локацию?
Тут всё просто:
📍 Автоматически определять ваше местоположение, чтобы сразу показать актуальный прогноз, стянув с gps
🗺 Если захочется посмотреть погоду в другом городе, можно будет выбрать точку вручную на карте. Для этого интегрируем OSM
Держим курс на простоту и функциональность!
#weather_app
Откуда будем брать данные о погоде?
Open-Meteo (open-meteo.com). Это открытое и бесплатное API, что идеально подходит, пока проект некоммерческий. Никаких ключей и сложной регистрации.
Как будем определять локацию?
Тут всё просто:
📍 Автоматически определять ваше местоположение, чтобы сразу показать актуальный прогноз, стянув с gps
🗺 Если захочется посмотреть погоду в другом городе, можно будет выбрать точку вручную на карте. Для этого интегрируем OSM
Держим курс на простоту и функциональность!
#weather_app
👍1
Антоха Разраб c AI
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI. В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось…
Задумался, как мне из координат указанных пользователем вытащить ближайший город. Думал, может Places API или что еще - а нет, все проще. В Android есть Geocoder API, которое делает ровно сказанное выше и достаточно неплохо.
🔥3
Не с первого раза, да и на старом добром xml, вместо модного glance, но заставил вчера вечером Claude Code догенерировать мне черновик 3 виджетов.
Если бы не подписка, потратил бы баксов 30 на 3 виджета с обновлением данных. Норм?
#weather_app
Если бы не подписка, потратил бы баксов 30 на 3 виджета с обновлением данных. Норм?
#weather_app
🔥4❤2💅2
Внутрянка пока что только так. Бесплатная OSM и геокодер о котором писал выше.
Мне подсветили что Geocoder апи может крашится в зависимости от вендоров, так что надо сразу firebase crashlytic прикручивать и искать замену
#weather_app
Мне подсветили что Geocoder апи может крашится в зависимости от вендоров, так что надо сразу firebase crashlytic прикручивать и искать замену
#weather_app
🔥4
На экране выше очевидна проблема. В приложении погоды главный экран не показывает погоду.
Ну штош, пора это исправить. Своими руками делать не хочу, но попросить новый AI сервис это сделать за мен я - самое то.
Встречайте - бесплатный https://cto.new/ в обмен на ваши данные. Такой трейд меня устраивает.
В комментах можно найти 1 инвайт код в этот сервис
#weather_app #ai
Ну штош, пора это исправить. Своими руками делать не хочу, но попросить новый AI сервис это сделать за мен я - самое то.
Встречайте - бесплатный https://cto.new/ в обмен на ваши данные. Такой трейд меня устраивает.
В комментах можно найти 1 инвайт код в этот сервис
#weather_app #ai
🔥4
Первое, что я настраиваю на проектах - CI/CD, чтоб вообще забыть о проблемах деплоя. В этот раз, за 1 команду тоже не получилось. AI нагалюцинировал шаг с тестами, линтером и UI тестами, хотя их даже нет.
Это все вместе забирает 8 минут на каждую сборку под каждый пуш. Пришлось дотюнивать руками, но теперь у меня всегда под рукой билды для тестов.
Почему это удобно? Я планирую разработку через полностью автономного агента, а удобный пайплайн позволит сразу увидеть результат.
#weather_app
Это все вместе забирает 8 минут на каждую сборку под каждый пуш. Пришлось дотюнивать руками, но теперь у меня всегда под рукой билды для тестов.
Почему это удобно? Я планирую разработку через полностью автономного агента, а удобный пайплайн позволит сразу увидеть результат.
#weather_app
🔥9
Антоха Разраб c AI
На экране выше очевидна проблема. В приложении погоды главный экран не показывает погоду. Ну штош, пора это исправить. Своими руками делать не хочу, но попросить новый AI сервис это сделать за мен я - самое то. Встречайте - бесплатный https://cto.new/ в…
Сделав 10ку успешных запусков, сервис упер меня в rate limits. Удобно что я смог удаленно с телефона пописать задачки. Качество решения крайне высокое. Часть замержил сразу же через приложение GitHub
Есть, кстати, аналогичный сервис от гугла - https://jules.google.com/. Я совсем забыл что был в вейтлисте, а сейчас сервис бесплатен (15 задач в день) для всех. Гугловские модели кодят похуже, но для таких мелких приложений это норм
#ai
Есть, кстати, аналогичный сервис от гугла - https://jules.google.com/. Я совсем забыл что был в вейтлисте, а сейчас сервис бесплатен (15 задач в день) для всех. Гугловские модели кодят похуже, но для таких мелких приложений это норм
#ai
🔥2