Telegram Web
​​Развитие механизмов безопасности Android
#security

В современной разработке безопасности отводится довольно важная часть. Для нас, разработчиков под Android, с каждым обновлением ОС приходится исправлять своё приложение в зависимости от нововведений.

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

Можно наблюдать, как эволюционировала безопасность Android от версии к версии и как это повлияло на дальнейшее развитие системы. Так что если вы увлекаетесь безопасностью, да и вообще людите историю операционных систем — welcome. 😎
Пятничный опрос на провокационную тему:

Какая у вас зарплата? (в ₽ на руки) Можно честно, опрос анонимный 😉
Anonymous Poll
25%
до 69К
12%
70К — 99К
16%
100К — 149К
16%
150К — 199К
11%
200К — 249К
8%
250К — 299К
4%
300К — 349К
2%
350К — 399К
7%
400К и больше
​​Nearby Connections API
#theory #api

Сегодня расскажу вам о довольно редком, но, на мой взгляд крутом и недооценённом API — Nearby Connections API. Оно позволяет устройствам связываться друг с другом даже при отсутствии Интернета.

Для чего нужно?
Это API даёт возможность делиться какими-то файлами, сообщениями и другими данными в своём приложении без сети. На сайте с документацией приведены такие примеры:
🔹трансфер файлов оффлайн;
🔹использование девайса в качестве контроллера в играх;
🔹игры с оффлайн мультиплеером;
🔹доски для совместной работы.

Как работает?
API использует Bluetooth и другие технологии, например WiFi, которые обеспечивают peer-to-peer соединение на близком расстоянии (в пределах 100 метров).
Безусловно, есть лимиты на количество соединений: Bluetooth поддерживает около 4 соединений одновременно, WiFi ограничивает примерно от 10 до 100 подключений одновременно в зависимости от того, доступны ли маршрутизаторы, которые можно использовать как «мост».

Помимо этого API существует альтернатива — Nearby Messages API, правда ей для работы нужен Интернет и размер передаваемых данных довольно мал.
С другой стороны, Nearby Connections API может работать только на Android, а прыдущий аналог поддерживает ещё и iOS.

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

Больше деталей о том, как добавить в проект это API можно найти тут.
​​Material Transitions
#api #fragment

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

Одним из типов анимаций является Transitions: это анимации перемещения с одного экрана на другой. Мы можем анимировать или весь экран целиком, или только некоторые View этого экрана.

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

Даже стандартная реализация RecyclerView работает довольно стабильно и хорошо. ✌️
Однако, если ваш список состоит из нескольких типов элементов или эти элементы сложные, самое время задуматься о дополнительных оптимизациях. Самыми быстрыми и простыми в добавлении будут setHasFixedSize, DiffUtil, создание плоских View.

Автор статьи решил пойти дальше и добавить префетчинг View вне основного потока. Для этого он использовал RecyclerView.RecycledViewPool, который и выполнял нужную работу.

Лично у меня ещё не было шанса оценить скорость прироста при использовании данного подхода, так как в текущих проектах нет RecyclerView с большим числом разных viewType и нет экранов, где есть первоначальные загрузки списков. Но подход выглядит круто, и если вы хотите ещё больше оптимизировать ваши списки, то воспользуйтесь.

Кстати, есть уже готовая библиотека с реализацией этого подхода на Kotlin Coroutines, RxJava2, RxJava3 и Executor.
Windows 11, 10, etc - авторский канал с тайным знанием о флагманской ОС Microsoft

В комплекте срыв покровов и доставка пруфов.
​​Recycler View Series
#recyclerview #новичкам

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

В первой статье рассматривается этот компонент, его принцип работы, ну и то как добавить самый простой список в проект. Отлично показано, как работают методы onCreateViewHolder(), onBindViewHolder().

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

Третья — очень короткая статья, которая рассказывает про имплементацию клика на элемент, а последняя в этой серии — про создание Header при помощи ConcatAdapter.

Так что если вы новичок — эта серия поможет разобраться во всей базе, связанной с RecyclerView. 🤟
​​Mock API для разработчиков
#tools

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

Но, вероятно, самым удобным способ является использование Mock API. По сути, это обычный сервер, который просто возвращает вам предварительно заполненный JSON-файл. Если у вас есть чёткое понимание ответа от сервера, то всё что вам нужно сделать при завершении работ на сервере — это переключить сервер.

