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


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

Рекламу не размещаю
Download Telegram
​​Как узнать время старта приложения?
#performance

Тестирование времени запуска приложения — это довольно популярная задача оптимизации приложения. От времени старта зависит общее впечатление от использования продукта.

Совсем недавно Google анонсировал библиотеку App Startup, которая позволяет правильно инициализировать компоненты для приложения.
Но чтобы понять, насколько улучшилось время запуска, нужно знать результаты до и после её применения.

Самым распространённым подходом является использование функции System.currentTimeMillis(), при помощи которой можно залогировать время, и вычислить разницу межу нужными нам кусками кода.
Но главная проблема в том, что мы не можем узнать время запуска до начала вызова нашего кода, соответственно и до вызова этой функции.

Есть хороший подход, описанный в этой статье. Автор делится командами adb, которые позволяют понять время запуска приложения с момента клика на иконку.

Итоговая команда выглядит так:

adb shell am start-activity -W -n com.android.samples.mytest/.MainActivity | grep "TotalTime" | cut -d ' ' -f 2

Кроме того в статье, говорится о том, как избежать ситуацию с троттлингом процессора, что очень сильно может помешать тестированию производительности приложения.
​​Jetpack Compose и традиционные View
#compose #jetpack #view

Многие разработчики, которые хотят переписать своё приложение на Jetpack Compose задумываются об обратной совместимости с текущими View. Ведь это непосильная задача, особенно для небольших команд.
К счастью, у нас есть возможность использовать традиционные View и Layout в Compose и наоборот.

Существует класс AndroidView, который легко позволяет использовать обычные View внутри Composable-функций. Это особенно полезно при использовании сложных компонентов, например MapView.

Но есть также класс ComposeView, который позволяет использовать Composable-классы внутри xml-файлов. После это необходимо задать контент в виде Composable фукнции.
Также есть AbstractComposeView, который даёт возможность сделать Composable view, где внутри можно прописать необходимую функциональность.

Подробнее можно почитать в этой и этой статьях.

Jetpack Compose очень крутой фреимворк, который станет будущим UI нативной Android-разработки. Если вы хотите нырнуть в Jetpack Compose больше, то есть канал @android_compose, где автор делится полезными статьями про этот инструмент.

Совсем скоро будет анонс нашего мероприятия, где каждый из нас сможет «пощупать» Compose на реальном проекте 😎
​​Best practices для безопасности приложений
#security

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

👉 опасайтесь неявных Intents. Напомню, что это такие Intents, которые позволяют показать диалог выбора приложения через который можно открыть предлагаемый файл. Типичный сценарий — это sharing файлов, когда мы выбираем нужное нам приложение из кучи вариантов. Важно осторожно относиться к ним, потому что «подписаться» на передаваемые файлы могут любые приложения.

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

👉 используйте Internal Storage. Для сохранения приватной информации нельзя использовать внешнее хранилище, к которому есть доступ других приложений. Кроме того, внутреннее хранилище удалится, если пользователь захочет удалить ваше приложение.

👉 помните про приватный режим SharedPreferences. Кстати, стоит уже обратить внимание на свежий Jetpack DataStore, который скоро придёт на замену префам.

👉 проверьте ContentProvider. Если у вас есть этот компонент, то проверьте, надо ли вам отдавать данные наружу. Если нет, то пропишите флаг android:exported="false», что скроет ваши данные внутри приложения.

👉 используйте SSL-соединения. Все запросы, которые вы делаете на сервер должны выполняться через https. Кроме того, подумайте о конфигурации trust manager для сетевых запросов. Чуть больше можно почитать тут.

👉 используйте WebView с осторожностью. Важно запретить пользователю уйти куда-то вне вашего контента WebView. Помните также о Chrome Tabs, если вам нужно просто показать контент из сети, но внутри приложения.

👉 проверьте набор Permissions. Важно, чтобы ваше приложение не запрашивало тех разрешений, которые ему не понадобятся для работы. Хорошим советов тут будет использовать Intent вместо разрешений, если возможно. К примеру, есть Intent для добавления контакта в телефонную книгу, и он избавит вас от запроса WRITE_CONTACTS. Очень часто разработчики запрашивают разрешение на запись файлов, хотя им достаточно только считывать их.

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

Если хотите добавить ещё каких-то правил или обсудить описанные, то обязательно пишите в чат или мне.
​​Kotlin DSL для runtime permissions
#kotlin #kotlindsl #library

Запрос разрешений в Android довольно распространённая практика, и многие разработчики используют библиотеки для упрощения этого процесса.

Одна из них — это Eazy Permission, особенность которой в использовании Kotlin DSL, возможности использовать LiveData и coroutines для получения ответа об успешном запросе.

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

Ссылка на библитеку тут, а подробнее почитать об использовании можно тут
​​Android Study Jams. Первый митап
#intro

Большинство моих подписчиков — это практикующие Android-разработчики или люди, которые интересуются технологиями.
Если вы не пишите под Android, или знаете тех, кто давно хотел это сделать, но не знал с чего начать, то этот пост для вас.

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

К счастью, эту проблему тоже можно решить.
Я помогаю ребям из студенческого сообщества DSC (Developer Student Clubs) в первых шагах, связанных с Android. Первый митап будет у сообщества из Саратова. Уже завтра, 4 декабря в 18:30 по МСК, мы вместе сделаем небольшое, но рабочее приложение под Android! Во время мероприятия вы сможете задавать ваши вопросы.

У каждого есть возможность поучаствовать в этом, достаточно просто перейти по ссылке и в деталях сообщения заполнить форму на участие.
Участие абсолютно бесплатное, а мероприятие будет онлайн. От вас не требуются знания программирования (хотя с ними будет проще).
Обратите внимание, что перед воркшопом нужно установить Android Studio и добавить эмулятор, инструкция есть тут.

Торопитесь, ведь число мест ограничено🤓
​​Podlodka Crossplatform Crew
#conference

Тут ребята из Podlodka сообщают, что совсем скоро состоится неделя первой конференции Podlodka Crossplatform Crew. Старт 14 декабря. Что там будет?

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

Никаких “Hello World!” на абстрактных примерах, только настоящий опыт внедрения и использования кроссплатформы в реальных проектах от топовых экспертов.

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

• интервью про кейсы внедрения Flutter, React Native, Kotlin Multiplatform Mobile в разных компаниях;
• воркшопы по интеграции разных технологий в существующий проект;
• рулетка кейсов и шоу “Прожарка”. Описывать бессмысленно – это надо видеть! 🤓

Подробное описание, спикеры и билеты доступны на сайте по выгодной цене.
Ну и традиционно, у моих подписчиков есть возможность выиграть один билет. Как и раньше, нужно просто оставить свой ник Telegram в форме. Форма открыта до 11 декабря, 13:00, розыгрыш будет в тот же день.

Если вы выиграете билет, но при этом вы уже купили один — то не переживайте, организаторы вернут вам деньги, так что затариться по выгодной цене лучше уже сейчас 🤓.
​​Kotlin Flow
#flow #kotlin #documentation

Совсем недавно Google добавили в раздел документации информацию про Kotlin Flow. Давайте посмотрим подробнее, что там есть.

Вначале описывается то, что из себя представляет Flow: по сути, это тип, который похож на Iterator, который также отдаёт последовательность данных, но при этом использует suspend-функции для работы. Работа любого Flow делится на этапы создания, обработки и получения данных.

Для создания Flow можно использовать специальный builder, в котором можно вызвать функцию emit для публикации данных во Flow. Есть также две особенности работы Flow, о которых надо помнить:
🔹Flow последователен, поэтому все вызываемые suspend-функции ждут результата выполнения друг друга.
🔹flow builder не может «емиттить» данные через другой CoroutineContext.
Описан также хороший пример для понимая работы Flow.

Дальше есть пример использования оператора map — как пример изменения данных, формируемых Flow.
Сразу за ним — использование оператора collect для получения данных.

📌Важно обратить внимание на использование оператора flowOn, так как он распространяет своё действие на операторы, написанные выше.

Не забыли упомянуть и про обработку исключений, используя оператор catch.

Подробнее можно почитать тут. Как по мне, получилась хорошая документация, описывающая базу для работы с Flow. Годно.✌🏻
​​Jetpack Compose и эквивалентные View
#compose #view #tips

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

Тут @loskin поделился крутым ресурсом, который сопоставляет традиционные View с эквивалентами из Compose. Кроме этого, даст ещё и ссылку на пример из GitHub и на официальную документацию🔥.

А если перейти на начальную страницу, то можно найти подборку примеров приложений, использующих Jetpack Compose.

Даже если вы сейчас не пишите на Compose, то стоит сохранить сайт в закладки, так как в будущем он вам обязательно пригодится.
​​Подмена Runtime Permissions
#security #subscribers

Тут @vitach скинул свою статью, где описывает, как подменить Runtime Permissions на свежих версиях Android.

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

Идея заключается в наложении поверх этой системной Activity своей с флагом android:windowIsTranslucent=true, который позволяет делать Activityс прозрачным фоном, а также добавить парочку флагов, чтобы убрать фокус:

FLAG_NOT_FOCUSABLE — убирает возможность взаимодействия с методом ввода;
FLAG_NOT_TOUCH_MODAL — отправляет события touch за пределы нашего окна;
FLAG_NOT_TOUCHABLE — убирает возможность получать события касания.

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

Баг работает на версиях Android >= 7.1.1, так как до этой версии показывался диалог с предупреждением о перекрытии окна.

Ссылка на код тут, а статья с описанием тут. Ну и читайте внимальнее те разрешения, которые даёте установленным приложениям.🙄
​​Результаты конкурса Podlodka Crossplatform Crew
#конкурс

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

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

Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
​​Как использовать Ktor на сервере?
#ktor #kotlin #server

Странно видеть подобный заголовок на канале для Android-разработчиков. Ведь для нас создание сервера — это другой мир, в который не особо-то и хочется вникать. 😊
Для своих проектов можно использовать Firebase, но с ростом проекта он может стать дорогим. Можно выбрать другое решение — написать свой собственный сервер на всеми нами любимом Kotlin.

Есть библиотека Ktor, которая позволяет делать асинхронные запросы на клиенте и сервере, используя Kotlin и под капотом построенная на Coroutines. Звучит интересно, да и написать свой собственный сервер для своего приложения — тоже отличный вызов. 😎

Подробнее о том, как использовать этот подход можно почитать тут и тут.
Авторы рассказывают о том, как сделать первый проект, какие зависимости надо добавить, а также какой хостинг можно использовать для работы онлайн.
​​Jetpack Compose — Live coding сессия
#compose #youtube

Друзья, у меня для вас хорошая новость. Канал Android Live расширяется и переходит в том числе и на YouTube!

И первая трансляция будет связана с горячей темой — Jetpack Compose. 😎
Да-да, тот самый, новый фреимворк, который позволяет писать UI в декларативном виде и в будущем заменит текущий xml-подход.

Вы много читали о нём на канале, а может быть уже попробовали его в небольших проектах.
В любом случае у вас могли остаться вопросы, ответы на которые вы можете получить на стриме!

Гостем будет Григорьев Дмитрий — автор канала который целиком посвящён Jetpack Compose и имеет внушительный опыт написания приложений при помощи Jetpack Compose.

Вместе с ним мы сделаем простое приложение, где рассмотрим:
🔸 как лучше строить архитектуру;
🔸 как делать списки из разных типов view;
🔸 что делать с навигацией между разными экранами;
🔸 как сделать анимации;
🔸 что делать с текущими приложениями;
🔸 и много другое.

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

Стрим состоится 21 декабря в 18:30 по МСК. Ссылка на трансляцию появится позже, а пока можете подписаться на пока пустой канал Android Live, чтобы не пропустить новые видео. 🤓
Android Live 🤖 pinned «​​Jetpack Compose — Live coding сессия #compose #youtube Друзья, у меня для вас хорошая новость. Канал Android Live расширяется и переходит в том числе и на YouTube! И первая трансляция будет связана с горячей темой — Jetpack Compose. 😎 Да-да, тот самый…»
​​Room и опциональные параметры
#room

Есть достаточно интересная фича Room о которой не написано в документации, но которая может здорово облегчить жизнь разработчикам.
Думаю, причина заключается в том, что эта функция лишь косвенно связана с Room, а больше связана с написанием SQL-запросов. 🙂

Опытным путём получилось её найти, и спешу поделиться этим лайфхаком с вами.

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

@Query("SELECT * FROM User WHERE name = :name")
fun getUsers(name: String? = null): List<User>

При такой записи параметр считается за часть запроса, и не передаёт name, в этом случае список будет пустым.
Но можно чуть-чуть поменять запрос, и всё работает корректно:

@Query("SELECT * FROM User WHERE (:name IS NULL OR name = :name)")
fun getUsers(name: String? = null): List<User>

При такой записи параметр name будет игнорироваться, если он будет null, и возвратится весь список, имеющийся в базе данных.
Особенно круто эта фича заходит, если фильтр состоит из нескольких полей (3 и более).

А какие у вас есть неочевидные кейсы при работе с Room?
​​​​Android Study Jams. Ещё митапы
#intro

В начале месяца я рассказывал вам о мероприятии для начинающих разработчиков — Android Study Jams, которое было организовано студенческим сообществом из Саратова и где я был спикером.

Мероприятие прошло хорошо, и у тех, кто хотел побывать на нём, но не смог, есть ещё целых два шанса прикоснуться к разработке под Android.

Первое мероприятие будет сегодня, 17 декабря в 17:30 по МСК. Зарегистрироваться можно тут, а организатором является DSC Брянск ✌️

А если у вас не получится присоединиться сегодня, или останутся вопросы по приложению, то есть шанс задать их завтра, 18 декабря в 18:30 по МСК. Детали тут, а организатором является DSC Воронеж.

Здорово, когда в разных городах создаются новые сообщества и организуются мероприятия, где с нуля можно попробовать технологии.
​​Почему Kotlin Synthetics Deprecated?
#kotlin

Несколько месяцев назад Android Kotlin Extensions Gradle плагин был помечен depricated. Он давал нам две классных фичи:
Synthetics — плагин, который позволяет заменить findViewById;
Parcelize — плагин, который позволяет создавать Parcelable при помощи одной аннотации, без использования boilerplate.

Parcelize никуда не уходит, а только перемещается в отдельный плагин kotlin-parcelize, а вот Synthetics уходит навсегда. Давайте посмотрим предпосылки, почему это произошло.

Но прежде рассмотрим все существующие подходы для поиска View.

1️⃣findViewById — функция, которая проходит по иерархии View и находит по идентификатору ту, которая необходима.
Имеет ряд существенных недостатоков:
метод поиска дорогой и разработчики часто используют этот метод повторно не задумываясь о последствиях производительности;
метод не null safe, то есть если в дереве не найдётся View с переданным идентификатором, то будет NullPointerException ;
нет кастования до требуемой View до Android API 26;
много boilerplate кода, особенно когда в классе много View.

Есть библиотека Butter Knife, которая заметно уменьшала количество кода, однако и сократила скорость сборки приложения, к тому же не решала ряд проблем. Сейчас она также depricated.

2️⃣Kotlin Synthetics — по сути вызывал описанный выше метод единожды и кэшировал полученные значения.
Из плюсов:
нет boilerplate кода, ведь всё что требуется — это настроить плагин в Gradle и использовать идентификаторы прямо из xml-файла;
type safety, то есть вам не надо делать никаких кастов.

Но давайте пройдёмся по недостаткам:
частично null safe. К счастью, если вы удалите какую-то view из xml, то в коде также будет подсветка удалённой View. Однако, если вы используете несколько конфигурационных файлов, то есть шанс нарваться на NullPointerException.
загрязнение namespaces. Если вы имеете несколько одинаковых идентификаторов в разных xml-файлах, то есть риск импортировать неверный файл и также получить NullPointerException.
работает только в Kotlin. Может быть не критичным для тех проектов, который написаны на Kotlin, но критично для тех, у кого есть Java.

Именно из-за описанных недостатков он и был помечен depricated.
Давайте обратимся к альтернативе. ⤵️

3️⃣View Binding — в целом, урощённая версия Data Binding, который по сути «биндится» только для ссылок на View, не связываясь с данными.
Плюсы:
нет boilerplate кода;
полностью null safe;
type safety;
нет влияния на build time в отличии от Data Binding;
поддерживается как в Java, так и в Kotlin

Отмечу один минус: чуть больше строк кода в сравнении с Kotlin Synthetics, ведь необходимо создать экземпляр переменной binding, которую придётся использовать потом повсюду.

Хотя я и сам очень любил Kotlin Synthetics, и мирился с его недостатками, но теперь придётся переезжать на View Binding. 🤔
Ссылка на документацию по инструменту тут.
​​Jetpack Compose — Live coding сессия
#compose #youtube

Друзья, уже сегодня, 21 декабря в 18:30 мы с вами погрузимся в мир Jetpack Compose и создадим рабочее приложение.

По ходу сессии вы сможете задать вопросы нашему гостю Григорьеву Дмитрию, автору канала Jetpack Compose.

Напоминаю, что мы с вами рассмотрим:🔹
🔹как лучше строить архитектуру;
🔹как делать списки из разных типов view;
🔹что делать с навигацией между разными экранами;
🔹как сделать анимации;
🔹что делать с текущими приложениями;
🔹и много другое.

Ссылка на трансляцию тут.
​​Быстрая настройка CI/CD для Android при помощи GitLab
#cicd

CI/CD — это инструмент, который позволяет автоматизировать повторяющиеся действия. Например, это может быть прогон тестов или загрузка билда в Slack, Firebase, а также анализ кода. Вариантов множество, но эти самые распространённые.

Даже если вы единственный человек в команде, то вам стоит настроить один раз CI/CD для однотипных действий.

Есть довольно много различных систем, но если вы используете в качестве git-системы GitLab, то можно использовать его систему для этих целей и не платить деньги за ещё один сервис.

Есть полезная статья, которая ответит на начальные вопросы, связанные с настройкой: создание билда, прогон тестов и загрузка в Slack. Выглядит действительно очень просто, поэтому нет смысла не начинать использовать полезный инструмент.🤓
​​Quick Guide для миграции приложений на Android 11
#tips

В этом году мы много писали о нововведениях, связанных с Android 11: поддержка 5G, notification chat bubble, notifications priority conversations, scoped storage, package visibility и другие.
Большинство приложений, в целом, готово и будут работать на свежей версии Android, однако стоит посмотреть, не было ли изменений в тех областях, на которые завязано ваше приложение.

Нашёл хороший чеклист, где описываются изменения в работе Android 11.
Тут есть как критичные изменения, такие как: foreground service type, one time permissions или scoped storage, или незначительные, например плавный показ клавиатуры в приложении или notification bubbles.

Детальнее можно почитать тут и быть уверенным, что приложение полностью готово к новой системе. 👌🏻
​​Прокачиваем Logcat в Android Studio
#tips

Android Studio имеет огромный набор инструментов, которыми мы не пользуемся. А некоторыми из них пользуемся так же, как они настроены по умолчанию, без тонкой надстройки для себя. К такому инструменту может относиться один из самых распространённых — Logcat.

Вот как его можно настроить:

1️⃣ Цветовая схема. Мы можем показать 5 различных типов сообщений в зависимости от их важности. По умолчанию все они выводятся белым и отличаются только префиксом в начале сообщения. Можно улучшить читаемость, настроив цвет текста для каждого типа. Для этого надо выбрать File > Settings > Editor > Colors Scheme > Android Logcat. Несколько хороших цветовых схем, одной из которых пользуюсь я тут.

2️⃣Формат вывода. По умолчанию, каждое сообщение содержит следующую информацию: дата и время, идентификатор процесса, package name, tag и сообщение. Часто нам не нужно столько информации, поэтому это также легко можно настроить и вывести только необходимую.

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

Подробнее о настройках можно почитать тут.
​​Ресурсы с иконками
#tips

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

▪️Material Design Googleэтот ресурс содержит множество иконок в стиле Material от Google. Главной фишкой является несколько стилей одной и той же иконки: filled, outlined, rounded two-tone и sharp. Примерный аналог можно найти, используя набор иконок, встроенный в Android Studio, но тут их больше.

▪️Material Design Iconsресурс является альтернативной первому ресурсу, но главной фишкой тут является наличие иконок от сторонних дизайнеров, которые часто выглядят гораздо круче, чем стоковые.

▪️Feather Icons — хороший ресурс с набором outlined иконок, где главная фишка — настройка ширины обводки этой самой иконки.

▪️Boxicons — ещё один ресурс с набором нестандартных иконок: например, логотипами компаний. Их тут относительно немного, но может помочь, если нужна подобная иконка.

▪️IBM Iconsнабор иконок от IBM, где также можно найти любопытные иконки. Большинство из них выглядят не в Material стиле, но радует их большое разнообразие.