В исходниках можно найти такие шедевры 👇
// Проверяет используется ли сейчас Monkey Runner
ActivityManager.isUserAMonkey()
UserManager.isUserAGoat()
UserManager.DISALLOW_FUN
// Отдали дань памяти хиту
Chronometer.isTheFinalCountdown()
Log.wtf()
// Попало в релиз, хотя явно должно было быть исправлено
AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()
// Звёздные войны
SensorManager.GRAVITY_DEATH_STAR_I
Разработчики в Google точно любит пошутить 😄
А вы где встречали весёлые названия API или переменных — в Android, KMP или своих проектах?
#android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤48👍20🤯3
Вот реальная история, как знание механики работы ViewModel спасло мне вечер 👇
У меня приложение на Compose и Jetpack Navigation 3 (работает на основе состояния Back Stack). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же❗️ Баг: при переходе в папку навигация срабатывает, UI не меняется. Современные ИИ подсказали общие вещи, но не помогли — промты, видимо, подвели (тут мне ещё надо прокачать знания) 🙂
Вспомнил ключевой факт про архитектуру:
👉 Все
👉 В пределах одного
👉 Если нужно несколько экземпляров одного типа на одном owner’е — используем key.
Решение в одну строку — привязать ключ к ViewModel, связанный с текущей папкой:
Мини-чеклист, если ловите такой баг
👉 Один экран используется повторно с разными параметрами? → Нужен key.
👉 Меняется route, но owner тот же? → key обязателен.
👉 Используете Hilt/Koin? → У этих функций тоже есть параметр key (hiltViewModel(key=...), koinViewModel(key=...)).
👉 key должен детерминированно зависеть от входных данных (например, folderId).
👉 При навигации назад убедитесь, что ViewModel освобождается ожидаемо.
Ещё нюанс - если у вас сложная иерархия графов, проверьте, к какому
Рекомендую посмотреть мои видео по теме:
📹 Разбор Jetpack Navigation 3
🪙 Полный разбор Jetpack ViewModel в Android и Kotlin Multiplatform
#android #compose #androidjetpack #viewmodel #архитектура
У меня приложение на Compose и Jetpack Navigation 3 (работает на основе состояния Back Stack). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же
ViewModel.Вспомнил ключевой факт про архитектуру:
👉 Все
ViewModel живут в ViewModelStore.👉 В пределах одного
ViewModelStoreOwner (Activity/Fragment/NavBackStackEntry) получение ViewModel по умолчанию идёт по типу.👉 Если нужно несколько экземпляров одного типа на одном owner’е — используем key.
Решение в одну строку — привязать ключ к ViewModel, связанный с текущей папкой:
@Composable
fun FileNavigator(
folderId: Id,
modifier: Modifier = Modifier,
) {
// новый folderId → новый экземпляр ViewModel → новый UI-стейт
val viewModel: FileNavigatorViewModel = viewModel(
key = "files(rootId='$folderId')"
)
// ...
}
Мини-чеклист, если ловите такой баг
👉 Один экран используется повторно с разными параметрами? → Нужен key.
👉 Меняется route, но owner тот же? → key обязателен.
👉 Используете Hilt/Koin? → У этих функций тоже есть параметр key (hiltViewModel(key=...), koinViewModel(key=...)).
👉 key должен детерминированно зависеть от входных данных (например, folderId).
👉 При навигации назад убедитесь, что ViewModel освобождается ожидаемо.
Ещё нюанс - если у вас сложная иерархия графов, проверьте, к какому
ViewModelStoreOwner вы реально привязаны.Рекомендую посмотреть мои видео по теме:
#android #compose #androidjetpack #viewmodel #архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍84🤔10🤯5❤2🔥2
🤯 А что вообще считать маленьким проектом в 2025 году?
В закрытом чате обсуждали, какого ноутбука хватит под «маленький KMP-проект» — но вот с тем, что считать маленьким, договориться не смогли.
Приложение с тремя экранами, но двенадцатью Gradle-модулями — это ещё маленькое?
KMP, но «только чуть-чуть под iOS» — считается?
Или когда просто хотел попробовать Compose, а закончил с DI, Router и UseCase на одну строчку логики?
В чём вообще измерять размер проекта — в строках кода, количестве модулей, экранах, фичах или времени сборки?
У меня есть мнение, но интересно, где проходит грань у вас 😏
Комментарии открыты — давайте поругаемся конструктивно.
#архитектура #android #kmp
В закрытом чате обсуждали, какого ноутбука хватит под «маленький KMP-проект» — но вот с тем, что считать маленьким, договориться не смогли.
Приложение с тремя экранами, но двенадцатью Gradle-модулями — это ещё маленькое?
KMP, но «только чуть-чуть под iOS» — считается?
Или когда просто хотел попробовать Compose, а закончил с DI, Router и UseCase на одну строчку логики?
В чём вообще измерять размер проекта — в строках кода, количестве модулей, экранах, фичах или времени сборки?
У меня есть мнение, но интересно, где проходит грань у вас 😏
Комментарии открыты — давайте поругаемся конструктивно.
#архитектура #android #kmp
🤯21👍12❤4
Современные смартфоны умеют снимать с HDR, 120 FPS и стабилизацией, но вот какая комбинация этих фич реально доступна — загадка. Например, стабилизация часто работает только при 1080p, а 60 FPS не всегда доступны в 4K.
С выходом Jetpack CameraX 1.5 появилось API GroupableFeature и новые параметры для SessionConfig, которые позволяют из кода проверить, какие функции камера может использовать одновременно.
// Пример проверки неподдерживаемых комбинаций
val unsupportedFeatures =
mutableSetOf<GroupableFeature>()
val appFeatureOptions =
setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)
appFeatureOptions
.filterNot { it in currentFeatures }
.filter { featureOption ->
cameraInfo.isFeatureGroupSupported(
SessionConfig(
useCases = useCases,
requiredFeatureGroup =
currentFeatures + featureOption
)
)
}
.forEach { unsupportedFeatures.add(it) }
Так можно заранее отсеять неподдерживаемые сочетания — например, когда HDR и стабилизация не работают вместе при 60 FPS 🎥
Подробнее в статье (EN)
#android #camerax #Jetpack #androidjetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤10🔥3🤔3
Используете RoboScripts в Google Play Pre-laucnсh testing?
Anonymous Poll
1%
Да
18%
Нет
63%
Что такое Roboscripts?
12%
Что такое Play Pre-laucnсh testing?
1%
Другой вариант
6%
Не участвую в опросе
👍2❤1
Когда вы загружаете сборку в Альфа или Бета канал Google Play, сервис автоматически запускает
⚙️ Robo script - cценарии и повторяемость тестов
По умолчанию поведение бота недетерминированное — каждый запуск может идти по разным путям.
Чтобы добиться повторяемости, можно записать свой сценарий взаимодействия и загрузить его в консоль.
Такой сценарий называется Robo Script. Записать его можно прямо через Android Studio (если недоступно, то возможно отключили плагин), выполняя нужные действия в приложении.
Загруженный сценарий позволит прогонять одинаковые шаги при каждом тесте, что особенно полезно для авторизации, форм и сложных экранов.
🔐 Авторизация и тестовые данные
Если первый экран вашего приложения — логин, можно предоставить тестовый аккаунт (username/password), чтобы бот смог пройти авторизацию. Это важно, если вы хотите, чтобы тест охватил внутренние экраны и логику приложения.
Данные указываются в разделе Pre-launch report settings → Login credentials в Google Play Console.
🔗 Проверка deep links (ограничено 3 штуками)
Pre-launch Tests позволяют также протестировать работу deep links. Вы можете указать deeplink-URL, и Google Play автоматически запустит приложение с этим интентом, проверяя, открывается ли нужный экран и не происходит ли падений. Добавляются через настройки в Google Play Console.
Те же Robo-тесты можно запускать и в Firebase Test Lab. Это позволит проверить приложение на большем количестве устройств и версий Android, а также встроить прогон в CI/CD — например, через GitHub Actions или Firebase CLI.
UI на Compose и Flutter корректно тестируются, так как бот взаимодействует через Accessibility API, а не напрямую с фреймворком. Проблемы возникают только при кастомной отрисовке или выключенном accessibility.
#android #googleplay #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥20👍12❤3
Android Broadcast
#kmp #swift #native
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤6🔥4🤔1
Media is too big
VIEW IN TELEGRAM
Samsung представила Galaxy XR - шлем дополненной реальности. Аналог Apple Vision Pro но стоить будет 1800$ в США (в 2 раза дешевле устройства Apple)
Работает шлем на чипе Qualcomm а ОС - Android XR с Google сервисами. Можно запускать приложения как с адаптацией под XR, так и без неё.
Мнение автора:
#android #samsung #androidxr
Работает шлем на чипе Qualcomm а ОС - Android XR с Google сервисами. Можно запускать приложения как с адаптацией под XR, так и без неё.
Мнение автора:
Дорогая игрушка, которая будет нишевым устройством и скатится туда же куда и Vision. XR хочется видеть на очках, а нне шлемах.
#android #samsung #androidxr
🔥20👍6❤1
Если хотите адаптировать приложение под Android XR, то Google уже подготовила материалы (хотя SDK пока в Dev Preview 🤯):
🔗 Документация и примеры на сайте
🐱 Примеры на GitHub
Codelab:
🤖 Learn Android XR Fundamentals: Part 1 - Modes and Spatial Panels
🤖 Learn Android XR Fundamentals: Part 2 - Orbiters and Spatial Environments
#android #androidxr
🔗 Документация и примеры на сайте
Codelab:
#android #androidxr
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1🤔1
🕹 Представьте: вы оказались в кодовом подземелье. Перед вами двери, на которых написано: Массивы, Стек, Очередь, Дерево, Хеш-таблица…
Чтобы пройти дальше, нужно выбрать правильный путь. Ошибешься — код рухнет, запросы будут тормозить, а на собесе придётся объяснять, почему сложность O(n²) звучит как приговор.
📖 Книга «Грокаем структуры данных» Марчелло Ла Рокка — это не скучный справочник, а карта подземелья. С ней вы:
— научитесь распознавать ловушки неоптимальных решений;
— выберете правильные инструменты под задачу;
— подготовитесь к «босс-файту» на собеседованиях;
— и пройдёте игру под названием «эффективный код».
⚡️ Если вы хотите апнуть скилл и прокачать мышление разработчика — этот «гайдбук» точно для вас.
👉 По промокоду
#реклама
Чтобы пройти дальше, нужно выбрать правильный путь. Ошибешься — код рухнет, запросы будут тормозить, а на собесе придётся объяснять, почему сложность O(n²) звучит как приговор.
📖 Книга «Грокаем структуры данных» Марчелло Ла Рокка — это не скучный справочник, а карта подземелья. С ней вы:
— научитесь распознавать ловушки неоптимальных решений;
— выберете правильные инструменты под задачу;
— подготовитесь к «босс-файту» на собеседованиях;
— и пройдёте игру под названием «эффективный код».
⚡️ Если вы хотите апнуть скилл и прокачать мышление разработчика — этот «гайдбук» точно для вас.
👉 По промокоду
broadcast — скидка 5% на книги издательства "Питер"#реклама
👍12🤔3🔥2
Когда: Четверг, 23 октября, 19:00 (GMT+3)
В последнее время я очень много читал материалов на тему применения ИИ технологий во всём цикле разработки приложений в Surf. Накопилось много вопросов и пригласил эксперта компании. Surf развивала и популяризировала Flutter, всегда интегрирую свежие подходы в проекты студии и вот сейчас ИИ.
Формат - свободное обсуждение, где любой сможет задать свой вопрос и подключиться в прямом эфире поболтать с Кириллом и Женей.
Смотреть в прямом эфире и подключиться к обсуждению смогут все подписчики уровня "Расширенный", а позже запись будет опубликована на Boosty и Закрытом Telegram сообществе
#ии
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23❤5🆒5👍1🙏1
До 27 октября включительно на сайте ergostol.ru действует скидка –30% на этот эргономичный стол с электроприводом.
ANDROID10 можно получить ещё –10% на все товары в корзине.Что изменилось? Теперь стол стал ещё удобнее:
Terra R 2.0 — это стиль, надёжность и комфорт, которые легко вписываются в любой интерьер.
Реклама. ООО «СОФТЭФФЕКТ». ИНН 7735575262
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7👍6❤1
Что важного в новой версии:
🎉 Новое API: setRemoteSessionTimeoutMillis() в Configuration.Builder — задаёт время жизни сессии RemoteWorkManager после последнего использования.
class App : Application(), Configuration.Provider {
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
// Сколько живёт RemoteWorkManager-сессия после последнего использования
.setRemoteSessionTimeoutMillis(TimeUnit.MINUTES.toMillis(5))
.build()
}
}🎉 Тестирование: TestDriver.stopRunningWorkWithReason(...) — можно останавливать выполняющуюся работу с указанием причины.
Зачем: удобно эмулировать внешние условия (остановку системой/приложением) и проверять, что код корректно реагирует на «принудительное завершение».
// Arrange
val request = OneTimeWorkRequestBuilder<MyWorker>().build()
WorkManager.getInstance(context).enqueue(request).result.get()
// Act
val testDriver = WorkManagerTestInitHelper.getTestDriver(context)!!
testDriver.stopRunningWorkWithReason(
request.id,
/* reason */ 0 // укажите код причины, например ваш тестовый/константу из проекта
)
// Assert — далее проверяете ожидаемое состояние
🛠 Также сделали исправление багов
#android #jetpack #workmanager #jetpackupdate #androidjetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤4🔥3
🔥 Jetpack CameraX теперь разрабатывается вместе с командой камеры Pixel
Вышла первая альфа-версия Jetpack CameraX 1.6.0
Главное изменение — переход на унифицированный высокопроизводительный стек камеры, тот самый, что используется в приложении камеры Pixel. Этот стек известен как CameraPipe — и теперь CameraX и Pixel Camera развиваются совместно.
Новый стек принесёт:
👉 более быструю и стабильную инициализацию камеры,
👉 консистентную обработку фреймов,
👉 и улучшенную совместимость между устройствами.
Повод задуматься для миграции на CameraX для тех, кто не решался это сделать
#android #jetpack #androidjetpack #camerax #camera
Вышла первая альфа-версия Jetpack CameraX 1.6.0
Главное изменение — переход на унифицированный высокопроизводительный стек камеры, тот самый, что используется в приложении камеры Pixel. Этот стек известен как CameraPipe — и теперь CameraX и Pixel Camera развиваются совместно.
Новый стек принесёт:
👉 более быструю и стабильную инициализацию камеры,
👉 консистентную обработку фреймов,
👉 и улучшенную совместимость между устройствами.
Повод задуматься для миграции на CameraX для тех, кто не решался это сделать
#android #jetpack #androidjetpack #camerax #camera
🔥40🤯9❤6👍1
Взял самое свежее opensource приложения от разработчиков Android команды Google, разбирал его, исправлял и был в шоке от того как пишут. Таких разработчиков ИИ точно заменит либо помогал писать Gemini?
В видео найдете много пояснений что сделано плохо, как сделать лучше и главное - почему!
#AndroidBroadcast #codereview #прожарка #google #android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤4🤯4🤔2👍1
Forwarded from Kotlin Multiplatform Broadcast
Please open Telegram to view this post
VIEW IN TELEGRAM
❤27🔥13👍8🤯4