Вот пара сервисов для организации Mock API — Mockable.io и Postman. В целом, мне больше нравится второй вариант, видимо по причине того, что я использую это средство для совершения запросов к реальному серверу.

Тут описано то, как настраивать сервер.
​​AppCode и KMM-плагин — как работает внутри?
#youtube #android_live

Совсем недавно на канале был анонс того, что в AppCode появился плагин для разработки под KMM. Подобное решение выглядит классно, ведь можно использовать одну IDE для того, чтобы писать приложения под KMM сразу и на iOS и на Android.

Но всё ли так хорошо? Насколько стабильно всё работает, и можно ли использовать этот плагин в проде? А какие планы на будущее и что нас ожидает? Ответы на эти и многие другие вопросы мы получим на YouTube-канале AndroidLive.😉

А поговорим обо всём этом с Айдаром Мухаметзяновымразработчиком из JetBrains, который трудится над AppCode и KMM-плагином для него. До этого Айдар 7 лет разрабатывал iOS приложения в разных компаниях.

Трансляция пройдёт 21 июля в 18:30 по МСК. Мы обсудим то как плагин работает внутри, а потом вместе сделаем небольшое приложение, которое покажет все возможности IDE. Ссылка на трансляцию тут. Уверен, что будет интересно 😎

А свои вопросы вы уже можете задать уже сейчас, тут.

До встречи на стриме! 😉
​​Архитектура для Compose: MVVM или MVI?
#compose #architecture

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

Автор статьи решил выбрать идеальную архитектуру для работы с Compose, и рассказал о своём опыте. У него получилась MVVM с некоторыми фичами от MVI: State, Event и Effect. Ну а для взаимодействия между слоями тут используется Flow.

Получилось довольно неплохо, с проектом можно ознакомиться тут. Автор подчёркивает, что о подобном подходе стоит задуматься, если у вас намечается сложное приложение с большим количеством логики. Для простых же достаточно стандартного MVVM подхода.
​​Google Fast Pair Service
#tools #library

Продолжаем знакомство с довольно редкими, но интересными API в Android. Вероятно, большинство из нас не будет использовать данный API, но лично мне было интересно, как подобная функциональность работает под капотом.
Ну и да, если вдруг вы заняты разработкой своего Bluetooth устройства, то этот API для вас.

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

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

В статье можно детальнее узнать требования, которые предъявляются к устройству, да и в целом, более подробно ознакомиться с технологией.
​​Список Public API
#tools

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

Вероятно самый распространённый API — это Weather API. Правда, тестовые задания с подобным описанием уже порядком надоели, ну и для пробы новых технологий он не всегда подходит.

На будущее, вот вам огромный список публичных API для бесплатного использования. 🤓
Тут есть API и с напитками, и с животными, и с финансами, и с мероприятиями… в общем куча всего, каждый найдёт себе подходящее, а тестовые проекты станут разнообразнее.
​​Room и multimap return types
#jetpack #library

Последний релиз Room добавил нам новую фукнциональность: теперь можно возвращать объекты, обёрнутые в тип Map.

Эта фича полезна, если вам нужно сделать JOIN в запросе. Для 1-M связей запрос будет выглядеть так:
@Query("SELECT * FROM Song JOIN Artist ON Song.artistId = Artist.artistId")
fun getSongAndArtist(): Map<Song, Artist>


А если вы хотите использовать связь M-M, то запись немного поменяется:
@Query("SELECT * FROM Artist JOIN Album ON Artist.id = Album.artistId")
fun getArtistAndAlbums(): Map<Artist, List<Album>>
.

Если по какой-то причине вы не хотите или не можете создать дополнительный Embedded класс, то это решение отлично зайдёт. Ну и конечно, есть встроенные обёртки над Map с LiveData, Observable и Flow.

Пока что фича в alpha, а подробнее можно почитать о ней тут.
​​Annotation processors с KSP
#kotlin #api

KSP — это API от Google для создания лёгковесных плагинов для компилятора Kotlin и annotation processors.
На практике мало кто использует написание плагинов с нуля, но подобные знания могут значительно увеличить скорость решения некоторых задач. Да и в целом полезно знать что ещё можно сделать и какие API для этого есть.

Если эта тема хоть немного вам интересна, то вот простой туториал для старта. В нём автор пишет плагин, который преобразовывает:
@Function(name = "myAmazingFunction")
interface MyAmazingFunction {
val arg1: String
val arg2: Map<String, List<*>>
}


В функцию следующего вида:
fun myAmazingFunction(
arg1: String,
arg2: Map<String, List<*>>
) {
println("Hello from myAmazingFunction")
}


Рассматривается всё, начиная с информации о базовой структуре проекта и заканчивая реализацией и примерами кода.

Ссылка на статью тут.
​​Фоновые задачи в Android 12
#android #workmanager

С релизом последней версии Android, мы снова получили ряд ограничений, связанных с работой фоновых операций. Теперь нельзя стартовать foreground services, за исключением особых случаев, описанных тут.

Альтернатива — WorkManager, которые уже довольно долго являетя приоритетным средством для запуска фоновых задач, с новой фичей — Expedited jobs. Они позволяют запускать короткие и важные задачи, давая системе больше контроля над доступом к ресурсам.
Теперь можно будет не выводить уведомление пользователям, однако не всё так просто.

Из плюсов можно выделить:
• минимальное время запуска;
• меньшая зависимость от Battery Saver и Doze.

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

Тут описан процесс миграции ваших задач. Процесс выглядит довольно просто, но пока не совсем понятно, насколько хорошо будут работать приложения, которым нужно проводить в фоне больше, чем 3 минуты.
​​Релиз Jetpack Compose
#compose

Сегодня состоялось важное событие — релиз Jetpack Compose🔥.
Теперь уже нет сомнений, что это новый вектор развития UI в Android-разработке, а у разработчиков появилась новая задача в бэклоге, связанная с переездом или пробой нового фреимворка.😁

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

Вот вам несколько примеров готовых приложений.
И конечно, обязательно посмотрите видео на канале Android Live с пошаговым написанием приложения.

Поделитесь своим мнением в комментариях. А какие материалы по Jetpack Compose вам интересны?
​​Релиз Lottie для Compose
#compose #library

Не успел выйти релиз Compose, как контрибьюторы начали изменять свои библиотеки для совместимости с ним.
И вот, уже в стадии релиза библиотека Lottie, которая позволяет отображать созданные в Adobe After Effects анимации в приложениях.

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

Радует такой подход, и рад, что одна из самых красивых библиотек для работы с анимациями теперь есть и на Compose. 💛
​​Как Telegram оптимизирует изображения перед отправкой
#library #cases

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

Автор статьи решил изучить вопрос и посмотреть, как Telegram делает такую оптимизацию. Покопавшись в коде, нашёл класс ImageOptimizer, который отвечает за алгоритм сжатия изображений. Он состоит из следующих шагов:

🔹декодирование изображения из файла в Bitmap;

🔹рассчёт коэффициента сжатия — в Telegram используется 1280 для обычных изображений и 90 для миниатюр;

🔹рассчёт ближайшего inSampleSize — первый этап оптимизации изображений, где рассчитывается BitmapFactory.Options.inSampleSize на основании коэффициента из предыдущего шага. Поддерживается шаг кратный степени 2;

🔹рассчёт Image Matrix — после предыдущего шага меняется ориентация изображения, чтобы применить к нему, если необходимо, дополнительные оптимизации. Делается это при помощи Matrix и Exif данных об изображении;

🔹создание сжатого изображения — делается на основе передаваемых в функцию BitmapFactory.Options и Matrix, с которыми работал алгоритм на предыдущих шагах;

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

🔹сжатие и сохранение изображения — при помощи функции Bitmap.compress() осуществляется сжатие с заданными параметрами качества. В Telegram это Bitmap.CompressFormat.JPEG с качеством 80 для изображений и 50 для миниатюр.

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

Готовая функция из статьи тут, которую при желании вы можете использовать и у себя в проектах.
👍1
​​Microsoft Teams поддерживает нативные уведомления под MacOS
#tools

Новость совсем не про Android разработку, но для тех кто использует MacOS и Teams для работы — новость то, что надо.
Дело в том, что Microsoft Teams не поддерживал показ нативных уведомлений на MacOS, показывая вместо них самописные, которые мало того, что выглядели не очень, так ещё и частенько бажили. 🙄

Теперь мучениям пришёл конец, и можно настроить показ уведомлений в том же стиле, что и все уведомления на MacOS в «Настройки и другое» (Settings and more) -> «Настройки» (Settings) -> «Уведомления» (Notifications).

А что вы используете на работе в качестве мессенджера и средства для общения? 🤓
2025/08/28 05:26:21
Back to Top
HTML Embed Code: