Telegram Web
​​Как устроен 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
​​Chrome Inspect
#android

Совсем недавно узнал о таком инструменте Chrome как chrome://inspect. Возможно, вы, как и я, услышите о нём впервые.

Он больше подходит, если вы пишите веб-приложения, однако, есть кейсы, когда он нужен и нам – Android-разработчикам: например, при отображении контента с WebView и его дебага.

💡Пользоваться им очень просто:

1️⃣ Включаем режим разработчика на смартфоне (кажется, что вы все это сделали).
2️⃣ Ввводим в строку браузера chrome://inspect и подключаемся к телефону.
3️⃣ В целом, на этом всё: мы можем анализировать код, который приходит в нашу WebView, ставить callbacks и анализировать логи.

Радует тот факт, что с нас не требуется установки никаких дополнительных зависимостей, ведь использовать его мы будем не очень часто.
👍21💩3
​​Android Manifest placeholders
#android

Уверен, что большинство из вас слышали про то, что такое buildConfigField.
Если нет, то по сути — это возможность объявить переменную внутри build.gradle и её дальнейшее использование внутри приложения.

Правда, вы не можете ссылаться на эту переменную внутри AndroidManifest. Самый типичный кейс — добавление идентификатора приложения для всяких сервисов, типа HMS или GMS. Но тогда на помощь приходит менее распространённый, но весьма крутой инструмент manifestPlaceholders.

💡Использовать его довольно просто: объявляем переменную через manifestPlaceholders.variable = "testVariable", а дальше получаем ссылку на неё в AndroidManifest при помощи:
<meta-data
android:name="variable_name"
android:value="${testVariable}"/>


Таким образом, мы можем настроить нужное нам поведение хоть на этапе сборки приложения, хоть для отдельного flavor. Берите на заметку. 😉
👍193🔥2💩1
​​Релиз Android 13
#android

Как и в последней паре релизов, ближе к концу лета у нас появляется новая, стабильная версия Android, в этот раз — 13.
Скоро ещё больше смартфонов получат новое обновление, а нам, разработчикам, надо обновить targetSdk до 33 версии.

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

🍦Read Media Permission — теперь при использовании android.permission.READEXTERNALSTORAGE вам необходимо описать, к каким типам файлов вы хотите получить доступ. Например, если вам нужны только изображения, то необходимо указать: android.permission.READMEDIAIMAGES.
Но не спешите удалять старый READEXTERNALSTORAGE: ему можно указать android:maxSdkVersion="32", сохранив корректную работу на уже старых версиях Android.

🍦Android 13 Photo Picker — также, для получения изображений и других медиа-объектов, можно воспользоваться PhotoPicker, который вскоре будет работать на Android 11 и выше. Это на случай, если вам не нужно постоянно иметь доступ к галерее пользователя. Довольно удобно.

🍦Notifications runtime permission — теперь не получится показать уведомления без разрешения пользователя. Для начала добавим:
<uses-permission android:name="android.permission.POSTNOTIFICATIONS" /> в манифесте, а после нужно запросить разрешение у пользователя по аналогии с обычным запросом разрешений.

🍦* Google Play Advertising ID* — проверьте, используете ли вы рекламный идентификатор в своём приложении. Кстати, даже если ваше приложение напрямую его не использует, проверьте библиотеки для аналитики, часто именно они запрашивают этот идентификатор.
Если нашли — не забудьте заполнить форму в Google Play, а также добавить разрешение в манифест:
<uses-permission android:name="com.google.android.gms.permission.AD
ID"/>.

🍦и ещё парочку дополнений, таких как корректная окраска сайтов в WebView, оптимизаций батареи, Intent Filter Restrictions и т.д. Классная статья с подробным описанием тут.

В целом, я уже в ближайшее время планирую поднять targetSdk в своих проектах, и миграция пока не выглядит сложной.
👍23
​​Git bisect
#разработка

Давным-давно рассказывал о таком крутейшем инструменте, как git bisect. С тех пор я много раз им пользовался, и хотелось бы, чтобы он был в арсенале как можно у большего числа разработчиков.

💡Типичная проблема: вы видите, что проявилась проблема, которой не было в прошлом релизе, а между релизами прошло уже несколько десятков коммитов.
Просматривать вручную весь код — утомительно и долго, да и не результативно.

И вот на помощь нам приходит отличный, но почему-то не очень распространённый инструмент — git bisect.

Чтобы его использовать необходимо:
1) Открыть консоль git и перейти в папку проекта.
2) Ввести git checkout <commit hash>, где вместо скобок записать коммит, в котором проявилась проблема.
3) Начать процесс поиска при помощи команды git bisect start.
4) Пометить этот коммит плохим при помощи команды git bisect bad.
5) Пометить коммит, где точно нет проблемы при помощи команды git bisect good <commit hash>.
6) Далее повторяете процесс. Каждый раз git будет переключать в нужный коммит между предыдущим хорошим и плохим коммитом при помощи бинарного поиска. Собираете проект и проверяете, проявляется ли проблема. Если да, то вводите git bisect bad, если же нет, то git bisect good.
7) После завершения поиска вводите git bisect reset, чтобы вернуть репозиторий в начальное состояние.

У вас получится найти проблемный коммит за log n шагов, где n — число коммитов между первыми помеченными коммитами.
🔥26👍12👏1
​​Important Performance Metrics
#android

Попалась статья, в которой описываются ключевые метрики Android приложений. Особенно полезно изучить её прежде чем начинать оптимизировать своё приложение: как минимум, вы будете понимать, на что стоит потратить свои усилия. 😉

1️⃣ Фазы запуска приложения — важная метрика, которая видна пользователю приложения как только он открывает его. В целом, есть следующие этапы запуска приложения:

➡️ cold start — открытие приложения сразу после его установки, полного закрытия, перезапуска системы и т.д. Как раз тут и вызывается Application.onCreate(). По мнению автора, время холодного запуска должно быть меньше 500 миллисекунд, большее время заметно пользователям и может вызвать раздражение.
➡️ warm start — измеряется, начиная с Activity.onCreate() перед созданием дерева View. Его можно получить, если сделать поворот экрана, во время которого пересоздаётся Activity, ну или когда система вытесняет ваше приложение из памяти, если оно находится в фоне.
➡️ hot start — измеряется, начиная с Activity.onStart(). Его вы получаете, когда переключаетесь между приложениями.

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

2️⃣ Time to Initial Display — это время до отрисовки первого кадра вашего приложения, можно проверить при помощи ActivityTaskManager с тэгом Displayed.

3️⃣ Time to Full Display — время, когда было отрисовано всё необходимое для работы с экраном. Любопытно, что эту метруку можно не только проверить, но и настраивать при помощи reportFullyDrawn() метода Activity.

4️⃣ Frame rates — важная характеристика, которая показывает, насколько плавно работает ваше приложение. Тут есть прямая зависимость от частоты обновления экрана, и автор рекомендует взять за эталон 90 fps: следовательно, у нас есть максимум 1/90 или 11.1 миллисекунд для отрисовки одного кадра.

Больше деталей можно посмотреть в самой статье
👍13
​​Pre-inflated ViewPool для RecyclerView
#android

В сегодняшней статье автор рассказывает о том, как ещё больше оптимизировать RecyclerView, чтобы избежать фризов при непосредственном отображении данных — при помощи PrefetchViewPool.

💡Проблема кроется в том, что RecyclerView создаёт элементы своего списка непосредственно в момент отображения.
А вся идея заключается в том, чтобы проинициализировать пул для RecyclerView в тот момент, когда сервер получает эти данные.

Для этого как раз и используется PrefetchViewPool. В статье можно почитать детальнее о том, как его применить для конкретной реализации адаптера.

У автора получилось улучшить время отображения RecyclerView с 214.19ms до 118.35ms, что, как мне кажется, весьма достойный результат. 👍🏻
👍19👎2🔥1
​​Как переместить View с клавиатурой
#новичкам #android

Показ клавиатуры и её синхронизация с отображаемыми View — довольно распространённая вещь. И хотя у нас уже появилась возможность синхронизировать показ клавиатуры и кнопок, далеко не все приложения используют эту фичу. Давайте кратко рассмотрим, какие вообще варианты у нас есть.

1️⃣ API 30 и выше — можем сделать крутую анимацию для показа клавиатуры, плавно перемещая View в нужную нам позицию.

2️⃣ API 21 – API 29View анимируются с небольшой зарежкой, но не так плавно, как в предыдущем варианте. Выглядит чуть похуже, но терпимо.

3️⃣ API 20 и ниже — анимации при показе нет, View сразу перемещается в необходимое место над клавиатурой. К счастью, подобных смартфонов становится всё меньше, и многие приложения повышают минимальный SDK.

Для того, чтобы понять позицию клавиатуры, мы должны использовать OnApplyWindowInsetsListener, в котором уже можем как раз и анимировать необходимые нам View.

Кода написать надо совсем немного, при этом вы получите красивое отображение клавиатуры на экране. Больше деталей, примеров и кода лучше взять в этой статье.
👍13👎3🔥3
​​Mock API response с Retrofit
#android

На практике частенько бывает так, что нам приходится добавлять какую-то фичу в приложение в момент, когда ещё нет backend.
В таком случае приходится делать mock для нужных нам запросов, и существует несколько вариантов:

👉 попросить backend сделать mock — вариант, в котором нам не придётся делать лишнюю работу, однако не всегда возможный, если команда backend занята иными задачами;

👉 сделать mock через Postman — хорошее решение, которое создаст имитацию реального сервера, но придётся немного изучить документацию;

👉 сделать mock через Firebase — аналогичное решение, но в рамках другого сервиса;

👉 сделать mock через Retrofit — далеко не все знают, что мы можем использовать кастомный Interceptor, чтобы переопределять нужные нам запросы и возвращать необходимый результат. Подробнее о том, как лучше это организовать в своём проекте можно почитать тут.

Можете покидать свои решения в комментариях. 😏
👍15👎2
​​10 неизвестных инструментов для Android-разработки
#android

Люблю порой читать всякие топы и рейтинги, в них иногда попадаются полезные штуки, о которых ты не знал. Вот очередная статья с неизвестными инструментами для работы с Android, и тут есть некоторые, которые захотелось поставить и потестировать. Все инструменты бесплатные и open source.

1️⃣ stackzyприложение, которое позволяет посмотреть используемые зависимости и разрешения любого приложения. Помимо того, что оно красивое, так еще и написано на современном стеке и компонентах: Compose Desktop, MVVM, Coroutines & Flow.
💡Забавный факт: приложение использует Google Sheet в качестве backend.

2️⃣ v9 — некоторые должны помнить 9-patch файлы, которые динамически и автоматически изменяют размер растровых изображений в соответствии с тем, что внутри и размером экрана. Есть подобный инструмент для Path, который делает похожие штуки.

3️⃣ Glanceинструмент для просмотра содержимого базы данных вашего приложения. Выглядит как полезный инструмент для тестирования, а подключается по аналогии с LeakCanary, которым вдохновлялись при создании этой библиотеки.

4️⃣ adb-tools-mac — всплывающее меню для работы с Android-устройствами для MacOS. Может быть полезно вашим тестировщикам (разработчиков подобный плагин есть внутри Android Studio).

5️⃣ name-that-color-desktop — почти бесполезное, но забавное приложение, которое именует за вас цвета по отправленному hex-коду. Подобное есть ещё тут, так что приложение ставить не обязательно.

6️⃣ Gradle Task Tree — Gradle plugin, который построит дерево вызванных задач для конкретной команды. Полезная вещь для дебага времени билда приложения.
🔥9👍4
​​Тулзы для анализа Android-приложений
#android #security

Тут ребята из Digital Security делятся целым набором инструментов для проверки Android-приложений. Про многие из них не слышал, уверен, что и вам будет интересно взять что-то себе на вооружение:

💡прокси — для анализа трафика используется три инструмента: BurpSuite, MitmProxy и OWASP ZAP. Рекомендуется начать работу с BurpSuite как с наиболее простого и понятного инструмента.

💡статический анализJADX для анализа классов и ресурсов, Apktool для работы с текущими ресурсами и ассетами, ByteCode Viewer — если первая тулза не справляется с декомпиляцией классов, Androguard удобен для построения графов классов.

💡динамический анализFrida для подключения на лету к приложению и внедрению в него своего кода, Objection и Medusa как доволнительный набор инструментов для Frida.

Ещё больше инструментов и скриншотов можно найти в статье у ребят. Обязательно в закладки!
🔥10👍2
​​DSL type-safe builders
#kotlin

Подробная статья, которая рассказывает о Kotlin DSL и её применении в реальных проектах.
Будет полезно, если вы никогда не слышали об этом инструменте или не понимаете, где его можно применить. Множество примеров из других приложений и проектов.

В общем, хороший кандидат для того, чтобы добавить в закладки ☺️
🔥8👍2🍓2
2025/08/26 11:20:26
Back to Top
HTML Embed Code: