🛠 Значительные переработки под капотом для улучшения поддержки KMP
👉 Добавлена поддержка обработки deep link из Kotlin Common кода
👉 Улучшения API
#jetpack #jetpackupdate #navigation #compose #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
🎉 Новый артефакт
lifecycle-viewmodel-testing
- KMP библиотека для тестирования ViewModel в изоляции с помощью ViewModelScenario👉 SavedStateHandle теперь может возвращать MutableStateFlow
👉 CreationExtras добавили перегрузки операторов in, +=, и +
Больше поддержки KMP
👉
lifecycle-testing
, lifecycle-viewmodel-savedstate
теперь полностью KMP библиотеки👉 LocalLifecycleOwner стал доступен из common кода
👉 ViewModelProvider.NewInstanceFactory теперь доступна для Android и JVM
#android #jetpack #jetpackupdate #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍5
Что нового:
👉 SavedState теперь полностью KMP библиотека с поддержкой Android, iOS, Linux, Mac и JVM
👉 LocalSavedStateRegistryOwner теперь не является частью Compose UI, а будет частью нового артефакта - savedstate-compose
👉 Появился обобщенный тип SavedState, который Bundle на Android и Map<String, Any> на других платформах
// Создаем SavedState с помощью DSL:
val savedState = savedState {
putInt("currentPage", 1)
putString("filter", "favorites")
}
val currentPage = savedState.read { getInt("currentPage") }
savedState.write { remove("currentPage") }
@Serializable
data class Person(val firstName: String, val lastName: String)
fun main() {
val person = Person("John", "Doe")
val encoded: SavedState = encodeToSavedState(person)
val decoded: Person = decodeFromSavedState(encoded)
}
saved
в Activity и ViewModelclass MyActivity : ComponentActivity() {
var person by saved { Person("John", "Doe") }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.person = Person("Jane", "Doe")
}
}
class MyViewModel(handle: SavedStateHandle) : ViewModel() {
var person by handle.saved { Person("John", "Doe") }
fun onPersonChanged(person: Person) {
this.person = person
}
}
#android #jetpack #jetpackupdate #kmp #kotlin #ios #desktop
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30👍9🤔5
Библиотека содержит CallsManager API (обертка над ConnectionService) для интеграции Telecom фреймворка в приложения со звонками через интернет, чтобы обеспечить использования всех фичей Android платформы! Это включает в себя:
👉 системные уведомления
👉 приоритезацию работы Foreground Service для звонка
👉 Интеграцию с Bluetooth
👉 Интеграцию с умными часами и автомобилями
👉 Упрощение вывода аудио на разные устройства
Различные функции добавляются через механизм расширений. Можете взять уже готовые или реализовать свои!
#android #jetpack #jetpackupdate #voip
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍7❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍18❤1
Используете Fragment в нативной Android разработке приложений?
Anonymous Poll
46%
Да, активно
25%
Только legacy код остался на них
1%
Не пишу нативно под Android
22%
Уже всё только на Compose
1%
Другой вариант
5%
Не участвую в опросе
👍6
App Functions - новая экспериментальная функция Android, которая позволит интегрироваться приложениям с поиском, но в первую очередь с AI, чтобы выполнять запросы пользователя. Например, "закажи еду", "вызови такси" и пр.
Возможности приложения будут индексироваться системным сервисом AppSearchManager
Точка входа - класс AppFunctionManager и специальный сервис AppFunctionService.
Уже также разрабатывается библиотека
#android16 #ai #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍6
Media is too big
VIEW IN TELEGRAM
Лучшие подходы к тестированию Android. Хосе Альсерреке расскажет о тестировании скриншотов, Robolectric, управлении разными форм-факторами и использовании Espresso Device и Gradle Managed Devices (GMD) для масштабируемого тестирования.
0:00 - Введение
0:19 - Что такое тестирование скриншотов?
1:30 - Зачем использовать тестирование скриншотов?
2:52 - Robolectric для тестирования
4:40 - Тестирование для разных размеров экрана
6:48 - Стабильность больших тестов
9:05 - Gradle Managed Devices
9:47 - ИИ и тестирование
10:19 - Заключение
Ресурсы:
🔗 Тестирование скриншотов
🔗 Стратегии Robolectric
🔗 Тестирование разных размеров экрана и окон
🔗 Тестирование приложений на Android
🔗 Стратегии тестирования
🔗 Основы тестирования Android-приложений
🔗 Локальные тесты
🔗 Инструментированные тесты
🔗 UI-тесты
🔗 Тестирование разных размеров экрана
#android #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Media is too big
VIEW IN TELEGRAM
Оптимизируйте тестирование Android с помощью масштабируемой стратегии, которая поможет управлять нагрузкой на тесты вашего приложения и конфигурациями устройств. От понимания пирамиды тестирования до использования таких инструментов, как Robolectric и Gradle Managed Devices, вы узнаете, как принимать обоснованные решения для повышения надежности и эффективности тестирования. Узнайте, почему ручного тестирования недостаточно, и как автоматизация может сэкономить время и улучшить качество кода.
0:00 - Введение
0:41 - Зачем мы тестируем?
1:21 - Стратегии тестирования
3:06 - Область применения vs. Размер
5:45 - Категории
7:49 - Заключение
🔗 Стратегии тестирования
#android #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Google выпустила первую стабильную версию Jetpack Health Connect Client — библиотеки, которая упрощает доступ к данным о здоровье и активности пользователя через платформу Health Connect.
Health Connect — это единый слой доступа к данным здоровья на Android. Он агрегирует информацию от разных приложений (Google Fit, Samsung Health, Fitbit и др.) и даёт централизованный, безопасный способ работы с ними.
Библиотека connect-client — это Jetpack-обёртка над этим API, которая делает интеграцию максимально простой и безопасной.
Что умеет Jetpack Health Connect Client 1.0:
👉 Читать и записывать данные: шаги, калории, пульс, сон, тренировки, вес и многое другое (всего 40+ типов данных)
👉 Запрашивать данные по временным диапазонам и фильтрам
👉 Управлять разрешениями на доступ к чувствительным данным — всё централизовано и прозрачно
👉 Удалять данные (в том числе выборочно)
👉 Поддерживает suspend-методы и удобные Kotlin API
Подробнее читайте в документации
#android #jetpack #wear
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍7
Passkey — это современный способ аутентификации, который позволяет пользователям входить в приложения и сайты без паролей, используя биометрию (Face ID, отпечаток пальца) или пин-код устройства.
Также в статье есть краткая инструкция и лучшие практики. Подробнее в документации
#android #passkey
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
Какие у вас отношения с технологией Passkey?
Anonymous Poll
45%
Что это?
37%
Слышал(а), но не использую
10%
Использую её, где есть поддержка
3%
Интегрировали в приложение
1%
Другой вариант
8%
Не участвую в опросе
👍7
Изменение размера страницы в памяти от 4 KB в 16 KB даст для приложений:
🚀 Ускорения запуска приложений
🔋 Сокращение расхода батареи
📷 Ускорение включения камеры
Новая требование Google Play обязует реализовать поддержку работы всех новых приложений и обновлений с targetSdk 35 (Android 15). Изменение вступает в силу с 1 ноября 2025 года
Что нужно делать
👉 Обновить библиотеки с нативынм кодом до версий с поддержку нового размера страницы
👉 Перекомпилировать свой нативный код на C/C++ с последней версией инструментов
В Google Play в AppBundle Explorer вы будете видеть совместимо ли ваше приложение cо страницей размера 16KB.
Полезные ссылки
🔗 Как адаптировать приложение
🔗 Как провести тестирование приложения на таком устройстве
🔗 Подробная документация по 16Kb page size
#android #googleplay #ndk
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27
Минусы повышения размера страницы памяти
⚠️ Мелкие объекты “тратят” больше памяти.
Если в 4 КБ-странице лежало 5 мелких объектов, в 16 КБ — может быть “пустого” пространства больше. Но в современных условиях прирост производительности важнее.
⚠️ Нужна поддержка от железа.
Процессор и ядро должны поддерживать размер страницы 16 КБ — это не просто «переключатель» в настройках.
#android #ndk
⚠️ Мелкие объекты “тратят” больше памяти.
Если в 4 КБ-странице лежало 5 мелких объектов, в 16 КБ — может быть “пустого” пространства больше. Но в современных условиях прирост производительности важнее.
⚠️ Нужна поддержка от железа.
Процессор и ядро должны поддерживать размер страницы 16 КБ — это не просто «переключатель» в настройках.
#android #ndk
🤔21👍14❤1
Очень классная статья от @nek_12_personal про лучшие практики для загрузки данных из UI, чтобы не выполнять лишнюю работу и не занимать ресурсы, когда UI не показывается
❌ Чего следует избегать
Запуск загрузки данных в блоке init может привести к устаревшей информации при возвращении пользователя к экрану после длительного отсутствия.
Такой подход может вызвать множественные параллельные запросы, что увеличивает нагрузку на систему и усложняет управление состоянием.
Сбор данных в viewModelScope без учёта видимости UI может привести к утечкам памяти и избыточному потреблению ресурсов.
Перенос логики загрузки данных в UI нарушает принцип разделения ответственности и усложняет архитектуру приложения.
Все подробности в статье, которую рекомендую вам изучить подробно!
🔗 Альтернативная ссылка
#kotlin #android #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
❤28👍12🤔12
Для конвертации холодного Flow в горячий StateFlow для работы с состоянием (обычно происходит в ViewModel) стоит использовать оператор Flow<T>.stateIn(), с заданием политики запуска SharingStarted.WhileSubscribed
flow..stateIn(
scope = viewModelScope,
initialValue, // задаём начальное значение
started = SharingStarted.WhileSubscribed(
stopTimeoutMillis = 5.seconds,
replayExpirationMillis = 5.seconds,
),
)
SharingStarted.WhileSubscribed() — умный способ включать сбор данных только когда есть подписчики, и автоматически останавливать его, когда они исчезают. Важно настроить несколько значений:
👉 Параметр
stopTimeoutMillis
- задаем какое время пройдет после того как пропадет последний подписчик чтобы остановить StateFlow. По умолчанию стоит 0 мс, но Google рекомендует выставлять 5 секунд. Это позволит не останавливать Flow при пересоздании UI при смене конфигурации или если пользователь быстро свернул/развернул приложений.👉 Параметр
replayExpirationMillis
- указывает через какое время после остановки сбросить кэш значений StateFlow и начать с начала, а именно initialValue
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
❤33👍20
Знали про необходимость использования WhileSubscribed в stateIn ?
Anonymous Poll
44%
Да
45%
Нет
3%
Не использую Flow/корутины
1%
Не пишу код/не пишу на Kotlin
1%
Другой вариант
6%
Не участвую в опросе
👍6
#android #jetpack #media3 #camerax
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍6