Telegram Web
​​Kotlin Multiplatform Mobile теперь в Alpha
#разработка

Сегодня команда JetBrains анонсировала альфа версию Kotlin Multiplatform Mobile! Это SDK, который позволяет писать бизнес-логику приложений сразу под 2 платформы. 👍🏻 Альфа версия включает в себя также и плагин для Android Studio, который позволяет писать такие проекты.

Уже есть примеры приложений, которые использовали у себя KMM:

Quizlet мигрировали бизнес-слой с JavaScript на KMM и значительно улучшили производительность как Android, так и iOS приложений;

Fastwork начали использовать KMM для шаринга бизнес-логики и API для нескольких команд разработки;

Yandex.Disk начали экспериментировать с небольшой фичи, после чего переписали всю синхронизацию данных на KMM.

Больше информации и полный текст анонса можно почитать тут.

Что-то конец лета выдал нам кучу новинок и теперь не знаешь даже, за что ухватиться в первую очередь 😄
​​Зачем использовать Material Design тему?
#разработка #статьи

Любое Android-приложение соседствует с множеством других установленных приложений. Именно поэтому одним из принципов Material Design — это: «Все приложения должны иметь схожее поведение в рамках одной операционной системы».

Чтобы этого достичь, Google рекомендует использовать Material Design Components. Кроме этого, есть MaterialComponents Theme для приложения.

Давайте рассмотрим, почему вам стоит использовать именно её вместо AppCompat или стандартной библиотеки.

1️⃣Поддержка большего числа компонентов. MDC даёт довольно большое количество стандартных компонентов для показа, а также «расширяет» возможности текущих.
Например, MaterialButton предлагает гораздо больше стандартных стилей, чем обычный Button.

2️⃣Material Theming — это способ, который позволяет правильно кастомизировать приложение конкретно под ваш дизайн.
При помощи MDC можно настраивать цвета, тип шрифта, форму для приложения и использовать их при помощи атрибутов.

3️⃣Темная тема. Поддержка тёмной темы — это распространённая фича в приложении.
MDC позволяет настраивать этот паттерн из коробки, учитывая настройки пользователя в системе.

4️⃣Material Motion. MDC предлагает целый раздел о том, как должны быть устроены переходы между экранами. Их не очень сложно применить в проект, но при этом само приложение выглядит гораздо живее.

5️⃣Jetpack Compose. Уже не в первый, и далеко не в последний раз мы будем говорим об этом новом фреимворке. MDC уже готовит свою кодовую базу для перехода с Compose в будущем, что существенно ускорит миграцию нам.

В целом, переход на Material Theme довольно прост и даёт преимущества. На него стоит перейти только ради стилей для стандартных виджетов, которые особенно круто выглядят на последних версиях Android.

Подробнее про эти преимущества можно почитать в этой статье.
​​Уменьшение времени старта приложения с I/O prefetching
#разработка #статьи

Сегодня состоялся релиз Android 11, и мне бы хотелось рассмотреть одну из фич, которая может неплохо улучшить время старта приложения — IORap.

Разработчики обещают уменьшение времени старта приложения, как минимум 5%, на большом числе устройств, хотя некоторые из наблюдаемых приложений показывали улучшения более, чем на 25%.

IORap работает как независимый сервис на устройстве и пытается предугадать, какие IO сервисы будут необходимы на устройстве. И если раньше они вызывались в тот момент, когда были нужны приложению, то теперь они будут браться из pagecache, улучшая время старта приложения.

Ребята подсчитали, что 80% популярных приложений из Google Play проводят больше 10% времени старта, блокируя I/O во время запуска, поэтому от этой фичи пользу получитат довольно многие приложения.

Подробнее о том, как работает OIRap можно почитать тут.
​​Как использовать Jetpack DataStore?
#разработка #статьи #опрос

С появлением Jetpack у нас появилось довольно много библиотек, делающих жизнь разработчиков проще. Думаю, что для многих не секрет, что недавно Google представили ещё одну крутую библиотеку — DataStore, которая призвана заменить старый добрый SharedPreferences, имеющий недостатки.

DataStore предлагает асинхронный API для работы с данными, в то время как SharedPreferences даёт такую возможность только при помощи listeners;
DataStore безопасно вызывать в UI-потоке, так как под капотом он использует Dispatchers.IO
DataStore лучше работает с Runtime Exceptions, в то время как SharedPreferences могут вызывать ошибки при парсинге, которые сложнее поймать;
• есть API для миграции с SharedPreferences;
• работают на основе Coroutines и Flow из коробки.

В общем, это довольно мощная библиотека, которую вскоре будут использовать большинство приложений. 🤓
Ну а если ваше приложение может использовать alpha-версии библиотек, то у вас уже есть возможность попробовать эту библиотеку.

Хорошая статья с пошаговым руководством тут.

Как вам библиотека? На мой взгляд, получилось довольно круто.
​​С днем программиста, друзья!

Время мчится, за окном осень и приходит наш профессиональный праздник 🤗.
Сегодня 256 день в году, 12 сентября, и уже несколько лет именно в этот день отмечается день программиста.

Желаю всем нам крутых проектов, интересных задач, профессионального и личностного роста. А завтрашний день лучше используйте, чтобы провести его в теплом круге друзей, а не сидя за IDE.👨‍💻

Хорошего вам Дня программиста и выходных!
​​Лимит уведомлений от одного приложения
#разработка #статьи

Задумывались ли вы, есть ли ограничение на максимальное количество уведомлений от одного приложения? Если попытаться найти какие-то упоминания об этом в документации, то там не будет какой-то внятной информации об этом. Однако, такой лимит существует.

Автор статьи провёл исследование и пришёл к выводу, что количество уведомлений от одного приложения контролируется производителем смартфонов.
Например, у Google Pixel 3A максимальное количество уведомлений равно 25, а у OnePlus 6T или Samsung — 50.

Вы можете подумать: но ведь 25 уведомлений — это много, что уж говорить про 50. Но если ваше приложение завязано на уведомлениях (например мессенджер), то такое ограничение может привести к некорректной работе приложения, и тем более сервисов.

Так что рекомендую проверить своё приложение, если оно может выводить такое количество уведомлений пользователю.
​​Не используйте LiveData в репозиториях
#разработка #статьи

Одной из частых ошибок при разработке приложений является использование LiveData в репозиториях. Связано это прежде всего с тем, что изначально Google советовали использовать её подобным образом.

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

Альтернативой LiveData будет использование Flow, который имеет больше контроля над местом, где он исполняется. Подробнее об этом можно почитать тут.
​​WorkManager. Базовая информация
#разработка #новичкам

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

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

Первая даёт базовые основы использования WorkManager: какие зависимости добавить, какие есть типы операций и параметры для них.

Вторая описывает работу с WorkManager чуть дальше и рассказывает о цепочках запросов, прогрессе, статусе операции и как завершить текущую работу.
Жизнь разработчика в Израиле
#интервью #экспаты

Друзья, первая статья из новой рубрики на канале готова.

Она получилась объёмной и рассматривает большинство вопросов жизни в Израиле и отвечает на те вопросы, которые вы задавали: как найти работу, какая там зарплата, насколько легко получить визу и гражданство, как хорошо развита медицина и быт в целом.
Была проделана огромная работа, и я надеюсь, что вам понравится статья.😎

Ссылка на статью тут, обязательно ставьте лайки (их можно поставить не один раз, а аж 50😁) !

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

Давайте сделаем наш чатик уютным и интересным!
​​Paging3
#jetpack #чтонового

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

Текущая версия — 3.0.0-alpha03.

Что нового?
🔸полностью написана на Kotlin;
🔸поддерживает Coroutines и Flow из коробки, как и RxJava с LiveData;
🔸кэширует данные в памяти, чтобы помочь в распределении системных ресурсов и загрузки данных без задержек;
🔸улучшенный адаптер для RecyclerView;
🔸встроенная поддержка обработок ошибок, повторных запросов и обновлений.

Подробнее
Ссылка на статью с примерами использования тут.
Пример codelab с Paging3 тут.
​​Mobius 2020
#конференции

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

В этом году конференция стала online и пройдёт с 11 по 14 ноября. Нас ждёт: 4 дня эфира, несколько треков, около 20 докладов, воркшопы и Q&A-сессии.

Для подписчиков канала ребята дают скидку на билеты из категории Personal в 1500 рублей: AndroidLive2020aupc.

Программа потихоньку заполняется, и сейчас самое время купить билеты по более низкой цене. Ссылка с информацией тут.
​​Как оптимизировать RecyclerView?
#комментарии #recyclerview

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

Автор статьи предлагает следующие оптимизации:

🔸использование библиотек для загрузки изображений. Garbage collector мог бы быть причиной неотвечающего UI, если бы не bitmap pool, который встроен в большинство современных библиотек для загрузки изображений. Думаю, что мало кто сегодня пытается самостоятельно управлять показом изображений вручную, поэтому продолжайте делегировать все задачи, связанные с загрузкой изображений специальным библиотекам.

🔸установите ширину и высоту для ImageView. Очень часто изображения, получаемые с сервера имеют динамические параметры ширины и высоты. Если мы показываем изображения без учёта этих параметров, то при полной загрузке можем получить «мигание» интерфейса. Чтобы этого избежать, попробуйте вычислить ширину и высоту или соотношение сторон заранее, до загрузки картинки.

🔸оптимизируйте метод onBindViewHolder. Проверьте метод onBindViewHolder и сделайте его максимально легким. Это также даст прирост к производительности RecyclerView

🔸используйте DiffUtil. При обновлении адаптера старайтесь использовать DiffUtil. Под капотом он использует методы для изменения элементов по позициям, а не полное обновление списка (notifyDataSetChanged). Кстати, если хотите ещё больше оптимизировать свой список, попробуйте использовать асинхронный DiffUtil на coroutines. Ссылка с деталями тут.

🔸избегайте вложенных view. Довольно базовое правило, нарушение которого становится ещё более критичным в RecyclerView. Добавлю, что тут важно следить за layout, которые использут веса для отрисовки.

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

🔸переиспользуйте RecyclerViewPool. Довольно хорошей оптимизацией является переиспользование RecyclerViewPool при наличии одинаковых элементов. Пример можно посмотреть в статье.

🔸поэкспериментируйте с setItemViewCacheSize. Из документации следует, что этот параметр устанавливает количество ViewHolder, которые не показаны на экране перед добавлением их в RecyclerViewPool. Мы можем поэкспериментировать с этим параметром, чтобы увеличить количество ViewHolder, невидимых на экране и уменьшить количество вызовов onBindViewHolder.

А что вы бы ещё добавили к этому списку?
​​Podlodka Android Crew — 2 сезон
#конференции

Летом ребята из Podlodka делали двухнедельную онлайн конференцию для Android-разработчиков. И вот, уже через неделю начинается второй сезон Podlodka Android Crew!

Что нас ждёт:
🌟 парное программирование от Дениса Неклюдова и Степана Гончарова;
💰доклад о том, как из мобильного разработчика вырасти в СТО;
🔥собеседование наоборот: теперь будут собеседовать не людей с конференции, а экспертов, которые там присутствуют;
☕️куча сессий и, конечно же, холиваров.

Начало конференции — 5 октября. До четверга, цена билета — 3400 рублей, что весьма демократично, учитывая количество контента. Подробнее о программе и билетах тут.

И снова, у вас, подписчиков Android Live, есть шанс выиграть билет бесплатно. Для этого не нужно никуда подписываться: просто оставь свой ник в форме до 1 октября 18:00. В этот же день будет розыгрыш одного билета.

До встречи на конференции!
​​Room и связь Many to Many
#room

На мой взгляд, одна из самых неудобных вещей, которая есть в Room — это работа со связью Many to Many.

Для тех, кто не использовал эту связь в Room, я расскажу вкратце. Больше деталей можно почитать тут.
Для её создания в Room есть следующий механизм:
🔸создаётся ассоциативная таблица с идентификаторами первой и второй таблицы;
🔸создаётся новый data-класс, где прописывается связь через Junction, указывая эту таблицу в качестве связи.

По идее, все довольно просто, но главная сложность возникает в фильтрации данных. В документации показан пример с получением полного списка данных, но если её нужно сделать, то единственный вариант — использование @RawQuery вместо @Query и генерирования запроса вручную.
Для такой связи нужно будет создать INNER JOIN по ассоциативной таблице, и дальше применить нужные фильтры.

Главный недостаток тут — отсутствие проверки правильности запроса во время компиляции, поэтому будьте особенно внимательны при его составлении.
​​Результаты конкурса Podlodka Android Crew — 2 сезон
#конкурс

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

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

Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
Поиск работы, оптимизация резюме. Взгляд со стороны HR
#конференции

Каждый из разработчиков рано или поздно задумывается о смене работы. Мы готовимся к собеседованиям, учим алгоритмы, но забываем о том, что прежде всего видят рекрутеры — резюме. У многих даже нет хорошо оформленного CV! 😩

В сообществе GDG Bryansk в это воскресенье, 4 октября будет митап, посвящённый поиску работы и оптимизации резюме со стороны HR.

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

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

Ссылка на трансляцию тут, а больше деталей можно узнать тут.

До встречи на митапе!😎
​​Оптимизируем скорость сборки приложения
#gradle

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

Но есть советы, которые можно попробовать применить сразу после старта проекта.
Для начала выполните следуюущую команду, чтобы понять текущую скорость сборки:
./gradlew --profile --offline --rerun-tasks assembleDebug

Начнём улучшать:
🔹применим org.gradle.configureondemand=true — флаг включает конфигурацию проектов по запросу, что позволяет собирать только то, что участвует в сборке.

🔹увеличим Java heap при помощи org.gradle.jvmargs=-Xmx1536m, если позволяет ваша оперативная память.

🔹задействуем kapt.use.worker.api=true. Флаг задействует worker API для стадии annotation processing в kapt, а также перемещает выполнение этой стадии отдельно от Kotlin Compile Daemon.

🔹включим параллельную сборку мультимодульных проектов при помощи org.gradle.parallel=true.

🔹если в проекте есть room, то добавим room.incremental = true. Начиная с версии 2.3.0, флаг включен по умолчанию.

🔹добавим org.gradle.unsafe.watch-fs=true. Работает флаг так: чтобы gradle мог определить, надо выполнять задачу или нет, ему необходимо проверить, был ли изменён файл с момента последней сборки. Daemon хранит эту информацию в памяти, если задействован данный флаг. Иначе — он собирает её для каждой сборки. Больше деталей можно узнать тут.

🔹можно включить конфигурационный кэш при помощи org.gradle.unsafe.configuration-cache=true.

🔹если у вас есть png в проекте, то можно выключить автоматическое сжатие png-файлов для сборок, отличных от debug, где оно автоматически выключено при помощи crunchPngs false.

🔹посмотрите, чтобы у вас везде в проекте были указаны точные названия версий, избегайте названий в виде 1.+.

Конечно, это далеко не полный список возможных улучшений, но даже эти флаги ускорят сборку вашего проекта. Чуть больше информации о них можно почитать в статье.
​​Безопасность современных Android-смартфонов
#security

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

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

🔸три статьи про шифрование: первая, вторая и третья части. Они расскажут о том, как шифровать данные внутри приложения и об их хранении.

🔸немного о том, как работает биометрия, и как её лучше использовать.

🔸чуть позже нас ждёт ещё четыре статьи: про нативный код, сертификаты и изменения безопасности в Android 11.
​​Наименование строковых ресурсов
#resources

Мы, как разработчики, часто следуем различным практикам, которые улучшают код. Например, мы следуем camelCase при написании переменных.

Но часто мы не обращаем внимание на то, как пишем ресурсы в приложении. Давайте поговорим о том, как лучше именовать ресурсы в файле strings.xml.

В целом, существует так называемая практика <HOW>_<DESCRIPTION>. Это практика, где первым словом вы указываете то, как использовать ресурс в проекте, а вторым — что означает данный ресурс. Например, label_home или hint_user_name.

В своих проектах я немного расширил эту технику до <HOW>_<WHERE>_<DESCRIPTION>. В этом случае where — это экран или модуль, где используется ресурс. Например, title_registration_pass. Если ресурс используется в нескольких местах, то параметр where опускается.

Для себя также обозначил следующие how:
🔸title — заголовки;
🔸hint — подсказки в edittext;
🔸msg — сообщения или обычные текста на экранах;
🔸error — сообщения об ошибках;
🔸action — кнопки или какие-то действия.

Подобный порядок делает использование ресурсов удобным, что особенно актуально, если ваш проект переведён на нескольких языков.
​​Разбираемся в Jetpack Compose
#jetpack #compose

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

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

На мой взгляд, это хорошая статья, если вы совсем не знакомы с понятием декларативного UI или задавали себе вопрос, для чего конкретно в будущем использовать Compose.
2025/08/30 04:47:13
Back to Top
HTML Embed Code: