Android Broadcast – Telegram
Android Broadcast
14.4K subscribers
3.68K photos
367 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
🔒 Почему шифрование данных на Android — это не просто “галочка” в настройках, а реальная защита вашей информации (RU,13м)

Телефон сегодня — это не просто устройство, а личный сейф с фотографиями, паролями, документами и банковскими данными. И если кто-то получит к нему доступ, последствия могут быть непредсказуемыми.

В статье на Хабре я подробно рассказываю:
👉 как работает шифрование данных на Android;
👉 чем отличаются симметричные и асимметричные алгоритмы;
👉 какие инструменты реально применяются в приложениях — Cipher, SQLCipher и Android Keystore;
👉 почему офлайн-режим может стать дополнительным уровнем безопасности;
👉 и при чём тут ГОСТ-шифрование 👀

Классная статья для тех кто не копался в шифрование и хочет в это погрузиться хотя бы на базовом уровне

#android #безопасность
👍327🔥2🤔1🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
🔨 Написание UI тестов на обычном языке без кода уже доступно в Android Studio Otter. Фича называется - Journeys. Работает на основе ⭐️ Gemini AI

#androidstudio #android #ai #gemini #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
30🤯21🔥9👍5
Media is too big
VIEW IN TELEGRAM
📹 Android Developers Backstage — Journeys в Android Studio

Команда Android обсуждает Journeys для Android Studio — новый инструмент на базе Gemini, который упрощает создание и поддержку end-to-end тестов.
Journeys позволяет описывать тесты на естественном языке, а ИИ сам преобразует шаги и проверки в реальные действия в вашем приложении.

⏱️ Главные моменты выпуска:
0:00 Введение
1:46 Journeys: новый подход к тестированию на базе ИИ
3:40 Как Journeys работает с Gemini
4:27 Преимущества естественного языка
5:49 Пример из реального проекта: Google Maps
6:53 Отладка с использованием ИИ
8:08 Почему Journeys важен: мост между ручным и автотестированием
9:56 End-to-End тесты с Journeys
12:18 Производительность и кеширование тестов
24:14 Интеграция с Android Studio и Firebase
25:27 Рабочий процесс разработки
31:22 ИИ для всех: не только end-to-end тесты
33:28 Что дальше: обратная связь и планы на будущее

#android #androidstudio #gemini #ai #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍52
Media is too big
VIEW IN TELEGRAM
📹 Собеседование на Kotlin Multiplatform разработчика
🎙 Проводит — Алексей Панов @kotlin_adept
🗓 Понедельник, 20 октября, 19:00 (GMT+3)

Kotlin Multiplatform (KMP) набирает всё большую популярность — растёт количество вакансий и интерес со стороны компаний.

Я давно хотел провести реальное собеседование, где Android-разработчика с опытом в KMP будут спрашивать на позицию, где придётся писать на KMP каждый день:
иногда с использованием Compose, а иногда — только шаря логику между платформами.

Будет жарко 🔥
Алексей — один из самых опытных разработчиков, кто давно пишет KMP в проде и отлично понимает экосистему.

Кстати, у него классный Telegram-канал @kotlin_adept — там много полезных инсайтов про KMP.

❗️Запись собеседования появится на канале после эфира.

#AndroidBroadcast #kmp #compose #собеседование #android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥46👍144
‼️ Не тяните зависимости из графа сразу!

Одна из частых ошибок при использовании DI — получать все зависимости из графа сразу (например, в конструкторе класса).
Так делать не стоит 😬

Получение зависимости из графа — это каскадный процесс, и он должен выполняться только в момент использования.
Поэтому я всегда рекомендую инжектить зависимости для Dagger/Hilt через Lazy (не путайте с kotlin.Lazy) или Provider.
class ViewModel @Inject constructor(
// Зависимость получается из графа сразу при создании
private val useCase: DataUseCase,

// Получаем зависимость из графа каждый раз при обращении Provider.get()
private val useCaseFactory: Provider<DataUseCase>,

// Получаем зависимость из графа при первом обращении
// и затем она кэшируется в Lazy объекте
private val useCaseLazy: Lazy<DataUseCase>,
)


💡 Чтобы перейти на Lazy без боли в существующем коде — можно использовать делегаты свойств в Kotlin:
// Вариант использования без Lazy
class ViewModel @Inject constructor(
private val useCase: DataUseCase
)

// Миграция на Lazy без потери API совместимости
class ViewModel @Inject constructor(
useCaseFactory: Lazy<DataUseCase>,
) {
private val useCase: DataUseCase by useCaseFactory
}

И небольшой хелпер, чтобы это работало красиво 👇
// Функция расширения для использования property делегата
operator fun <T> Lazy<T>.getValue(thisRef: T, property: KProperty<*>): T = get()

Таким образом, вы снижаете нагрузку на DI граф, откладываете инициализацию и избегаете ненужных каскадов при старте компонентов.

#di #dagger #hilt #лучшиепрактики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍88🤔2619🤯11
🤯 Более 75% резюме отфильтровываются ещё до того, как их увидит человек.

Автоматические системы ATS (Applicant Tracking Systems) решают, дойдёт ли ваше резюме до HR — и даже если вы сильный разработчик, неудачное форматирование или отсутствие нужных ключевых слов может похоронить заявку.

🧠 Сервисы анализа резюме под ATS помогают понять, насколько ваше резюме «читаемо» для таких систем. Вот самые популярные и проверенные инструменты:
👉 jobscan.co
👉 resumeworded.com
👉 skillsyncer.com
👉 topresume.com
👉 rezi.ai

🎯 Что важно для прохождения ATS:
- Простая и понятная структура
- Без графики, таблиц, сложных шрифтов
- Ключевые слова из описания вакансии
- Формат: предпочтительно DOCX (PDF допустим, если без сложной верстки)
- Используйте стандартные заголовки: «Проекты», «Опыт работы», «Образование», «Сертификации» и т.п.

🪙 А как сделать резюме, которое действительно работает, я подробно разобрал в видео на Boosty — с реальными примерами и разбором ошибок. Свое мнение касательно 10 разных резюме озвучила Вишневская Ирина - HR-эксперт с почти 18-летним опытом в сфере управления персоналом и IT-рекрутмент

#AndroidBroadcast #карьера #резюме #разбор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍4🙏3🤯21
🤖 Есть ли чувство юмора у разработчиков Android SDK? Однозначно — да!

В исходниках можно найти такие шедевры 👇
// Проверяет используется ли сейчас 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
51👍21🤯3
Вот реальная история, как знание механики работы ViewModel спасло мне вечер 👇

У меня приложение на Compose и Jetpack Navigation 3 (работает на основе состояния Back Stack). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же ViewModel.❗️Баг: при переходе в папку навигация срабатывает, UI не меняется. Современные ИИ подсказали общие вещи, но не помогли — промты, видимо, подвели (тут мне ещё надо прокачать знания) 🙂

Вспомнил ключевой факт про архитектуру:
👉 Все 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 вы реально привязаны.

Рекомендую посмотреть мои видео по теме:
📹 Разбор Jetpack Navigation 3
🪙 Полный разбор Jetpack ViewModel в Android и Kotlin Multiplatform

#android #compose #androidjetpack #viewmodel #архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍86🤔10🤯52🔥2
🤯 А что вообще считать маленьким проектом в 2025 году?

В закрытом чате обсуждали, какого ноутбука хватит под «маленький KMP-проект» — но вот с тем, что считать маленьким, договориться не смогли.

Приложение с тремя экранами, но двенадцатью Gradle-модулями — это ещё маленькое?
KMP, но «только чуть-чуть под iOS» — считается?
Или когда просто хотел попробовать Compose, а закончил с DI, Router и UseCase на одну строчку логики?

В чём вообще измерять размер проекта — в строках кода, количестве модулей, экранах, фичах или времени сборки?

У меня есть мнение, но интересно, где проходит грань у вас 😏
Комментарии открыты — давайте поругаемся конструктивно.

#архитектура #android #kmp
🤯21👍124
🤖 Как проверить, какие комбинации фичей поддерживает камера смартфона

Современные смартфоны умеют снимать с 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
👍2411🔥4🤔3
🤖 Как автоматически проверить приложение перед публикацией в Google Play?

Когда вы загружаете сборку в Альфа или Бета канал Google Play, сервис автоматически запускает 🛒 Pre-launch Tests — набор проверок, которые выполняются на реальных устройствах в облаке Google. Цель этих тестов — убедиться, что приложение запускается, не падает и корректно отображается на разных экранах ещё до того, как его увидят тестировщики или пользователи. По сути, тест проходит “прокликивая” интерфейс, имитируя действия пользователя, переходя по кнопкам и ссылкам, чтобы найти проблемы вроде ANR, крашей или неправильного поведения UI. Как результат вы можете увидеть как проходило прокликивания, преддложения по улучшениям UI и лучше проверить качество приложения перед отправкой его конечным пользователям.

⚙️ Robo noscript - 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 noscript не получится прогнать локально (либо я не знаб о такой возможности)
Те же Robo-тесты можно запускать и в Firebase Test Lab. Это позволит проверить приложение на большем количестве устройств и версий Android, а также встроить прогон в CI/CD — например, через GitHub Actions или Firebase CLI.

⚙️ Будет ли работать с Compose?
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🔥25👍133
Android Broadcast
📹 Собеседование на Kotlin Multiplatform разработчика 🎙 Проводит — Алексей Панов @kotlin_adept 🗓 Понедельник, 20 октября, 19:00 (GMT+3) Kotlin Multiplatform (KMP) набирает всё большую популярность — растёт количество вакансий и интерес со стороны компаний.…
🏝 Леша Панов @kotlin_adept поделился материалами для углублённого изучения KMP, которые помогут вам глубже разобраться в принципах работы Kotlin Multiplatform и Kotlin Native, а также лучше понять нюансы интеропа со Swift-кодом.

❗️ Подробности в канале Леши

#kmp #swift #native
Please open Telegram to view this post
VIEW IN TELEGRAM
👍226🔥5🤔1
Media is too big
VIEW IN TELEGRAM
Samsung представила Galaxy XR - шлем дополненной реальности. Аналог Apple Vision Pro но стоить будет 1800$ в США (в 2 раза дешевле устройства Apple)

Работает шлем на чипе Qualcomm а ОС - Android XR с Google сервисами. Можно запускать приложения как с адаптацией под XR, так и без неё.

Мнение автора:
Дорогая игрушка, которая будет нишевым устройством и скатится туда же куда и Vision. XR хочется видеть на очках, а нне шлемах.


#android #samsung #androidxr
🔥21👍72
Если хотите адаптировать приложение под 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥2🤔1
🪙 LIVE Обсуждаем опыт интеграции ИИ в разработку в студии Surf
Когда: Четверг, 23 октября, 19:00 (GMT+3)

В последнее время я очень много читал материалов на тему применения ИИ технологий во всём цикле разработки приложений в Surf. Накопилось много вопросов и пригласил эксперта компании. Surf развивала и популяризировала Flutter, всегда интегрирую свежие подходы в проекты студии и вот сейчас ИИ.

Формат - свободное обсуждение, где любой сможет задать свой вопрос и подключиться в прямом эфире поболтать с Кириллом и Женей.

❗️Гость толк шоу - Женя Сатуров @saturov_stroit_komandu, Mobile CTO в Surf. За 10+ лет в мобильной разработке прошёл путь от стажёра до СТО. Один из основателей русскоязычного Flutter-сообщества и энтузиаст кроссплатформы. В данный момент занимаюсь внедрением AI в SDLC.

Запись эфира доступна на 🪙 Boosty

#ии
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥267🆒5👍1🙏1