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

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

Размещение рекламы: @tanyasanovna
Download Telegram
Смотрим начинку 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) Удостовериться, что на экранах с большим количеством данных правильно выставлен скролл и все элементы доступны для пользователя
Koin Roadmap 2025

Не очень давно релизнулась версия Koin 4.0.2. Нам на проекте пришлось провести большую работу в связи с этим, но ребята из команды Koin говорят о кратном ускорении компиляции 5m16 -> 3m17 с этим обновлением. Значит это стоило того!

Так же докладывают о росте комьюнити (+60% загрузок) , наибольший рост у Compose Multiplatform (в 288%). Поэтому, первый приоритет в упрощение интеграции Koin для CMP / KMP проектов. Уже с версии 4.1 доступна KoinMultiplatformApplication, как единая точка входа для инъекции зависимостей.

Вторым фокусом будет, естественно, улучшение работы с Compose. Динамические параметры, поддержка жизненного цикла Composable элементов и, конечно, улучшения по части перфоманса.

Помимо этого: Скоупы, Koin DSL, Koin Annotations 2.0, а так же более глубокая поддержка ktor3. По аналогии с KLIP, команда запустила KFIP - Koin Features & Improvements Proposals.
Ну а я буду ждать публичный релиз Koin IDE plugin. Кто-нибудь получил из вас доступ в альфу? Расскажите как оно!
This media is not supported in your browser
VIEW IN TELEGRAM
Про Compose!

👉 Compose Multiplatform получила релиз 1.8.0-alpha02. Внутри в основном багфиксы и поддержка drag-and-drop для iOS
👉 Как запустить анимацию одновременно для 2 элементов?
👉 Можно ли двигать элементы по своему, когда открываем IME (клавиатуру)?

Свежие библиотеки:
- MediaPlayer для KMP, на андроиде под капотом exoplayer (media3). kdroidFilter / Compose-Media-Player
- mejdi14 / KMP-Searchable-Dropdown. Я не большой фанат такого рода библиотек, но данная лицензия позволяет вам заглянуть в исходник и утащить важную часть имплементации к себе в проект
- nassendelft / compose-win9x-theme Лучшее! Вышло обновление для библиотеки позволяющее натянуть тему win9x на ваше приложение.
- Обновление для compose-maps с фиксом для кластеризации точек
Продакшн-реди Firebase SDK с генеративным ИИ на борту

Можно получить доступ к моделям Google Gemini Cloud напрямую из приложения, а как это сделать лучше?

👉 Firebase App Check, во избежание злоупотребления вашим API из приложения
👉 Remote Config для динамического подкидывания используемых моделей
👉 Google Analytics для отслеживания использования

Не забудьте обновить Privacy policy о том как вы используете данные. Гугл обещает не обучать модель на ваших данных, полученных через SDK!
Интервью с менеджером по продукту Android Studio

Почему это интересно? Понимание того, кем развивается главный инструмент в Android разработке может указать куда будет двигаться продукт. Внутри такие вопросы:

👉 Можете рассказать о том, как стали частью команды Android Studio? Что вызвало у вас интерес к Android разработке?
👉 По вашему мнению, какая функция, реализованная командой Android Studio за последние годы, наиболее значимая и почему?
👉 Каким образом команда Android Studio следует постоянно меняющимся потребностям разработчиков?
👉 Какой вклад вносит команда Studio в видение Google относительно платформы Android?
👉 Если бы вы могли взмахнуть волшебной палочкой и добавить одну функцию мечты в экосистему Android, что бы это было и почему?
Вроде только-только Android 15 зарелизили, а уже надо закладывать в беклог поддержку фичей из Android 16
Forwarded from Android Live 🤖
Что нового в Android 16?
#android #google

Что же, в этом году нас ждёт свежий Android, и к его нововведениям стоит подготовиться. Давайте разберём основные изменения, опираясь на официальную документацию Google.

🔴Progress-centric Notifications — фактически аналог Live Activities на iOS, где теперь у нас добавляется Notification.ProgressStyle для отображения прогресса текущего процесса. Полезно для приложений с загрузками, доставками и навигацией. Выглядит здорово, одобряем.

🔴Predictive back updates — новые API для предсказуемого поведения жестов "назад". Теперь onBackInvokedCallback позволяет точнее обрабатывать нажатия. Пока неясно, насколько это улучшит UX — навигация жестами и так работает достаточно стабильно.

🔴Richer Haptics — более классная обработка haptic-эффектов. В VibrationEffect.Compositions, добавили более точную настройку вибрационных эффектов. Одобряю, очень мало приложений хорошо используют haptic-эффект.

🔴System-triggered profiling — обновлённый ProfilingManager, появившийся в Android 15, теперь собирает ещё больше данных о производительности приложений. Не тестировал, если пробовали — расскажите, как вам?

🔴Better job introspection — полезное обновление, призванное улучшить дебаг запущенных Job. Теперь можно просматривать их историю и анализировать причины задержек или неудачного выполнения. Круто.

🔴Photo picker improvements — Google активно продвигает использование Photo Picker, а в новой версии API добавляет Embedded Photo Picker который делает выбор изображений ещё более естественным и встроенным в приложение. Отличное обновление.

🔴Vertical text — небольшая, но любопытная доработка: теперь Paint поддерживает вертикальный текст. Не знаю, можно ли было раньше сделать это без библиотек, но Google решил это подстветить как фичу. Подсвечу и я.

Тут только некоторые из фичей, хотя и основные, а все можно увидеть тут.
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбираем использование runBlocking в Android

👉 Что такое runBlocking?
Функция, которая запускает новую корутину и блокирует текущий поток до её завершения.
Часто используется в примерах для демонстрации корутин в main() функции.

👉 Почему стоит быть осторожным с runBlocking в Android?
Блокирует текущий поток, что на Android может привести к замораживанию UI и возникновению ANR (Application Not Responding).
Особенно критично при выполнении операций ввода-вывода в главном потоке.

👉 Пример неправильного использования:
class MainViewModel(private val mainRepository: MainRepository) : ViewModel() {
// Не рекомендуется
private fun fetchPosters() = runBlocking {
mainRepository.fetchPosters()
}
}

В этом примере runBlocking блокирует главный поток, что может привести к проблемам с отзывчивостью приложения.

👉 Альтернативы:
Используйте viewModelScope для запуска корутин, что обеспечивает автоматическую отмену задач при уничтожении ViewModel.
Применяйте launch или async для асинхронных операций без блокировки главного потока.
This media is not supported in your browser
VIEW IN TELEGRAM
Небольшая свежая библиотека KAnalytics (⭐️ 15)

Не сказал бы, что на этой стадии я бы стал её использовать, но она может быть хорошим примером того, как стоит держать аналитику в приложении: с удобным дебаггером, поддержкой KMP и без глубокой связности с основным приложением.
Разбираем, что происходит при нажатии кнопки "Старт" в Android Studio

Или как собрать и запустить приложение без Android Studio:

👉 Генерируем APK-файл
./gradlew assembleDebug

👉Запуск эмулятора
emulator -list-avds
emulator -avd <имя_эмулятора>

👉 Установка APK
adb install -r app/build/outputs/apk/debug/app-debug.apk

👉 Запуск
adb shell am start -n <package_name>/<activity_name>

UPD: В комментариях уточнение по поводу сборки билда и выбора эмулятора от подписчика!
Android Good Reads
Про Compose! 👉 Compose Multiplatform получила релиз 1.8.0-alpha02. Внутри в основном багфиксы и поддержка drag-and-drop для iOS 👉 Как запустить анимацию одновременно для 2 элементов? 👉 Можно ли двигать элементы по своему, когда открываем IME (клавиатуру)?…
Продолжаем про Compose!

👉 Можно ли сделать скролл чуть медленнее и плавнее? Да, с помощью NestedScrollConnection
👉 Почему ContextualFlowRow депрекейтнули? Начиная с Jetpack Compose 1.8 beta01 множество api выходит из статуса experimental, однако часть уезжает сразу в Deprecated

👉 Пачка зависимостей получила обновление:

androidx.lifecycle:lifecycle-runtime-compose:2.9.0-alpha09
androidx.lifecycle:lifecycle-runtime-compose-android:2.9.0-alpha09
androidx.lifecycle:lifecycle-runtime-compose-jvmstubs:2.9.0-alpha09
androidx.lifecycle:lifecycle-runtime-compose-linuxx64stubs:2.9.0-alpha09
androidx.lifecycle:lifecycle-viewmodel-compose:2.9.0-alpha09
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.0-alpha09
androidx.lifecycle:lifecycle-viewmodel-compose-desktop:2.9.0-alpha09
androidx.navigation:navigation-compose:2.8.6
androidx.navigation:navigation-compose:2.9.0-alpha05
androidx.navigation:navigation-fragment-compose:2.8.6
androidx.navigation:navigation-fragment-compose:2.9.0-alpha05
androidx.savedstate:savedstate-compose:1.3.0-alpha07
androidx.savedstate:savedstate-compose-android:1.3.0-alpha07
androidx.savedstate:savedstate-compose-jvmstubs:1.3.0-alpha07
androidx.savedstate:savedstate-compose-linuxx64stubs:1.3.0-alpha07


👉 Полезный плагин: Figma to Jetpack Compose Icon сконвертирует иконку сразу в нужный формат в приложении