Telegram Web
​​Новый рубрики
#android_live

Хочется добавить на канал больше социальной активности и пользы для вас, мои подписчики ✌️. Поэтому, хочу анонсировать две новые рубрики на канале:

1) От подписчика. Теперь у каждого из вас есть возможность поделиться чем-то с другими. Это может быть что угодно: начиная от статьи, которая вам понравилась и может понравиться другим и заканчивая уникальным опытом работы в компании, открытия своего стартапа или проекта. А вдруг среди нас есть авторы известных библиотек, и вы хотите ответить на вопросы разработчиков, чтобы сделать своё творение ещё лучше. Всем этим можно поделиться на канале в виде простого поста или целого треда с обсуждениями.

2) Вопрос к эксперту. Также у вас есть возможность узнать ответ на наболевший вопрос у экспертов. Возможно, вы не знаете как правильно решить конфликт у себя в команде, а может у вас нет представления, куда двигаться в карьерном плане. Теперь можно получить ответы на эти и многие другие вопросы здесь – на канале. Эксперты будут подбираться мной в зависимости от специфики вопроса.
Важно, чтобы этот вопрос был интересен не только вам, а также не был таким, ответ на который легко загуглить.

Не стесняйтесь участвовать в этих активностях и пишите мне. А также напоминаю, что обсудить всё, что происходит на канале можно у нас в чате.
Пост для Android-разработчиков, которые следят за безопасностью своих приложений 🔥🔥🔥

Авторский канал «paradiSEcurity» расскажет про информационную безопасносность мобильных приложений.

В кратких, но емких постах раскрываются важные темы:

🌶 как создавать безопасные приложения
🌶 как сделать реверс приложения
🌶 почему сложно организовать голосование на выборах через приложение

Если интересуешься лучшими практиками защиты приложений и хочешь понимать, почему даже они не всегда выдерживают хакерские атаки, то 👉 @paradisecurity
​​Firebase Android BoM
#firebase

Недавно настраивал пуш-уведомления для проекта и, как обычно, полез в документацию Firebase, чтобы посмотреть необходимые зависимости.
К моему удивлению, появился механизм, который называется Firebase Android BoM.

Суть в том, что теперь не нужно обновлять все версии Firebase библиотек по отдельности, а достаточно обновить только одну версию — версию BoM. Главной фишкой является то, что обновлённые библиотеки будут совместимы между собой.

Выглядит это так:
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:26.1.0')

// Declare the dependencies for the desired Firebase products without specifying versions
// For example, declare the dependencies for Firebase Authentication and Cloud Firestore
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.firebase:firebase-firestore'
}


Посмотреть, какие конкретно версии библиотек включены в конкретный BoM можно тут, а почитать детальнее можно в документации.
​​Знакомство с MotionLayout
#intro #motionlayout

Думаю, что многие из вас уже знакомы с MotionLayout и теми фичами, которые он предоставляет. Если нет или вы недавно в Android-разработке, то пара статей поможет вам быстро разобраться с базовыми вещами, которые в нём есть.

Для начала есть статья, которая описывает функции Motion Editor — базового инструмента для предварительного просмотра созданных при помощи MotionLayout анимаций. В ней можно почитать про основные панели — Overview, Selection, Attribute, Preview и на примере посмотреть, как их использовать в проекте.

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

• ConstraintSets;
• анимации, которые работают на drag events;
• изменение анимации при помощи KeyPosition;
• изменение атрибутов при помощи KeyAttribute.
• анимацию шапки при помощи MotionLayout.
​​Ещё про MotionLayout
#motionlayout #subscribers

Новая рубрика, где каждый из вас может поделиться интересными статьями начинается!
Вдогонку ко вчерашнему посту, рассказывающем о знакомстве с MotionLayout, @Vel_daN делится циклом своих статей, где рассказывает о более глубоком использовании этого компонента.

Главным недостатком MotionLayout является то, что если мы хотим создать анимацию с его использованием, то необходимо зарегистрировать все состояния в MotionScene при помощи ConstraintSet. Если наша анимация объёмная, то это сбивает с толку, становится нечитаемым, ну и всё ещё не отображается в runtime.

Решение — это использовать xml-файлы, что заметно сокращает код и делает его более читаемым. Пока есть три статьи, вот первая, вторая и третья.

@Vel_daN также согласился ответить на ваши вопросы, связанные с MotionLayout и поделиться своим опытом, поэтому если у вас есть вопросы — можете задавать их в нашем чате.
​​Кроссплатформенные приложения на Kotlin
#kotlin #crossplatform #compose

Одним из главных преимуществ Flutter перед Kotlin Multiplatform на сегодня является возможность создавать общий UI. К счастью, JetBrains работает над этой проблемой, и не так давно был анонс Jetpack Compose, который работает на Windows.

Нашёл статью, где описан пример приложения, работающего как под Windows, так и под Android. Автор использует библиотеку Decompose, созданную для улучшения работы с бизнес логикой, навигацией и UI.

Уже нет сомнений, что Jetpack Compose будущее UI для Android. Интересно, насколько Jetpack Compose приживётся в создании приложений под Windows? 🤔
​​Как узнать время старта приложения?
#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?
2025/08/29 22:02:36
Back to Top
HTML Embed Code: