Telegram Web
​​Android Dependency Analyzer
#tools

Ресурс, который поможет проанализировать размер зависимостей в Android-проекте: ведь размер приложения — это важная метрика.

Следует сделать два простых действия: перейти на сайт ➡️ Droidanalyser, ➡️ ввести необходимую зависимость. Опционально можно ввести адрес репозитория.

Например, можно понять, что androidx.appcompat:appcompat:1.2.0
занимает около 380 килобайт в проекте.

🔻К недостатку можно отнести относительно медленную скорость работу ресурса.

Уверен, что после анализа зависимостей вы будете внимательнее относиться к тому, стоит ли заносить в проект какую-то новую либу. 👌🏻
​​Инструменты для Room
#tools #comments

Room — отличная библиотека для работы с базой данных, которую сейчас используют многие приложения. Мне кажется, что это один из самых удачных и удобных инструментов из Jetpack. Плюс к этому — это и рекомендованный инструмент от Google.
Но работу с Room можно улучшить, используя следующие библиотеки:

🔹Roomigrantинструмент, который позволяет автоматически генерировать миграции для Room, используя compile-time генерацию кода. По сути, библиотека использует созданные Room схемы и делает миграцию на их основе. Не уверен, что библиотека сделает всю работу за вас, но уж точно поможет автоматизировать эту рутинную работу

🔹RoomExplorer — быстрый viewer базы данных вашего приложения в отдельной Activity. Кроме этого, можно писать запросы для базы данных и видеть результат их работы. По сути, дублирует инструмент из Android Studio, но может быть полезным в случае работы с тестовым билдом.

А какие инструменты для улучшения работы с Room вы знаете?
​​Podlodka Android Crew 3 сезон

Ребята из Podlodka снова делают конференцию для Android-разработчиков. На этот раз нас ждут две недели, которые разделены на секции UI и алгоритмов.

На первой неделе рассмотрим UI: лайфхаки верстки, Constraint best practice, анимации, дизайн-системы, рендеринг UI на уровне системы. Выглядит всё довольно интересно, ведь с вёрсткой мы сталкиваемся на практике очень часто, но даже в этой области всегда есть куда расти.

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

Начало конференции — 1 февраля, а билет сейчас стоит 3900 рублей. Подробнее о программе конфереции можно почитать тут, там же можно приобрести билет.

Для подписчиков Android Live есть две крутых новости.
Во-первых, вы можете получить билет бесплатно, просто оставив свой ник в Telegram в форме до этой пятницы 29 января 18:00. Розыгрыш проведём в этот же день.
Во-вторых, есть промокод на скидку 300 рублей при покупке билета — ANDROID_LIVE_DC3.

Кстати, если вы выиграете билет в розыгрыше, но предварительно купите билет, то вам вернут за него деньги, так что нет смысла тянуть с покупкой до пятницы 😉.
​​Проясним TransactionTooLargeException
#theory

Существует ряд ошибок, которые сложно поймать при разработке или тестировании. TransactionTooLargeException относится к ним: он может не появиться каждый раз во время написания кода, но способен испортить жизнь пользователям во время использования приложения. Дополнительной проблемой является stack, который появляется после этого краша и не несёт информации о том, в каком месте приложения случился crash.

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

Кстати, одной из главных оптимизаций является передача небольшого количества данных через Bundle, но уверен, что это вы и сами знаете 😉.
​​ WorkManager 2.5.0
#updates #jetpack

Вышла новая версия WorkManager — 2.5.0. Что нового:

▪️управления процессами для установки фоновой работы. Полезная штука, если ваше приложение активно использует несколько процессов, и таким образом можно улучшить производительность фоновых операций. Для этого добавили новый артифакт: androidx.work:work-multiprocess:2.5.0 и метод для установки процесса по умолчанию для работы;

▪️повысили стабильность старта JobService из ActivityManager;

▪️ уменьшили размер буфера повторяемых задач с 7 дней до 1 + продолжительность keepResultsForAtLeast. Стоит быть осторожным, если вы выполняете свои задачи раз в несколько дней;

▪️добавили WorkManager Inspector, что на мой взгляд очень крутое обновление. Пока только в alpha версиях Android Studio, но уже выглядит обещающе и улучшит процесс отладки фоновых задач.

Подробнее про изменения можно почитать тут.
​​​​Результаты конкурса Podlodka Android Crew — 3 сезон
#конкурс

Итак, пришло время опубликовать результаты конкурса, который был описан тут.

В конкурсе принял участие 61 человек, при помощи генератора случайных чисел был выбран победитель — @max_ultra, с чем я его поздравляю! 🎊

Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
Жизнь разработчика в Германии
#интервью #экспаты

Друзья, наконец, вторая статья из рубрики, связанной с жизнью разработчиков в других странах готова.

Как всегда, она получилась объёмной и отвечает на все вопросы, которые вы задавали (и даже больше). Не скупитесь на лайки, потому что это мотивирует искать для вас авторов, а авторов — писать статьи. 🙃

Ссылка на статью тут, а вы обязательно пишите обратную связь в чат или мне в личные сообщения.
​​Kotlin Delegation
#kotlin

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

По сути, делегат передаёт обращения get()и set() к свойству: причём достаточно, чтобы у класса были методы getValue() и setValue() с определённой сигнатурой, без переопределения какого-то интерфейса.

Но одного определения будет недостаточно, поэтому вот пару полезных статей.
В этой автор рассказывает базовые принципы делегатов, а также дает пример для получения аргументов фрагмента, данных из SharedPreferences и получения данных из View.
В следующей рассказывается о других примерах применения этого инструмента.

Ну и не забывайте про документацию, где можно также вдохновиться полезными примерами. ✌️
​​Подробнее про Paging 3
#jetpack #room

Библиотека Paging 3 помогает отображать большие списки в RecyclerView. Сейчас она в статусе alpha, но уже хорошо работает.

Отмечу явные плюсы:
▪️поддержка Flow и Coroutines. Ну и кроме этого есть поддержка RxJava и LiveData, если она вам нужна;
▪️полностью написана на Kotlin;
▪️поддержка разделителей, статусов загрузки, состояний ошибки;
▪️интеграция с Room. Добавлю, что интеграция работает также и при использовании RawQuery из Room. Эта интеграция заметно упрощает работу с Paging 3.

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

Добавлю также один баг, который важно учитывать при использовании Paging 3. Эта библиотека работает некорректно, если поместить RecyclerView в ScrollView. Будьте внимательны при использовании!
​​Kotlin 1.4.30 и новый компилятор
#kotlin

Сегодня вышла новая версия языка Kotlin. Появилось достаточно много изменений: ▪️inline-интерфейсы;
▪️изменения в работе inline-классов;
▪️поддержка JVM records.
Полный список изменений можно найти тут.

Плюс к этому JVM IR backend компилятор перешёл в стадию beta 🎊.
О новом компиляторе говорят уже давно, и вообще он обещает быть интересным. Однако, для начала, надо убедиться, что он достаточно стабилен для public релиза. И это то, где вы можете помочь ему стать лучше 📈.

Сделать это достаточно просто:
1️⃣Включите новый компилятор его в своём конфиг файле и соберите проект хотя бы раз. В идеале включить его по умолчанию для вашего проекта, потому что не только сборка, но и дебаг имеют значение в этом тестировании.
2️⃣В случае если будут баги, то можно репортить их в Youtrack или публичный Slack Kotlin.

Давайте вместе доведём новый JVM IR backend до стабильного состояния!
​​Модуляризация Android-приложений
#architecture

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

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

Во второй и третьей частях рассматривается пример ручной и ленивой илициализации модулей их их сбрасывания.
​​Фидбек о канале. Пожалуйста не проходите мимо этого поста.

Всем привет. Это @al_gorshkov, автор этого канала и мне нужна ваша помощь.

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

Я создал небольшую форму с вопросами о Telegram и YouTube каналах. Пожалуйста, ответь на вопросы, ведь всё анонимно, а заполнение займёт буквально 2 минуты. А мне даст мотивацию радовать вас еще более качественным контентом на канале. 🤝

Давайте вместе сделаем Android Live ещё лучше!
​​KMM, Swift UI и Jetpack Compose
#compose #kmm #crossplatform

Мы с вами уже не раз обсуждали Jetpack Compose на канале, и даже провели шикарную live-coding сессию, которую можно посмотреть тут.

Кроме просто замены xml-подхода в нативной разработке, Compose отлично стыкуется с KMM и UI-слоем для Android. Ну а для UI-слоя на iOS подходит Swift UI, который тоже является декларативным фреимворком.

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

В любом случае, статья даёт возможность пощупать классные технологии. А запустить приложение, написанное при помщи Kotlin на iOS — бесценно.😁
​​Как сделать адаптеры в RecyclerView лучше?
#kotlin #recyclerview

При написании стандартных адаптеров в RecyclerView, мы часто сталкиваемся с дублированием кода. Особенно это заметно при использовании разных ViewType. Думаю, что многим знаком подобный код:

if (things.get(position) is Duck) {
return TYPE_DUCK
} else if (things.get(position) is Mouse) {
return TYPE_MOUSE
}


То есть при добавлении нового элемента в список, нам нужно менять адаптер в нескольких местах.

Существует несколько способов улучшения работы с адаптерами:

1️⃣ Использование layout в качестве идентификатора. Стоит помнить, что layout — это уникальный int, который можно использовать в качестве идентификатора. В этой статье автор предлагает использовать TypeFactory, где можно перечислить всю логику работы с идентификаторами для адаптера, и в случае добавления нового элемента – просто дописать строку в этой Factory. Хороший подход, который можно улучшить и использовать без добавления библиотек.

2️⃣ Использование Delegate для описание логики ViewHolder. Второй подход схож с первым. Можно прописать всю логику для работы с ViewHolder в одном классе Delegate. Потом просто регистрировать подходящие делегаты для нужного адаптера, не думая про имплементацию. Почитать подробнее про подход можно тут и уже есть библиотека, которую стоит изучить прежде чем затягивать к себе в проект.

3️⃣ Использование библиотек. Во втором подходе уже был описан пример созданной библиотеки, но кроме неё есть ещё их огромное множество. На мой взгляд, удачная библиотека описана в этой статье и называется Kiel. При помощи Kotlin DSL наш адаптер становится компактным, а кроме этого мы можем использовать библиотеку как с Paging Library, так и с Diff Utils. Стоит обратить внимание и применить подобный подход для своих приложений, если вам нравится DSL.

А как вы улучшаете свои адаптеры?
​​Миграция с SharedPreferences на Jetpack DataStore
#jetpack

Новая библиотека от Google призвана заменить уже давно знакомую библиотеку для хранения небольших данных — SharedPreferences.

Она существует в двух версиях: Preferences DataStore и Proto DataStore. Первая — даёт возможность хранить и получать доступ к данным по ключу, не требует предварительной схемы данных и не предоставляет type safety. Вторая — требует предварительную схему данных через protocol buffer, но при этом предоставляет type safety.

Почему же Google покусились на давно известную библиотеку? Главная проблема — это то, что при чтении данных из SharedPreferences необходимо открыть файл, где хранятся эти значения, и теоретически это может привести к ANR, если вызвать чтение из UI-потока.
Также в SharedPreferences нет type safety, что может привести к ошибкам во время работы приложения и крашам.

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

В целом, пока эта библиотека в alpha-версии, поэтому стоит внимательно тащить её в основной проект. Уже есть обёртки для RxJava 2 и 3 версии, если вы используете эти библиотеки. Но если думаете мигрировать — вот краткий гайд, который расскажет, как это сделать. Выглядит достаточно просто, поэтому проблем быть не должно. 🤞🏻
​​Data-классы не нужны в pojo
#comments

В чате канала начали активно обсуждать такую тему: стоит ли использовать data-классы в pojo-моделях?

С одной стороны, переопределяются полезные методы, которые могут понадобиться при работе с pojo-классами. Также, data-класс подходит под определение pojo, так как это чаще всего «классы для данных».

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

Например, если мы получаем json с сервера, то чаще всего нам нужно просто сделать из этого json некую модель (например entity для Room) и сохранить её. Никакие методы из pojo-классов не используются.

А как думаете вы? Обсудим в комментариях под постом.
​​IPC в Android
#theory

IPC — это понятие, означающее межпроцессное взаимодействие. Если мы говорим про это взаимодействие в рамках Android, то подразумеваем или общение между различными приложениями, или общение между разными процессами одного приложения (приложение, где некоторые их его компонентов запущены в разных процессах).
Поделюсь с вами несколькими статьями, которые расскажут про эту недооценённую тему больше.

В Android существует несколько видов межпроцессного взаимодействия:
🔹AIDL — приложение вызывает метод другого приложения на том же устройстве и эта процедура называется иначе – RPC (Remote Procedure Call). Так как эти методы могут быть вызваны многими приложениями одновременно, необходимо помнить про потокобезопасность. Расшифровывается он, кстати, как Android-IDL (Interface Definition Language). По факту, это один из самых базовых методов обмена сообщениями на языке. Понять, как настроить приложение на приём и отправку подобных сообщений можно тут.

🔹Messenger — метод похож на предыдущий, имеет такую же архитектуру. Его легче сделать в приложении, так как он по сути создаёт AIDL за вас, тем самым не заставляет разработчика делать лишнюю работу. Правда, цена такой простоты — меньшая гибкость по сравнению с AIDL. Почитать подробнее можно тут.

🔹Broadcast — наверное, самый популярный из описанных методов. Broadcast может быть отправлен только системой или другим приложением, а приложения могут слушать эти сообщения при помощи BroadcastReceiver. Важно помнить про области видимости ваших Broadcast, их следует настроить в AndroidManifest. Детальнее можно почитать тут.
​​Android 12. Developer Preview
#updates

Тут подвезли свежий Android 12, как раз для нас, разработчиков. Пока только на Pixel, но уже можно ознакомиться со списком нововведений:

▪️SameSite cookie в WebView — для улучшения безопасности WebView, добавили новый тип cookie, раньше он был только в Chrome.

▪️ограниченный Netlink MAC — ещё одна фича в безопасности, которая запрещает использовать реальный mac-адрес в приложениях. Теперь это нововведение будет действовать во всех приложениях, не зависимо от targetSDK.

▪️безопасный экспорт компонентов — защищает от случайного экспорта компонентов приложения. Теперь нужно настроить компоненты в манифесте, если вы хотите сделать их видимыми для других приложений. Стоит проверить флаг android:exported.

▪️изменения в PendingIntents. Добавили флаги FLAGMUTABLE или FLAGIMMUTABLE, которй обязателен для каждого PendingIntents. Будьте внимательнее, если используете их.

▪️блокирование подозрительных нажатий. Это касается приложений, которые используют флаги SYSTEMALERTWINDOW или FLAGNOTTOUCHABLE. Стоит проверить своё приложение, если вы по какой-то причине эти флаги используете. Чуть больше тут.

▪️улучшили кодирование видео. Теперь HEVC будет основным кодеком, который обещает лучшее качество по сравнению с остальными форматами.

▪️поддержка изображений в формате AVIF. Обещают лучшее качество по сравнению с JPEG при тех же размерах файла.

▪️оптимизации foreground service. Теперь будут блокировать foreground сервисы, которые стартуют из background, если targetSDK написан под Android 12. Уже давно рекомендуют использовать WorkManager для подобных задач. Также увеличили время отображения оповещения для сервисов до 10 секунд, чтобы зря не беспокоить пользователя. Одно из самых важных обновлений для нас.

▪️новый интерфейс для добавления контента. Помимо вставки текста, пользователь может добавить, перетащить интересующий его контент из другого приложения при помощи drag-and-drop. Не уверен, что эта фича будет популярной, но почитать о ней можно тут.

▪️звуковой эффект с тактильной связью. Теперь приложения могут использовать вибро больше, давая фибдек на звучащее аудио.

▪️изменили вид уведомлений. Теперь уведомления не могут занимать всю область, так как это могло запутывать пользователей. Все уведомления будут иметь единый стиль. Тут можно посмотреть, как они будут выглядеть. Хорошее нововведение, Android станет ещё симпатичнее. 🤞🏻Кроме этого, теперь из приложений можно переходить только в Activity, нельзя использовать «батуты» (так их назвал Google) в виде broadcast или service.

Подробнее прочитать про все нововведения можно тут и тут. Как по мне, очень классный список улучшений. 🙃

Как вам обновления от Google?
​​Результаты фидбека о канале
#android_live

В одном из постов я просил дать фидбек о канале.
И сегодня я хочу сказать большое СПАСИБО всем, кто принял участие в опросе ✌🏻И немного расскажу вам о результатах.

В опросе приняло участие 80 человек. Это не большая выборка, однако и по ней можно сделать некоторые интересные выводы.

Возраст большинства участников от 21 до 35 лет.
Опыт большинства участников: от 1-3 лет, на втором месте 4-6 лет и 6-8 лет.
Было приятным сюрпризом, что меня читает большое количество взрослых и опытных разработчиков 🤟.

Сюрпризом не стал тот факт, что большинство, а именно 71 человек — это мужчины, а 9 — женщины. Что подтверждает вывод: в разработке большинство — это парни, но большое спасибо тем девушкам, которых меньше, но они приняли активное участие в опросе.

Сфера занятости — достаточно очевидно, Android-разработка – 73 человека. Помимо этого, есть люди, которые занимаются iOS, Flutter, Unity и руководят IT-командами.

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

Большинству из опрошенных нравятся картинки-превью — 70 людям. Это радует, так как мне они тоже нравятся 😁. И не хотелось их удалять из постов.
Реклама не раздражает ещё большее число людей — 78 человек. Рекламы и дальше не будет много, и она точно останется тематической.

Узнал, что большинству не очень нужен ещё один чат, который есть у канала — Уютный Android Live.
Я понимаю причину, так как чатов становится слишком много и выбирать интересные становится всё сложнее. Спешу образовать тех, кому он нравится – чат будет существовать и дальше, сохранив свой «уют».

Большинство из опрошенных не смотрит YouTube-канал. Пока он в начальном состоянии, но уже есть интересные идеи, анонсы которых вы обязательно увидите тут.

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

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

И ещё раз спасибо всем за ответы и пищу для размышления. И я всегда открыт для обратной связи 😉.
​​Intent-фильтры в Android 12
#updates

Давайте детальнее вникать в те изменения, которые появились в Android 12. 👇🏻
Одно из них:

Activity Service или Broadcast Receiver с описанными intent-filters теперь должны явно указывать, следует ли их экспортировать или нет.

Если установить приложение с target SDK Android 12 и не описать явно флаг android:exported, то получите Exception. Но не стоит слепо добавлять true во все элементы, чтобы убрать это падение. Лучше задуматься, какие компоненты действительно должны быть видны другим приложениям.

Вот некоторые из тех, где с большей вероятностью должен быть true:
🔹Activity c android.intent.category.LAUNCHER;
🔹Activity c android.intent.category.VIEW;
🔹Activity c android.intent.category.SEND;
🔹Activity c android.media.browse.MediaBrowserService;

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

Детальнее можно почитать в этой статье.
2025/08/29 12:36:38
Back to Top
HTML Embed Code: