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

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

Размещение рекламы: @tanyasanovna
Download Telegram
Разбираем SOLID принципы с примерами на Kotlin
Практической пользы не много, но повторить перед собеседованием лишний раз будет полезно. Как относитесь к вопросам такого типа на собеседованих?
7🦄3👍1
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
🥴8👍4👎2
В последней стабильной Android Studio Ladybug Feature Drop стала доступна одна из полезнейших AI фичей по моему мнению - AI ренейминг. В отличии от остального это не AI генерация кода, а простой анализ и предложение по изменениям. А как вы относитесь к новым AI фичам?
🤔10🥰5🤷4
Разбираемся с новыми API камеры

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

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

Примеры интеграции внутри статьи!
👍6🔥2👀2
А что там с 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.* зависимости
🔥6👍5👏3
Что изменится в Android 16? Отмена ограничений по ориентации экрана и изменению размера окна

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

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

Что потестировать:
1) Как ведет себя состояние экрана при реконфигурации
2) Как ведет себя камера, если вы ее используете в приложении, при поворотах экрана
3) Удостовериться, что на экранах с большим количеством данных правильно выставлен скролл и все элементы доступны для пользователя
😱23🔥7👍4👎2
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. Кто-нибудь получил из вас доступ в альфу? Расскажите как оно!
👍10🔥3
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 с фиксом для кластеризации точек
👍52🔥2
Продакшн-реди Firebase SDK с генеративным ИИ на борту

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

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

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

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

👉 Можете рассказать о том, как стали частью команды Android Studio? Что вызвало у вас интерес к Android разработке?
👉 По вашему мнению, какая функция, реализованная командой Android Studio за последние годы, наиболее значимая и почему?
👉 Каким образом команда Android Studio следует постоянно меняющимся потребностям разработчиков?
👉 Какой вклад вносит команда Studio в видение Google относительно платформы Android?
👉 Если бы вы могли взмахнуть волшебной палочкой и добавить одну функцию мечты в экосистему Android, что бы это было и почему?
🔥3👍2👎1
Вроде только-только Android 15 зарелизили, а уже надо закладывать в беклог поддержку фичей из Android 16
😱4👍3
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
👍9🥱1
Разбираем использование 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 для асинхронных операций без блокировки главного потока.
😁14👍7🔥3👎1💔1
This media is not supported in your browser
VIEW IN TELEGRAM
Небольшая свежая библиотека KAnalytics (⭐️ 15)

Не сказал бы, что на этой стадии я бы стал её использовать, но она может быть хорошим примером того, как стоит держать аналитику в приложении: с удобным дебаггером, поддержкой KMP и без глубокой связности с основным приложением.
👍2
Разбираем, что происходит при нажатии кнопки "Старт" в 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: В комментариях уточнение по поводу сборки билда и выбора эмулятора от подписчика!
👍64😁1🤔1🤪1
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 сконвертирует иконку сразу в нужный формат в приложении
👍6🥱1
5 ошибок в корутинах о которых никто не говорит

Внутри разбор с примерами и объяснением почему это ошибка:
👉 Вызов suspend функции напрямую из вьюхи
👉 Некорректное использование GloablScope. В Android разработке его вообще некорректно использовать. Есть ли у вас примеры, когда это уместно?
👉 Последовательный, а не асинхронный запрос данных
👉 Вылов CancellationException внутри suspend функции
👉 В длительных цикличных операциях забываем про ensureActive()
👍12🔥4👏3
Частая проблема в проектах, где я работаю - синхронизация времени клиента и предотвращение перевода часов через настройки. А тут Google представляет TrustedTime API, который должен решить эту проблему наконец-таки.
Как использовать?

👉 Подключаем зависимость com.google.android.gms:play-services-time:16.0.1
👉 Создаем где-нибудь экземпляр

TrustedTime.createClient(context)

👉 Используем с фолбеком к стандартному способу

val currentTimeMillis =
myApp.trustedTimeClient?.computeCurrentUnixEpochMillis()
?: System.currentTimeMillis()


Под капотом синхронизация с Google серверами. Буду интегрировать в проект наряду с kotlinx-datetime
👍15🔥63