Android Good Reads
4.05K subscribers
359 photos
15 videos
1 file
2.1K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tanyasanovna
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Android XR SDK Developer Preview

Платформа для расширенной реальности теперь и на Android. Базируется так же, на open source - OpenXR. Все приложения на Android должны быть совместимы

Пощупать в эмуляторах можно тут, доступно для разработки начиная с Android Studio Meerkat
О разработке SDK

Что нужно помнить при работе с SDK, как делать не нужно:

👉 Разработка SDK != разработка клиентского приложения. Например, не стоит перехватывать UI у клиентского приложения, если внутри SDK возникла ошибка. Лучше, прокиньте состояние ошибки и дайте пользователям SDK самим решать как ее отобразить.
👉 Предоставление пользовательского интерфейса через SDK влечет за собой ряд проблем: Отсутствие гибкости, конфликты ресурсов, увеличение размера SDK и сложности в его обслуживании, а так же проблемы масштабируемости. Но если вам все-таки необходимо поставлять UI с SDK, то разделите свое SDK на 2 разных package: UI и Core Logic с возможностью их раздельного использования. Не забудьте про Analytics Hooks в UI модуле!
👉 Минимизируйте внешние зависимости. А если используете - то лучше всего их изолировать. Неприятно ради 1 библиотеки подключать RxJava и Lottie, для конвертации в свой формат. Не забывайте, что не все библиотеки предоставляют лицензию на использование в коммерческих целях, например, GPL лицензии
❗️Старайтесь избегать глобальных синглтонов. Неприятно, когда в приложении появляется утечка памяти, а я никак не могу на это повлиять, кроме как отказаться от вашего SDK.
👉 Пишите документацию и CHANGELOG

С какими неприятными последствиями спорных решений в SDK вы сталкивались?
Please open Telegram to view this post
VIEW IN TELEGRAM
Анонс Koin IDE Plugin

Что позволит делать плагин:
👉 Видеть все дерево зависимостей
👉 Навигация между компонентами

Валидация на уровне Koin делается в рантайме, но через плагин можно проверить валидность состояния с помощью статического анализа. Предварительная дата релиза - 1 квартал 2025
Разбираем Low Memory Management в Android: Kswapd & LMK

👉 Память в системе разделяется на RAM, zRAM и Storage(постоянная)
👉 RAM разделяется на Pages по 4KB. Каждый Page может быть used или unused.
used в свою очередь делится на Private, если им владеет только 1 процесс или Shared в ином случае
Так же used Page может быть Clean, если это копия данных из Storage и Dirty если это модифицированные данные

Само управление происходит с помощью двух механизмов:
👉 kswapd (kernel swap daemon) Удаляет Clean Pages и восстанавливает копию из хранилища. Сжимает и перемещает Dirty Pages в zRAM. Активируется при нехватки памяти и возвращает все как было, когда процесс, владеющей Page снова оживает.
👉 LMK (Low-memory killer) Удаляет процессы в порядке с приложенной таблицы, тем самым освобождая Pages ими владеющие.

Чуть подробнее про LMK внутри статьи или в этом видео
Android Good Reads
Android XR SDK Developer Preview Платформа для расширенной реальности теперь и на Android. Базируется так же, на open source - OpenXR. Все приложения на Android должны быть совместимы Пощупать в эмуляторах можно тут, доступно для разработки начиная с Android…
Android XR KMP

Добавить поддержку Android XR в ваше KMP приложение - легко! Две составляющих:
👉 Добавить зависимость
// shared/build.gradle.kts
sourceSets {
androidMain.dependencies {
implementation(libs.androidx.xr.compose)
implementation(libs.androidx.xr.compose.material3)
implementation(libs.androidx.xr.scenecore)
}
}

👉 Добавить expect / actual интерфейсы

iOS имплементация игнорируется, но предположу, что жизненные циклы достаточно сильно различаются чтобы вписать обе VR/AR платформы сразу
Цикл статей про Mockk и тесты
Не все согласны, что это хороший подход, но существующий и практикующий многими компаниями:

👉 Mockk и основы
👉 Mockk, продвинутое использование. Мокаем статик методы, синглтоны и final классы
👉 Unit-тестирование Android компонентов
👉 Мокаем suspend функции и flow
👉 Пишем поддерживаем и читаемый код в тестах с Mockk

А вы мокаете данные в тестах?
Оптимизируем LazyList в 1 строчку.

Если кратко, то используем key:
LazyColumn {
items(items = yourList, key = { it.id }) { item ->
// Your item UI here
Text(text = item.name)
}
}


Получаем:
👉 Улучшение перфоманса при рекомпозиции
👉 Нормальный контроль над состоянием элементов

Следите чтобы ключи были уникальными!
Эволюция архитектурных паттернов

👇 UI-центричная архитектура или God Activity
👇 MVC. Выделили логику в контроллер
👇 MVP. Добавили интерфейсов меж слоями
👇 MVVM. Изоляция UI и реактивщина
👇 MVI и начало эры UDF
👉 Постепенное упрощение MVI с дроблением reduce функции. TEA, как хороший пример

Внутри статьи примеры с каждым этапом. Кому-то посмотреть как было раньше, кому-то понастольгировать
Шпаргалка по размещению Composable элементов

Подробнее про Arrangement с примерами можно глянуть тут
Про центрирование и растягивание тут
Смотрим начинку ViewModel

👉 Основная логика лежит в ViewModelImpl (можно посмотреть тут)
👉 isCleared, Простой флаг указывающий на состояние viewModel. Много функций завязано на нем
👉 closeables, keyToCloseables, addCloseable(). Все призвано для управления AutoCloseable ресурсами (Что за AutoCloseable?)
👉 clear() Подчищает эти самые ресурсы

Как думаете, что мы чаще всего добавляем в addCloseable()? Правильно - viewModelScope, который в свою очередь является наследником AutoCloseable и CoroutineScope, которая останавливается по закрытию viewModel.


internal fun createViewModelScope(): CloseableCoroutineScope {
// dispatcher initialization
return CloseableCoroutineScope(coroutineContext = dispatcher + SupervisorJob())
}

internal class CloseableCoroutineScope(
override val coroutineContext: CoroutineContext,
) : AutoCloseable, CoroutineScope {

constructor(coroutineScope: CoroutineScope) : this(coroutineScope.coroutineContext)

override fun close() = coroutineContext.cancel()
}
Разбираемся с CameraX в Jetpack Compose

Первая часть тут. В ней базовая настройка камеры и превью для камеры. Иными словами - Getting Started гайд из документации.
Что же подчерпнуть из этой части? Если вы не знаете как сделать tap-to-focus фичу

Полный пример фичи тут. А объяснение кода внутри статьи
Разбираем SOLID принципы с примерами на Kotlin
Практической пользы не много, но повторить перед собеседованием лишний раз будет полезно. Как относитесь к вопросам такого типа на собеседованих?
3 простых анимации на Jetpack Compose, которые сделают твою фичу на следующем демо красивее

👉 Fade in - Fade out

@Composable
fun FadeAnimationDemo() {
var isVisible by remember { mutableStateOf(true) }

Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
AnimatedVisibility(
visible = isVisible,
enter = fadeIn(),
exit = fadeOut()
) {
Text("Hello Jetpack Compose!", style = MaterialTheme.typography.h4)
}
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { isVisible = !isVisible }) {
Text("Toggle Visibility")
}
}
}


👉 Scale

@Composable
fun ScaleAnimationDemo() {
var isScaled by remember { mutableStateOf(false) }

val scale by animateFloatAsState(
targetValue = if (isScaled) 1.5f else 1f,
animationSpec = tween(durationMillis = 500)
)
Box(
modifier = Modifier
.fillMaxSize()
.clickable { isScaled = !isScaled },
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier
.size(100.dp)
.graphicsLayer(scaleX = scale, scaleY = scale)
.background(Color.Blue, shape = CircleShape)
)
}
}


👉 Crossfade можно глянуть внутри статьи. Не соглашусь, что это хороший вариант для анимирования перехода между экранами. Я бы использовал SharedTransition, но, видимо, сложность интеграции не в рамках 1 Composable функции выбило его из списка простых.

Чуть более содержательная дока по анимации: https://developer.android.com/develop/ui/compose/animation/quick-guide
В последней стабильной Android Studio Ladybug Feature Drop стала доступна одна из полезнейших AI фичей по моему мнению - AI ренейминг. В отличии от остального это не AI генерация кода, а простой анализ и предложение по изменениям. А как вы относитесь к новым AI фичам?
Разбираемся с новыми API камеры

Доступны они в Camera2 и CameraX:

👉 Night. Привычная для всех приложений-камер ночная съемка. Делает под капотом несколько снимков, чтобы позже выдать финальное изображение в хорошем качестве
👉 Bokeh. Размытие заднего фона и выделение обьектов на переднем фоне.

Примеры интеграции внутри статьи!
А что там с Compose?
Вышел первый в 2025 году Compose BOM, 2025.01.00 - для альфа, бета и релизной версии. НО, релизный BOM совпадает с прошлогодним 2024.12.01, не обманываемся 🧐

1.8.0-alpha08 Compose вышла, вот немного изменений:
👉 AutoSize -> TextAutoSize, и теперь можно делать свою имплементацию
👉 Исправлено большое количество багов с focus, станет ли проще на Android TV?
👉 AnnotatedString.fromHtml() поддерживает неупорядочные списки из HTML (<ul> и <li>)
👉 Compose Material и Material 3 теперь всегда включают displayCutout (вырез камеры) по дефолту в каждые отступы
👉 Compose Material3 выпустила версию 1.4.0-alpha06 с новым floating toolbar.
👉 Помимо всего прочего обновили некоторые другие androidx.* зависимости
Что изменится в Android 16? Отмена ограничений по ориентации экрана и изменению размера окна

Кратко - много боли для тех, кто не делает адаптивный дизайн приложения. C Android 16 будут игнорироваться значения:
👉 screenOrientation: portrait, reversePortrait, sensorPortrait, userPortrait, landscape, reverseLandscape, sensorLandscape, userLandscape. Ограничить ориентацию програмно тоже нельзя
👉 resizeableActivity, minAspectRatio, maxAspectRatio. Будьте готовы что приложение может поплыть

Хорошая новость: Эти изменения не затронут девайсы с экраном меньше sw600dp

Что потестировать:
1) Как ведет себя состояние экрана при реконфигурации
2) Как ведет себя камера, если вы ее используете в приложении, при поворотах экрана
3) Удостовериться, что на экранах с большим количеством данных правильно выставлен скролл и все элементы доступны для пользователя