Telegram Web
​​ KotlinDL 0.4
#kotlin

Оказывается, существует библиотека для машинного обучения от JetBrains, которая, конечно же, написана на Kotlin, и уже предлагает довольно много всяких плюшек.

Что же появилось в новой версии?

1️⃣ Pose Detection — появилась возможность определения положения тела человека по 17 ключевым точкам на суставах человека.

2️⃣ NoTop модели — представляют из себя более облегчённые классические модели и нужны для более тонкой настройки обучения. Добавился прям целый список этих моделей, что делает работу с библиотекой ещё более удобной.

3️⃣ Новые модели: EfficientDet и EfficientNet.

4️⃣ Добавлено парочку callbacks, что также повышает работу с моделями.

5️⃣ Изменения в Image Preprocessing DSL: удалили CustomPreprocessor, добавили несколько Preprocessors.

Я не эксперт по ML, но очень радует, что эта сфера развивается и становится всё более популярной. И особенно радует, что у нас развивается ещё одна библиотека для работы с машинным обучением.

👨‍💻 Подробнее про новинки и больше примеров кода можно почитать тут.
🔥6👍2👎1
​​App Shortcuts в Android
#android

Вероятно, каждый из нас встречал shortcuts при использовании таких приложений, как WhatsApp, Facebook, Google Chrome. Весьма полезная штука, если вы хотите сделать какую-то быструю навигацию внутри приложения не заставляя пользователя заходить в само приложение.

Как её сделать?
На самом деле, всё довольно просто: необходимо добавить пару конфигурационных файлов.
1️⃣ Создаём файл shortcuts.xml внутри файлов с ресурсами

2️⃣ Добавляем непосредственно </shortcut> внутри этого файла, где создаём его идентификатор и label. Внутри тэга переопределяем тот Intent, который хотим запустить при клике.

3️⃣ Добавляем <meta-data android:name="android.app.shortcuts" внутри AndroidManifest.xml, чтобы всё заработало.

А если вдруг вам нужно сделать динамические shortcuts, то всегда есть возможность воспользоваться ShortcutManager.
Чуть больше информации и примеры кода можно найти в этой статье.
👍6🔥3👎1
​​Navigation в Jetpack Compose
#compose

Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.

Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:

👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;

У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.

🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
👍6🔥3👎1
​​Пара фич Android Studio
#android

Периодически попадаются статьи, которые рассказывают о редких, но довольно полезных фичах Android Studio, которые здорово экономят время. Да, чаще это весьма очевидные советы, но автор этой статьи удивил и порадовал нестандартными решениями.

1️⃣ Прячем ненужные файлы. При использовании библиотек, генерирующих много кода (например, Dagger) можно исключить эти файлы из поиска Android Studio при помощи кастомного Scope.
Для этого переходим: Preferences -> Appearance & Behaviour -> Scopes -> + -> local и добавляем маску !file:*intermediates*/&&!file:*generated*/&&!file:R.java.

Можно пойти дальше при помощи Preferences -> Editor -> File Types -> Ignored Files and Folders, и скрыть из поиска целые директории, например /build, /generated, что может быть полезно в очень больших проектах.

2️⃣ Быстрые прототипы — крутая фича, которая позволяет быстро набросать или проверить какую-то идею прямо в проекте. Для этого можно использовать Scratch files: создать новый можно при помощи Cmd + Shift + N, выбираете нужный тип файла и получаете песочницу прямо внутри текущего проекта. Попробуйте, очень удобно.

3️⃣ Множественный курсор — известная мне ранее фича, которая позволяет редактировать несколько строк проекта одновременно. Очень полезно при рефакторинге, экономит много времени.
При помощи Control + G ставится курсор между одинаковыми частями кода, а при помощи Shift + Option + click поставить курсор вообще в любую область файла.

4️⃣ Расширенный Copy/Paste — крутая штука, которая позволяет видеть историю буфера обмена. Для этого надо использовать сочетание Cmd + Shift + V.

5️⃣ Восстановление из локальной истории — часто приходится восстановить те изменения, которые уже были добавлены в файл, но ещё не залиты в Git. Это можно сделать при помощи right-click -> Local History -> Show History, где можно восстановить требуемый код.

👉 В статье есть ещё больше советов.
👍18🐳11👎1🌚1
​​Things every Kotlin Developer should know about Coroutines
#kotlin

Попался классный набор статей, где автор делится, фактически, полной информацией о Coroutines, правда в структурированной и удобном для чтения виде.
Получился здоровский аналог документации, который поможет вникнуть в тему, ну или напомнить себе о каких-то вещах, которые забылись.

Статей целых 5️⃣:
Part 1: CoroutineContext
Part 2: CoroutineScope
Part 3: Structured Concurrency
Part 4: Exception Handling
Part 5: Cancellation
🔥16👍3
​​Kotlin-Swift interopedia
#kmm

Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.

Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.

👨‍💻 Ну и примеры кода для каждого кейса тоже очень радуют.
🔥91🤮1💩1
​​Kotlin Build Reports
#kotlin

Начиная с версии Kotlin 1.7.0 у нас появилась возможность создания отчётов о сборке. Там содержится информация о различных этапах сборки, а также почему невозможно использовать инкрементную компиляцию.

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

👨‍💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:

1️⃣ В gradle.properties добавляем kotlin.build.report.output=file.

2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
👍6🔥4👎1
​​Spring & Fling анимации в Jetpack compose
#compose

Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.

В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.

Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных View.
5👎1
​​Glance Widget и Work Manager
#android

Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.

Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.

Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
👍3👎1
​​Screen response time
#android

Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся View, да и в целом экран.
Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.

С Android всё не так просто, но тем не менее есть парочку инструментов, которые могут нам помочь сделать приложения ещё более качественными.

🧑‍💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.

Парочку советов из статьи:

1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.

2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз onMeasure.

3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.

В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
👍132👎1
​​Screenshot tests для Compose
#compose

Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации @Preview, которые, по сути и являются слоем для UI.

Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.

Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.

🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
👍13👎1🔥1
​​Как устроен viewModelScope?
#android

При работе с coroutines мы частенько можем забыть отменить нужную нам джобу в тот момент, когда она нам больше не нужна. К счастью для нас, существует viewModelScope, который уничтожает ненужные coroutines в тот момент, когда уничтожается ViewModel.

Давайте рассмотрим чуть детальнее, как он работает внутри.
Класс ViewModel содержит внутри Map объектов, кототорые могут содержать любой тип объектов.
Нам интересен метод clear(), который вызывается перед методом onCleared() и который мы можем переопределить в нашей модели. Тут вызывается метод closeWithRuntimeException(), который как раз и завершает нужный нам Scope, так как он имплементирует интерфейс Closeable.

Подобное поведение можно было довольно просто организовать и самостоятельно, однако пришлось бы сделать кастомный Scope и завершить его в нужном нам месте. Разработчики Jetpack нам чуть-чуть упростили задачу.

Ещё больше почитать о внутренней работе ViewModel можно тут.
👍17
​​App Quality Insights from Firebase Crashlytics
#android

Начиная с Android Studio Electric Eel у нас появилась возможность смотреть информацию из Crashlytics прямо внутри IDE.

Всё будет работать при помощи инструмента App Quality Insights и будет показываться стек вызовов, статистика, вызовы и всё, что мы смотрим внутри окна браузера.

Выглядит прям круто, с нетерпением жду хотя бы Beta-версии, чтобы попробовать все в деле. 🔥
10❤‍🔥9
Ежегодный опрос команд российской разработки

В этом году начался ежегодный, уже шестой опрос про отечественные мобильные команды разработки. Из него можно узнать:
📖 откуда мобильщики получают новые знания;
💪 какие команды мобильной разработки самые сильные;
🌎 сколько человек решило уехать, а сколько – осталось;
🏡 сколько мобильщиков работает удаленно, а сколько – в офисе;
🌟 в каких компаниях мобильные разработчики хотят работать больше всего.

Вот результаты прошлого года, а поучаствовать в опросе этого года можно тут. Опрос займёт не больше минуты.

Не забудьте выбрать на одном из шагов также канал Android Live, для меня это очень важно 🤝.
🤮96👍1
​​Lifecycle of Composables in Jetpack Compose
#compose #новичкам

Довольно подробный гайд о том, что из себя представляет Jetpack Compose. Будет сильно полезно новичкам, ну и, конечно, тем, кто не особо представляет, как фреимворк работает под капотом.

Тут и:
🔸 жизненный цикл composable-функции;
🔸 обновление одной composable-функции из другой;
🔸 логирование событий;
🔸 и о том, как корректно использовать рекомпозицию.

Ну и круто, что всё построено на одном примере, который вы вместе с автором можете построить. 👌🏻
Ссылка на туториал тут.
👍11🤔3
​​Абстракция для Strings
#android

Попался любопытный пример работы со строками в Android.
Дело в том, что при использовании строк в больших проектах может возникнуть архитектурная проблема с доступом к Context и получению строк с его использованием.

Автор предлагает использовать sealed-класс для обработки подобных кейсов.

sealed class TextResource {
companion object {
fun fromText(text : String) : TextResource = SimpleTextResource(text)

fun fromStringId(@StringRes id : Int) : TextResource = IdTextResource(id)

fun fromPlural(@PluralRes id: Int, pluralValue : Int) : TextResource = PluralTextResource(id, pluralValue)
}
}


Его просто применять на любых уровнях абстракции. Подробнее в этой статье.
👍9👎3💩3
​​Зависимости в многомодульном приложении
#android

При написании многомодульных приложений одним из важных пунктов является управлением зависимостями, которые распространяются на весь проект.

Есть несколько хороших подходов для того, чтобы обновлять зависимости одновременно во всех модулях, и вот вам один из них, описанный в статье.

Автор использует Kotlin DSL с его более удобным синтаксисом для написания кода в gradle-файлах, и объединяет все зависимости при помощи кастомного buildSrc.

В итоге мы можем управлять зависимостями, используя только один файл, а добавлять в модуль таким образом:

implementation(Libs.Kotlin.stdlib)
implementation(Libs.AndroidX.appcompat)
implementation(Libs.AndroidX.coreKtx)
👎4🔥4🤔31
​​UDF с Kotlin Flow
#kotlin

Классный пример визуализации поведения Kotlin Flow в Android.

Автор рассмотрел основные кейсы работы Flow в контексте состояний, пользовательских действий и различных типов.
Получилась крутая визуализация, что будет полезно, если вы хотите лучше разобраться с Flow 🤓
👍10🔥21
​​OnBackPressed Deprecated и что использовать вместо него
#android

Если сейчас выставить targetSdk 33, то можно увидеть то, что OnBackPressed() метод в Activity — deprecated.

Это объясняется тем, что начиная с Android 10, когда была добавлена нативная поддержка навигации жестами, у пользователей были проблемы ложных срабатываний при свайпах. Получалось, что Android не мог корректно определить, был ли это просто свайп, или же пользователь действительно нажал назад.

💡Что использовать вместо onBackPressed?
Рекомендуется перейти на onBackPressedDispatcher, который надо будет зарегистрировать в Activity вместе с OnBackPressedCallback.

Вероятно, с Android 13 у пользователя немного поменяется навигация при помощи жестов, чтобы более корректно распознавать те жесты, которые он использовал.

👉 Чуть больше деталей и пример кода можно найти тут
👍18
​​Как ViewModel переживает configuration changes?
#android

Полезная статья, которая даёт базовое представление о том, как ViewModel переживает состояние при повороте экрана.

Кстати, вопросы о том, как заставить ViewModel пережить своё состояние (или же ваш кастомный класс) частенько попадаются на собеседованиях.

Да и в целом, полезно знать, какая "магия" происходит под капотом и для чего нужен ViewModelStore🙃.
5👎5👍3🤔1
2025/08/26 16:49:18
Back to Top
HTML Embed Code: