Koin Roadmap 2025
Не очень давно релизнулась версия Koin 4.0.2. Нам на проекте пришлось провести большую работу в связи с этим, но ребята из команды Koin говорят о кратном ускорении компиляции 5m16 -> 3m17 с этим обновлением. Значит это стоило того!
Так же докладывают о росте комьюнити (+60% загрузок) , наибольший рост у Compose Multiplatform (в 288%). Поэтому, первый приоритет в упрощение интеграции Koin для CMP / KMP проектов. Уже с версии 4.1 доступна
Вторым фокусом будет, естественно, улучшение работы с Compose. Динамические параметры, поддержка жизненного цикла
Помимо этого: Скоупы, Koin DSL, Koin Annotations 2.0, а так же более глубокая поддержка ktor3. По аналогии с KLIP, команда запустила KFIP - Koin Features & Improvements Proposals.
Ну а я буду ждать публичный релиз Koin IDE plugin. Кто-нибудь получил из вас доступ в альфу? Расскажите как оно!
Не очень давно релизнулась версия 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. Кто-нибудь получил из вас доступ в альфу? Расскажите как оно!
Medium
Koin Framework 2025 Roadmap: From 4.0 to Future Milestones
this article outlines the current status of Koin 4.0 and previews the exciting developments planned for 2025 — Koin 4.1 & 4.2
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 с фиксом для кластеризации точек
👉 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!
Можно получить доступ к моделям Google Gemini Cloud напрямую из приложения, а как это сделать лучше?
👉 Firebase App Check, во избежание злоупотребления вашим API из приложения
👉 Remote Config для динамического подкидывания используемых моделей
👉 Google Analytics для отслеживания использования
Не забудьте обновить Privacy policy о том как вы используете данные. Гугл обещает не обучать модель на ваших данных, полученных через SDK!
Android Developers Blog
Production-ready generative AI on Android with Vertex AI in Firebase
Best practices to prep your Gemini feature for production such as implementing App Check, using Remote Config, gathering user feedback, and more.
Интервью с менеджером по продукту Android Studio
Почему это интересно? Понимание того, кем развивается главный инструмент в Android разработке может указать куда будет двигаться продукт. Внутри такие вопросы:
👉 Можете рассказать о том, как стали частью команды Android Studio? Что вызвало у вас интерес к Android разработке?
👉 По вашему мнению, какая функция, реализованная командой Android Studio за последние годы, наиболее значимая и почему?
👉 Каким образом команда Android Studio следует постоянно меняющимся потребностям разработчиков?
👉 Какой вклад вносит команда Studio в видение Google относительно платформы Android?
👉 Если бы вы могли взмахнуть волшебной палочкой и добавить одну функцию мечты в экосистему Android, что бы это было и почему?
Почему это интересно? Понимание того, кем развивается главный инструмент в Android разработке может указать куда будет двигаться продукт. Внутри такие вопросы:
👉 Можете рассказать о том, как стали частью команды Android Studio? Что вызвало у вас интерес к Android разработке?
👉 По вашему мнению, какая функция, реализованная командой Android Studio за последние годы, наиболее значимая и почему?
👉 Каким образом команда Android Studio следует постоянно меняющимся потребностям разработчиков?
👉 Какой вклад вносит команда Studio в видение Google относительно платформы Android?
👉 Если бы вы могли взмахнуть волшебной палочкой и добавить одну функцию мечты в экосистему Android, что бы это было и почему?
Android Developers Blog
Meet the Android Studio team: A conversation with Product Manager, Paris Hsu
Paris Hsu, a Product Manager on Google's Android Studio team, is passionate about developers using Compose Tools to build incredible Android apps.
Вроде только-только 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 решил это подстветить как фичу. Подсвечу и я.
Тут только некоторые из фичей, хотя и основные, а все можно увидеть тут.
#android #google
Что же, в этом году нас ждёт свежий Android, и к его нововведениям стоит подготовиться. Давайте разберём основные изменения, опираясь на официальную документацию Google.
Тут только некоторые из фичей, хотя и основные, а все можно увидеть тут.
Please open Telegram to view this post
VIEW IN TELEGRAM
Android Developers
Features and APIs | Android Developers
Learn about the new features and APIs for developers in Android 16.
Разбираем использование runBlocking в Android
👉 Что такое runBlocking?
Функция, которая запускает новую корутину и блокирует текущий поток до её завершения.
Часто используется в примерах для демонстрации корутин в
👉 Почему стоит быть осторожным с runBlocking в Android?
Блокирует текущий поток, что на Android может привести к замораживанию UI и возникновению ANR (Application Not Responding).
Особенно критично при выполнении операций ввода-вывода в главном потоке.
👉 Пример неправильного использования:
В этом примере
👉 Альтернативы:
Используйте
Применяйте launch или async для асинхронных операций без блокировки главного потока.
👉 Что такое 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 для асинхронных операций без блокировки главного потока.
getstream.io
Exercise Caution When Using runBlocking on Android
Explore the internal mechanism of runBlocking and the reasons why you exercise caution when using runBlocking.
This media is not supported in your browser
VIEW IN TELEGRAM
Небольшая свежая библиотека KAnalytics (⭐️ 15)
Не сказал бы, что на этой стадии я бы стал её использовать, но она может быть хорошим примером того, как стоит держать аналитику в приложении: с удобным дебаггером, поддержкой KMP и без глубокой связности с основным приложением.
Не сказал бы, что на этой стадии я бы стал её использовать, но она может быть хорошим примером того, как стоит держать аналитику в приложении: с удобным дебаггером, поддержкой KMP и без глубокой связности с основным приложением.
Разбираем, что происходит при нажатии кнопки "Старт" в Android Studio
Или как собрать и запустить приложение без Android Studio:
👉 Генерируем APK-файл
👉Запуск эмулятора
👉 Установка APK
👉 Запуск
UPD: В комментариях уточнение по поводу сборки билда и выбора эмулятора от подписчика!
Или как собрать и запустить приложение без 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: В комментариях уточнение по поводу сборки билда и выбора эмулятора от подписчика!
Medium
Behind the Scenes: What Happens When You Press the Start button in Android Studio?
As Android developers, we frequently rely on Android Studio’s “Run” or “Start” button to build, deploy, and launch our applications on…
Android Good Reads
Про Compose! 👉 Compose Multiplatform получила релиз 1.8.0-alpha02. Внутри в основном багфиксы и поддержка drag-and-drop для iOS 👉 Как запустить анимацию одновременно для 2 элементов? 👉 Можно ли двигать элементы по своему, когда открываем IME (клавиатуру)?…
Продолжаем про Compose!
👉 Можно ли сделать скролл чуть медленнее и плавнее? Да, с помощью NestedScrollConnection
👉 Почему
👉 Пачка зависимостей получила обновление:
👉 Полезный плагин: Figma to Jetpack Compose Icon сконвертирует иконку сразу в нужный формат в приложении
👉 Можно ли сделать скролл чуть медленнее и плавнее? Да, с помощью 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 сконвертирует иконку сразу в нужный формат в приложении
Android Good Reads
Kotlin Multiplatform Roadmap 2025 Дорожная карта на 2025 год. Как будет развиваться мультиплатформа: 👉 В Compose Multiplatform будет упор на интеграцию Jetpack Compose, улучшение перфоманса iOS. Стабилизация и доведение до релизного состояния таких фичей…
О причинах тут: https://blog.jetbrains.com/kotlin/2025/02/kotlin-multiplatform-tooling-shifting-gears/
Please open Telegram to view this post
VIEW IN TELEGRAM
The JetBrains Blog
Kotlin Multiplatform Tooling – Shifting Gears | The Kotlin Blog
A couple of years ago, we initiated the idea of creating a Kotlin Multiplatform IDE to help facilitate the development of KMP applications. We embarked on this venture, building on the Fleet platform,
5 ошибок в корутинах о которых никто не говорит
Внутри разбор с примерами и объяснением почему это ошибка:
👉 Вызов
👉 Некорректное использование
👉 Последовательный, а не асинхронный запрос данных
👉 Вылов
👉 В длительных цикличных операциях забываем про
Внутри разбор с примерами и объяснением почему это ошибка:
👉 Вызов
suspend
функции напрямую из вьюхи👉 Некорректное использование
GloablScope
. В Android разработке его вообще некорректно использовать. Есть ли у вас примеры, когда это уместно?👉 Последовательный, а не асинхронный запрос данных
👉 Вылов
CancellationException
внутри suspend
функции👉 В длительных цикличных операциях забываем про
ensureActive()
Частая проблема в проектах, где я работаю - синхронизация времени клиента и предотвращение перевода часов через настройки. А тут Google представляет TrustedTime API, который должен решить эту проблему наконец-таки.
Как использовать?
👉 Подключаем зависимость
👉 Создаем где-нибудь экземпляр
👉 Используем с фолбеком к стандартному способу
Под капотом синхронизация с Google серверами. Буду интегрировать в проект наряду с kotlinx-datetime
Как использовать?
👉 Подключаем зависимость
com.google.android.gms:play-services-time:16.0.1
👉 Создаем где-нибудь экземпляр
TrustedTime.createClient(context)
👉 Используем с фолбеком к стандартному способу
val currentTimeMillis =
myApp.trustedTimeClient?.computeCurrentUnixEpochMillis()
?: System.currentTimeMillis()
Под капотом синхронизация с Google серверами. Буду интегрировать в проект наряду с kotlinx-datetime
Android Developers Blog
TrustedTime API: Introducing a reliable approach to time keeping for your apps
The Trusted Time API in Google Play Services offers developers a reliable, accurate time source independent of device settings to ensure consistency.
Android Good Reads
Продолжаем про Compose! 👉 Можно ли сделать скролл чуть медленнее и плавнее? Да, с помощью NestedScrollConnection 👉 Почему ContextualFlowRow депрекейтнули? Начиная с Jetpack Compose 1.8 beta01 множество api выходит из статуса experimental, однако часть уезжает…
Compose 👨💻
👉 Релиз
👉 Проблемы с изменением размера
👉 Норм ли ранний дроп в
или
👉 Обновилась библиотека для Compose-driven architecture - Circut
👉 Coil получил обновление 3.1.0 c улучшением перфоманса для
👉 Релиз
androidx.media3:media3-ui-compose
, UI для ExoPlayer через Compose будет рисовать проще👉 Проблемы с изменением размера
ModalBottomSheet
?👉 Норм ли ранний дроп в
@Composable
?
@Composable
fun Label(val label: String?) {
if(label == null) return
...
}
или
@Composable
fun Label(val label: String?) {
if(label != null){
...
}
}
👉 Обновилась библиотека для Compose-driven architecture - Circut
👉 Coil получил обновление 3.1.0 c улучшением перфоманса для
AsyncImage
Please open Telegram to view this post
VIEW IN TELEGRAM
В чатах по KMP часто всплывает вопрос: "Вот я Android разработчик, с чего мне начать изучать про KMP?" и, помимо официальной доки, ответить то было и нечего. Но вот появилась достаточно хорошо структурированная книга (open-source):
https://santimattius.github.io/kmp-for-mobile-native-developers-book/
Внутри примеры кода, разбор структуры и основных фреймворков. Пробовали ли KMP и что посоветуете начинающим?
https://santimattius.github.io/kmp-for-mobile-native-developers-book/
Внутри примеры кода, разбор структуры и основных фреймворков. Пробовали ли KMP и что посоветуете начинающим?
Упрощенное тестирование ViewModel
Начиная с
Совместимо с KMP!
Начиная с
androidx.lifecycle:lifecycle-viewmodel-testing:2.9.0-alpha01
нам доступна структура ViewModelScenario
для проверки того как ViewModel
переживает реконфигурацию или восстановление состояния. Пример:
class MyViewModelTest {
@Test
fun testStateRestoration() = runTest { // this: TestScope
viewModelScenario { // this: CreationExtras
MyViewModel(
scope = this@runTest,
handle = createSavedStateHandle(),
)
}.use { scenario: ViewModelScenario ->
// Устанавливаем `ViewModel` state.
scenario.recreate()
// Проверяем что state восстановился корректно
}
}
}
Совместимо с KMP!
Новая typesafe навигация в Jetpack Compose привносит новые сложности. На деле, все сильно проще. О том как делать вложенную навигацию с BottomNavBar как раз следующая статья. Внутри:
👉 Примеры 2 разделенных графов навигации
👉 Пример основного экрана с
👉 Судя по всему совместимо с CMP, код будет выглядеть 1 в 1
Не стоит забывать и о документации
👉 Примеры 2 разделенных графов навигации
👉 Пример основного экрана с
BottomNavBar
👉 Судя по всему совместимо с CMP, код будет выглядеть 1 в 1
Не стоит забывать и о документации
Rock and Null
Flat approach for tabbed Navigation in Jetpack Compose
Simplify Jetpack Compose tabbed navigation with a flat structure and conditional visibility, avoiding complex nested graphs. This approach solves URL mapping issues in Compose Web and streamlines deep linking.
Опасности добавления permission READ_MEDIA_IMAGES
Если вы релизите часто приложение, вы верно знаете о правилах гугла в отношении
Если вы релизите часто приложение, вы верно знаете о правилах гугла в отношении
permission
. Автор статьи решает задачу отображения превью существующих фото из девайса. О его попытках можно узнать тут, но как итог - фичу полностью ревертнули, чтобы не блокировать релиз.Про стирание типов!
Если кратко - вся статья про
Ответ:
test1() // Вывод: Start doSomething, Inside lambda
test2() // Вывод: Start doSomethingSafely, Inside lambda, End doSomethingSafely, This WILL be printed
Если кратко - вся статья про
inline reified
. Внутри так же примеры для noinline
и crossinline
. Заметил хороший практический пример про работу с crossinline
, который можно было бы спросить на собеседовании на понимание:inline fun doSomething(action: () -> Unit) {
println("Start doSomething")
action()
println("End doSomething") // This might NOT be printed
}
fun test1() {
doSomething {
println("Inside lambda")
return // This exits test1(), NOT just the lambda!
}
println("This will NOT be printed")
}
inline fun doSomethingSafely(crossinline action: () -> Unit) {
println("Start doSomethingSafely")
action()
println("End doSomethingSafely") // This WILL be printed
}
fun test2() {
doSomethingSafely {
println("Inside lambda")
return // This exits ONLY the lambda
}
println("This WILL be printed")
}
fun main() {
println("Running test1:")
test1()
println("\nRunning test2:")
test2()
}
Ответ:
Android Good Reads
Пятница! Если уж релизите в пятницу, то проведите дополнительные тесты, а именно Accessibility Check Android Studio Iguana уже стабильна, а это значит вам точно доступен UI check mode, которая покажет как на разных экранах будет выглядеть ваше приложение…
Ещё немного про Accessibility, но теперь и в Compose
👉 Конечно, про
👉
👉
Документация про Accessibility: https://developer.android.com/develop/ui/compose/accessibility
👉 Конечно, про
contentDescription
, это важно даже для разных состояний кнопок👉
onClickLabel
который помогает вызову TalkBack функции👉
minimumTouchTargetSize
(), если не хотите думать над кастомной областью клика для иконок Документация про Accessibility: https://developer.android.com/develop/ui/compose/accessibility
Android Developers
Accessibility in Jetpack Compose | Android Developers