Android Live 🤖 – Telegram
Android Live 🤖
5.28K subscribers
52 photos
1 video
800 links
Самые свежие новости, новинки и тренды Android от практикующего разработчика.


Автор: @al_gorshkov,
Чат: @android_live_chat
Личный блог: @al_gorshkov_blog

Рекламу не размещаю
Download Telegram
​​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
​​Design of Kotlin Coroutines
#kotlin

Сегодня я к вам с хорошей статьей, где автор рассказывает о том, как устроены Coroutines под капотом.

Суперполезно понимать, как работают часто используемые нами инструменты под капотом, ведь это поможет гораздо лучше понимать потенциальные проблемы или особенности при использовании.

В статье много примеров кода, а также разбор почти всех методов для Coroutines: launch(), start(), invoke(), startCoroutineCancellable(), resumeWithCancellable(), resumeWith(), invokeSuspend(). 🤓
👍7❤‍🔥4
​​Select в Kotlin Coroutines
#kotlin

Давненько на канале не появлялось сообщений. 🙄 Но я снова с вами, и сегодня предлагаю обсудить ключевое слово select, но только не в контексте SQL-запросов, а в контексте Coroutines.

В мобильной разработке его можно использовать для кейсов, когда у нас есть несколько suspend-функций, но нас интересует результат только той, которая завершится первой.

Небольшой пример:
val winner = select<String> {
data1().onAwait { it }
data2().onAwait { it }
}

println("The winner = $winner") // prints "The winner = Hello"


Функции data1 и data2 — это простейшие вызовы с delay:
fun data1() = GlobalScope.async {
delay(1000)
"Hello"
}

fun data2() = GlobalScope.async {
delay(2000)
"World"
}


В общем, ещё один суперполезный инструмент при использовании Coroutines. Подробнее можно почитать тут.
🔥13🍾8👍5👌1🏆1
​​Дизайн система с Jetpack Compose
#compose

В своём текущем проекте думаем о добавлении дизайн системы, и мне попалась полезная статья, которая описывает, как сделать такую систему на Jetpack Compose.

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

Кроме этого, есть ещё несколько преимуществ:
👉 общий язык между командой дизайнеров и разработчиков;
👉 единственный "источник истины" при вёрстке;
👉 изменения в нижнем слое мгновенно изменяют состояние всех остальных слоёв;
👉 расширяемость: все более сложные компоненты состоят из множества маленьких;

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

Поделитесь опытом: помогла ли вам дизайн-система улучшить процессы между командами. Или скиньте в комментариях ещё больше полезных статей с прикладным опытом для построения такой системы.
🔥8
​​Kotlin и bytecode
#kotlin

Полезная статья, где автор рассматривает фичи Kotlin со стороны байткода.
Кроме этого, тут есть несколько полезных штук, которые также освещены:

👉 что такое Java Virtual Machine и её спецификация;
👉 почему фичи Java и Kotlin совместимы;
👉 как выглядят основные фичи Kotlin в байткоде.
👍6🤩1
​​KMM в Beta
#kmm

Отличные новости. Пару дней назад, команда Kotlin официально перевела KMM в Beta. А это значит, что теперь не будет фундаментальных изменений в самом фреймворке, ребята работают над улучшением стабильности текущих фич.

А тут ещё Google подоспел с официальным апдейтом некоторых мультиплатформенных Jetpack-библиотек, начали с Collections и DataStore, уверен, что скоро подоспеют и другие. Вдруг мы увидим мультиплатформенный Room 😁.

Ну а я очень верю в KMM и желаю команде успехов. 😉
🔥14👍3
👌61
​​Android Studio Shortcuts. Codebase
#новичкам #android

Очередной список рекомендаций, а точнее — список горячих клавиш, которые касаются быстрого перехода по кодовой базе.
Клавиши действительно полезные, и большинство из них вы будете использовать на практике.
Вот несколько из тех сочетаний, что описывает статья.

1️⃣ Cmd + Click — одно из наиболее полезных сочетаний. При клике на функцию, вы переходите на её объявление, а при клике на интерфейс — в реализацию интерфейса. Но не все знают, что очень удобно использовать это же сочетание для навигации в Dagger + Hilt.

2️⃣ Double Shift — ещё одно удобнейшее и распространённое сочетание клавиш. Попробуйте при поиске использовать Camel case search. Например, BLPaVM вернёт BlueLinePackingViewModel. А ещё — попробуйте ввести SignInFragment#42, и вы перейдёте на 42 строку фрагмента для авторизации.

3️⃣ Cmd + Shift + F — удобнейший быстрый поиск по вашей кодовой базе.

4️⃣ Cmd + L — быстрый переход на нужную вам строку кода в вашем проекте.

5️⃣ Cmd + E — показ последний файлов с которыми вы взаимодействовали.

Буду рад, если напишите свои любимые клавиши в комментариях. ☺️
🔥9👍3
​​Как работает reified?
#kotlin

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

💡Давайте рассмотрим пару кейсов, когда мы можем сделать наш код чище и более "Kotlin-style".

С reified непосредственно связано понятие inline функций и использование generics. При их использовании может потребоваться знание того, какого типа класс мы используем. Рассмотрим пример маппинга json в нужный нам класс:

fun <T> String.toKotlinObject(): T {
val mapper = jacksonObjectMapper()
//does not compile!
return mapper.readValue(this, T::class.java)
}


Чтобы исправить ошибку при компилировании, у нас есть две опции.

1️⃣ Передавать класс в параметрах. Тогда наша функция будет выглядеть так:

fun <T: Any> String.toKotlinObject(c: KClass<T>): T {
val mapper = jacksonObjectMapper()
return mapper.readValue(this, c.java)
}


А её вызов будет таким: jsonTypeAsString.toKotlinObject(MyJsonType::class).

2️⃣ Использовать reified. Тогда всё станет сильно удобнее и красивее:

inline fun <reified T: Any> String.toKotlinObject(): T {
val mapper = jacksonObjectMapper()
return mapper.readValue(this, T::class.java)
}


А вызов будет таким: json.toKotlinObject<MyJsonType>().

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

Больше подробностей о reified можно найти в этой небольшой статье. 🤓
👍28👎1
​​Themed App Icons
#android

С релизом Android 13 у разработчиков появилась возможность обновить свои иконки, сделав их максимально похожими на ту тему, которая есть у пользователя в системе.

💡 Сейчас таких приложений довольно немного, а зря, ведь поддержку добавить довольно просто. Для этого необходимо прописать monochrome-атрибут в adaptive-icon.

Больше информации про иконки, про то, как сделать поддержку разных иконок приложения можно найти в этой статье.
👍122🔥1
​​Play Console updates for app's delivery performance
#google #android

Недавняя статья, где Google рассказывает о неочевидных, но полезных разработчикам фичах, которые можно взять из Google Console. По большей степени они связаны с aab-форматом релиза.

1️⃣ Release delivery — при загрузке релиза вы можете увидеть примерный размер загружаемого приложения у пользователей, а также сравнение с предыдущим релизом.

2️⃣ Feature modules — если вы используете такие фичи, как Play Asset Delivery или Play Feature Delivery, то информацию о том, как они загружаются пользователями, можно увидеть на странице статистики.

3️⃣ Freshness — раздел статистики, который показываем вам, как быстро пользователи мигрируют с одного релиза на более новый. Если вдруг эта метрика слишком низкая, то можно использовать In-app updates API.

4️⃣ Детали по конкретному девайсу — можно определить, какой размер файла скачивается на конкретном устройстве.

Чуть больше фич, а также скриншотов можно найти непосредственно в статье.
👍4
​​Object expressions и declarations
#kotlin

Недавно обнаружил для себя несколько интересных применений object в Kotlin. Как ни странно, обо всех сказано в официальной документации, но на практике я не часто встречал их применение.

1️⃣Создание анонимного класса с нуля. Вдруг у вас будут кейсы (если подскажите, какие, то буду рад), когда вам необходимо создать объект с нуля без объявления класса. Вот пример:
val helloWorld = object {
val hello = "Hello"
val world = "World"
// object expressions extend Any, so override is required on toString()
override fun toString() = "$hello $world"
}


А ещё можно сделать вот такие мудрёные конструкции:
open class A(x: Int) {
public open val y: Int = x
}

interface B { /*...*/ }

val ab: A = object : A(1), B {
override val y = 15
}


2️⃣ Object как Singleton — довольно распространённый кейс, когда вы делаете аналог синглтона Java в Kotlin.

3️⃣ Data objects — экспериментальная, но любопытная фича, позволяющая делать так:
data object MyObject

fun main() {
println(MyObject) // MyObject
}


А посмотреть все применения Object можно как раз в статье. 🤓
👍12
​​Жизнь в Нидерландах 🇳🇱
#интервью #экспаты

На канале иногда выходят интервью с разработчиками, которые переехали жить и работать в другие страны. Сегодня у вас есть возможность задать свой вопросы про Нидерланды 🇳🇱.

Наш гость — Георгий Могелашвили — engineering manager в Shopify и основатель сервиса поиска наставников GetMentor.dev.
Георгий, переехал в Нидерланды из Москвы 8 лет назад, живет в Харлеме (Х, не Г), но до сих пор не выучил голландский язык. 🙂

Ваши вопросы вы можете задать тут, так что не упустите эту замечательную возможность. 🙃
🔥11💩8😁1
​​Android 13. Выбор кастомного языка
#android

Ребята из Google решили добавить одну из самых запрашиваемых (по их статистике, конечно) фичу — выбор отдельного языка для приложения.

То есть, если вы хотите, чтобы одно из ваших приложений было на английском языке, а при этом вся система была на русском, то в системных настройках приложения можно выбрать любой язык из списка. Звучит круто, потому что:
- не все приложения сейчас предоставляют выбор отдельного языка внутри приложения;
- не все приложения ставят дефолтным английский язык;

Для разработчиков всё не очень сложно. Надо будет добавить locale_config.xml в приложение со списком поддерживаемых языков, обновить библиотеки androidx до последних версий и взять инфу о выбранном языке.

Больше деталей о фиче можно взять тут.
👍18👎1
​​Прокачиваем build noscripts
#android

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

1️⃣ Version catalog — не все знают об этой фиче, но её можно использовать как отличный вариант для управления зависимостями проекта. Для неё нужно использовать специальный файл с расширением toml, где описать версии для каждой из зависимостей проекта.
Правда, пока плохо работают подсказки Android Studio об устаревших зависимостях, вероятно стоит подумать о плагине типа этого.

2️⃣ Android application plugin — тоже удобная штука, которая позволяет вынести повторяющиеся части gradle-файлов в один плагин и применить его к остальным модулям. Автор описывает пример с minSdk, compileSdk и т.д. в плагине, но вы можете вынести те части, которые нужны именно вам.

3️⃣ Kotlin plugin — описанные плагины можно писать на Kotlin с его плюшками, в статье тоже найдётся пара примеров, которые помогут в написании своих. 🤓
🔥8👍2😱1
​​Memory Safe Languages in Android 13
#android

Любопытная статистика от Google по использованию разных языков программирования в Android.
Говорят, что на протяжении последних десяти лет, 65% всех уязвимостей в Android и Chrome были связаны с безопасностью памяти.

В последнее время тенденция улучшается, ведь Google слезает с небезопасных по памяти языков, а 2022 год стал первым годом, когда основная доля уязвимостей была связана не с памятью.
Ещё с Android 12 есть поддержка Rust, как безопасная по памяти альтернатива C/C++, и есть довольно мощный скачок в его использовании в последних версиях Android.

Статья получилась объёмной, внутри много графиков и любопытных выводов, рекомендую почитать.
👍12