Android Mobile | YeaHub
431 subscribers
332 photos
21 videos
597 links
Теория, подготовка к интервью и курсы для Android разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#статьи
🤯 Размещение UI-компонентов в пределах отступов Safe Area

Безопасная область (safe area) — это часть экрана, которую не загораживают элементы системного UI, такие как строка состояния, панель навигации, динамический остров и пр.

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 В чем разница между init и constructor в Kotlin?

constructor создаёт экземпляр класса и принимает параметры, а блок init выполняет инициализацию, общую для всех конструкторов. Блок init всегда выполняется после вызова конструктора, что позволяет настроить обьект или проверить параметры.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
🤓 Kopy — это библиотека для Kotlin, предназначенная для удобного глубокого копирования объектов!

🚩Она позволяет создавать новые экземпляры классов данных с измененными свойствами, включая вложенные объекты, без необходимости вручного копирования каждого поля. Это особенно полезно при работе со сложными структурами данных, где требуется изменить только часть объекта, сохранив остальные данные неизменными.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😎 Пишем тесты для compose навигации

Все благодаря type-safe навигации, представленной недавно. Внутри статьи вариант для старого подхода и способ миграции его на новый подход. Для тестов используется TestNavHostController, позволяющий верифицировать экран на котором находимся. Пример:

@Test
fun whenUserIsInBookSearch_andClickOnABook_verifyDestinationIsBookDetail() {
// User is in BookSearch
composeTestRule.runOnUiThread {
navController.setCurrentDestination(NavigationRoutes.BOOK_SEARCH)
}

// User clicks on the first book
composeTestRule.onAllNodesWithTag(bookCardTestTag)[0].performClick()
assertTrue { navController.currentDestination?.route == NavigationRoutes.BOOK_DETAIL }
}


Выглядит очень просто, в связи с чем вопрос: Тестирование навигации это тесты ради тестов или валидный способ проверки бизнес-логики?

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🫠 Анализируем время сборки и рисуем графики

🟠 Базовый Build Analyzer из Android studio покажет куда тратиться основная масса времени в сборке.
🟠 Аналогичный репорт можно получить через ./gradlew --profile assemble[Flavor]Debug.
🟠 Так же скан можно выгрузить в web и пошарить с коллегами через ./gradlew --scan. Там вы увидите более подробную разбивку по затраченному времени на тот или иной шаг сборки
🟠 Gradle Profiler и благодаря его удобной функции - сценарии, можно получить наглядную статистику. Больше примеров тут

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Объясните концепцию typealias в Kotlin.

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👨‍💻 RSocket-Kotlin — это мультиплатформенная реализация протокола RSocket на Kotlin, предназначенная для реактивного обмена сообщениями между клиентами и серверами!

Она поддерживает различные модели взаимодействия, включая fire-and-forget, request-response, request-stream и bidirectional channels. Библиотека основана на kotlinx.coroutines и ktor-io, что делает ее удобной для работы с асинхронными операциями и сетевыми приложениями.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Shader Ripple Effect Playground — библиотека шейдерных AGSL эффектов

Shader Ripple Effect Playground — библиотека шейдерных AGSL эффектов для Android. Есть эффект пульсации, реагирующий на касание, непрерывная волновая анимация с настраиваемыми параметрами, переход раскрытия содержимого с эффектом пульсации — все с настрйоками. Полная совместимость с любым элементом пользовательского интерфейса Jetpack Compose, простая интеграция с минимальным количеством кода.
Shader Ripple Effect Playground на GitHub

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #networks
🤔 Что такое авторизация?

Авторизация - это процесс, который определяет, какие ресурсы и действия доступны пользователю после успешной аутентификации. Она используется для применения политик безопасности, чтобы ограничить доступ к сетевым ресурсам на основе прав пользователя.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤓 supabase-kt — это мультиплатформенный Kotlin-клиент для работы с Supabase, альтернативой Firebase с открытым исходным кодом!

✅ Библиотека поддерживает Android, iOS, JVM и JavaScript, предоставляя удобный API для работы с аутентификацией, базой данных Postgres, серверными функциями, файловым хранилищем и реальным временем. Она разработана для упрощения интеграции Supabase в Kotlin-приложения, обеспечивая гибкость и удобство работы с сервисами платформы.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
😴 Google выкатила топовый генератор кода — Firebase создает любые приложения с нуля и даже помогает задеплоить их.

🟠 Работает со всеми популярными языками прораммирования, включая Java, Rust и Swift, а также фреймворками и библиотеками.
🟠 Основа — новейшая Gemini от Гугла, она пишет, редачит и оптимизирует код за вас.
🟠 Можно работать с уже готовым проектом — сервис подскажет, как вести разработку дальше.
🟠 Разрабы обещают завезти кучу ИИ-агентов для помощи разработчикам.
🟠 БЕСПЛАТНО.
Тестируем здесь

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 cryptography-kotlin — это мультиплатформенная библиотека на языке Kotlin, предоставляющая унифицированный API для различных криптографических операций, таких как генерация случайных чисел, шифрование, вычисление хешей, цифровые подписи, вывод ключей и соглашения о ключах!

Библиотека поддерживает алгоритмы, включая AES, RSA, ECDSA, ECDH, SHA, HMAC и PBKDF2. Она не реализует криптографические алгоритмы самостоятельно, а оборачивает проверенные решения, такие как OpenSSL 3.x, WebCrypto и JCA, обеспечивая типобезопасный API с согласованным поведением на разных платформах.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #networks
🤔 Что такое протокол HTTPS?

HTTPS (HyperText Transfer Protocol Secure) - это защищенная версия протокола НТТР, использующая SSL/TLS для шифрования данных. Он работает через порт 443 и защищает передаваемые данные от перехвата или изменения.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
📞 Ищем ненужные зависимости в Dagger/Hilt графе

В большом проекте - большой граф зависимостей компонентов, с лишними инжектами. Проблема решается с помощью Dagger SPI.
Автор предлагает с помощью SPI строить полное дерево зависимостей, а затем вытаскивать наружу неиспользуемые инжекты.

На малом проекте, проще это все проверять руками, но если у вас гигантский многомодульный проект, то прогнать разок весь проект с легаси модулями по инструкции из статьи будет полезно для приложения.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
Задача: 710. Random Pick with Blacklist

Вам дано целое число n и массив уникальных целых чисел blacklist. Разработайте алгоритм выбора случайного целого числа из диапазона [0, n - 1], не входящего в черный список. Любое целое число, находящееся в указанном диапазоне и не входящее в черный список, должно с равной вероятностью быть возвращено. Оптимизируйте алгоритм так, чтобы он минимизировал количество обращений к встроенной функции random вашего языка. Реализуйте класс Solution: Solution(int n, int[] blacklist) Инициализирует объект целым числом n и целым числом из черного списка blacklist. int pick() Возвращает случайное целое число в диапазоне [0, n - 1] и не входящее в черный список.

Пример:
Input
["Solution", "pick", "pick", "pick", "pick", "pick", "pick", "pick"]
[[7, [2, 3, 5]], [], [], [], [], [], [], []]
Output
[null, 0, 4, 1, 6, 1, 0, 4]


👨‍💻 Алгоритм:

1⃣Создайте маппинг для чисел, входящих в черный список, чтобы сопоставить их с числами из диапазона [n - len(blacklist), n - 1], которые не входят в черный список.

2⃣Создайте массив для хранения возможных чисел для выбора, исключая числа из черного списка.

3⃣При каждом вызове функции pick() используйте встроенную функцию random для выбора случайного индекса из массива возможных чисел и возвращайте соответствующее значение.

😎 Решение:
import kotlin.random.Random

class Solution(n: Int, blacklist: IntArray) {
private val map = mutableMapOf<Int, Int>()
private val bound = n - blacklist.size

init {
val blackset = blacklist.toSet()
var whitelist = bound
for (b in blacklist) {
if (b < bound) {
while (blackset.contains(whitelist)) {
whitelist++
}
map[b] = whitelist
whitelist++
}
}
}

fun pick(): Int {
val r = Random.nextInt(bound)
return map.getOrDefault(r, r)
}
}


👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#новости
❤️‍🔥 Очень тихо зарелизилось мощное улучшение для App Distribution - AI testing agent. Как по мне, это самое полезное для Android разработки из последних релизов в области AI. Кратко:
The App Testing agent is a test case generation, management, and execution agent powered by Gemini in Firebase. You define test goals in natural language, and the agent uses AI to understand and navigate your app, simulate user interactions, and provide detailed test results.

Прошли времена описания тестов на естественном языке (Gherkin + Cucumber). Выглядит все оч просто - вы задаете название, цель, подсказки и критерии приемки. Тесты запускаются в облаке на девайсах.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #networks
🤔 Назовите три метода аутентификации пользователя.

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
😊 Топ-7 утечек памяти Android

Утечки памяти — тихие убийцы производительности приложений. Даже в 2025 году, когда Jetpack Compose доминирует в разработке пользовательских интерфейсов и появляются новые модные инструменты, эти ошибки все еще преследуют разработчиков.

Автор статьи разберет 7 наиболее распространенных виновников и вооружит вас проверенными в бою решениями.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Как ускорить релизную сборку

Из всех докладов на Mobius, которые мне удалось посмотреть, могу выделить классный доклад о том, как в Т-Банке случайно ускорили релизную сборку в два раза.

Я думаю, у многих в проектах работа R8 занимает больше всего времени из всего процесса сборки, а в крупных проектах выполнение этой таски может доходить до 3 часов — и это требует огромного количества оперативной памяти.

Так что же может значительно увеличивать длительность выполнения этой таски?

1⃣ Неоптимальные правила
Обычно это правила с условием, например, такие встречаются в библиотеке kotlinx-serialization. На них тратится больше всего времени, нужно быть аккуратнее с такими правилами и не дублировать их в своём коде, так как правила для R8 уже поставляются вместе с библиотеками.

2⃣ Огромное количество ресурсов
Таска shrinkResources может потреблять очень много оперативной памяти, и если в вашей дизайн-системе вы предоставляете большую библиотеку иконок, то, возможно, стоит пересмотреть подход и не тащить тысячи иконок, чтобы потом R8 не удалял их очень долго. Как вариант, можно рассмотреть загрузку иконок с CDN по запросу.

А главная проблема в том, что добавление любой библиотеки в проект или изменение правил в одном из модулей может сказаться на времени сборки всего проекта, поэтому нужно не забивать на мониторинг времени сборки приложения и вовремя реагировать на изменения.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
🛞 Extra Ktor Plugins — это набор мощных плагинов для расширения возможностей Ktor-приложений как на стороне сервера, так и на стороне клиента!

Эти плагины помогают решать распространённые задачи, такие как интеграция с Kafka, планирование задач, ограничение частоты запросов и повышение устойчивости через Circuit Breaker.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM