🔒 Почему шифрование данных на Android — это не просто “галочка” в настройках, а реальная защита вашей информации (RU,13м)
Телефон сегодня — это не просто устройство, а личный сейф с фотографиями, паролями, документами и банковскими данными. И если кто-то получит к нему доступ, последствия могут быть непредсказуемыми.
В статье на Хабре я подробно рассказываю:
👉 как работает шифрование данных на Android;
👉 чем отличаются симметричные и асимметричные алгоритмы;
👉 какие инструменты реально применяются в приложениях — Cipher, SQLCipher и Android Keystore;
👉 почему офлайн-режим может стать дополнительным уровнем безопасности;
👉 и при чём тут ГОСТ-шифрование 👀
Классная статья для тех кто не копался в шифрование и хочет в это погрузиться хотя бы на базовом уровне
#android #безопасность
Телефон сегодня — это не просто устройство, а личный сейф с фотографиями, паролями, документами и банковскими данными. И если кто-то получит к нему доступ, последствия могут быть непредсказуемыми.
В статье на Хабре я подробно рассказываю:
👉 как работает шифрование данных на Android;
👉 чем отличаются симметричные и асимметричные алгоритмы;
👉 какие инструменты реально применяются в приложениях — Cipher, SQLCipher и Android Keystore;
👉 почему офлайн-режим может стать дополнительным уровнем безопасности;
👉 и при чём тут ГОСТ-шифрование 👀
Классная статья для тех кто не копался в шифрование и хочет в это погрузиться хотя бы на базовом уровне
#android #безопасность
👍32❤7🔥2🤔1🤯1
Forwarded from Mobius — канал конференции
#видеозаписи #МобильныйВторник
Открываем новую видеозапись выступления:
Александр Газаров — Семантический Gradle: публикуем артефакты со спокойствием и уверенностью
😉 YouTube | 📺 VK Видео
Скачать презентацию с сайта Mobius
Открываем новую видеозапись выступления:
Александр Газаров — Семантический Gradle: публикуем артефакты со спокойствием и уверенностью
Скачать презентацию с сайта Mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Александр Газаров — Семантический Gradle: публикуем артефакты со спокойствием и уверенностью
Подробнее о конференции Mobius: https://jrg.su/ojGU3B
— —
Скачать презентацию с сайта Mobius — https://jrg.su/WtQzks
Приходилось ли когда-нибудь развивать библиотечный проект и публиковать из него артефакты? Команде Александра пришлось, когда появилась своя…
— —
Скачать презентацию с сайта Mobius — https://jrg.su/WtQzks
Приходилось ли когда-нибудь развивать библиотечный проект и публиковать из него артефакты? Команде Александра пришлось, когда появилась своя…
👍10🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
#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 обсуждает 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👍5❤2
Media is too big
VIEW IN TELEGRAM
🎙 Проводит — Алексей Панов @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👍14❤4
Одна из частых ошибок при использовании 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🤔26❤19🤯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 #карьера #резюме #разбор
Автоматические системы ATS (Applicant Tracking Systems) решают, дойдёт ли ваше резюме до HR — и даже если вы сильный разработчик, неудачное форматирование или отсутствие нужных ключевых слов может похоронить заявку.
🧠 Сервисы анализа резюме под ATS помогают понять, насколько ваше резюме «читаемо» для таких систем. Вот самые популярные и проверенные инструменты:
👉 jobscan.co
👉 resumeworded.com
👉 skillsyncer.com
👉 topresume.com
👉 rezi.ai
🎯 Что важно для прохождения ATS:
- Простая и понятная структура
- Без графики, таблиц, сложных шрифтов
- Ключевые слова из описания вакансии
- Формат: предпочтительно DOCX (PDF допустим, если без сложной верстки)
- Используйте стандартные заголовки: «Проекты», «Опыт работы», «Образование», «Сертификации» и т.п.
#AndroidBroadcast #карьера #резюме #разбор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍4🙏3🤯2❤1
В исходниках можно найти такие шедевры 👇
// Проверяет используется ли сейчас 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). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же❗️ Баг: при переходе в папку навигация срабатывает, 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👍86🤔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
👍24❤11🔥4🤔3
Используете RoboScripts в Google Play Pre-laucnсh testing?
Anonymous Poll
1%
Да
17%
Нет
63%
Что такое Robonoscripts?
11%
Что такое Play Pre-laucnсh testing?
1%
Другой вариант
6%
Не участвую в опросе
👍2❤1
Когда вы загружаете сборку в Альфа или Бета канал Google Play, сервис автоматически запускает
⚙️ 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-тесты можно запускать и в 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🔥25👍13❤3
Android Broadcast
#kmp #swift #native
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤6🔥5🤔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
🔥21👍7❤2
Если хотите адаптировать приложение под 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
👍18🔥2🤔1
Когда: Четверг, 23 октября, 19:00 (GMT+3)
В последнее время я очень много читал материалов на тему применения ИИ технологий во всём цикле разработки приложений в Surf. Накопилось много вопросов и пригласил эксперта компании. Surf развивала и популяризировала Flutter, всегда интегрирую свежие подходы в проекты студии и вот сейчас ИИ.
Формат - свободное обсуждение, где любой сможет задать свой вопрос и подключиться в прямом эфире поболтать с Кириллом и Женей.
Запись эфира доступна на
#ии
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26❤7🆒5👍1🙏1