Android Broadcast
14.1K subscribers
3.45K photos
313 videos
11 files
5.76K links
Подборка новостей и статей для Android разработчиков.

Связь с автором @android_broadcast_bot
Реклама @android_broadcast_bot

РКН https://abdev.by/rkn_tg_ab
Download Telegram
#Gradle

Gradle 5.2 Release Notes

Вышел Gradle 5.2. Релиз не содержит каких-то значимых изменений, из основного:
👉 Новый плагин Java Platform - он позволяет описывать совместимые между собой версии библиотек. Плагин аналогичен функционалу Maven BOM, но только в специфичном формате для Gradle
👉 Сборка нативных проектов при помощи Gradle. В новом релизе рекомендуют использовать новый Gradle C++ плагин
👉 Множество улучшений и багфиксов
Android Broadcast
​#Networking #LibUpdates OkHttp 3.13 was released Вышла новая версия библиотеки OkHttp. В обновление реализовано: 👉Минимальная поддерживая версия Android 5.0 и Java 8. Это связано с проблемой поддержки TLS 1.2 на старых версиях Android 👉TLSv1 и TLSv1.1 отключены…
Why OkHttp 3.13 Requires Android 5+

OkHttp3 были вынуждены поднять минимальную версию Android до 5.0, чтобы обеспечивать лучшую защиту для приложений. Также решение оправдано, потому что количество пользователей на Android 4.X сейчас значительно меньше по сравнению с более новыми версиями ОС.

Для тех кто поддерживает Androiud 4.X в своих приложениях не переживайте, версия библиотеки 4.12 будет поддерживаться исправлениями багов до 2020 года
#NullSafety #ErrorProne #CodeQuality

Engineering NullAway, Uber’s Open Source Tool for Detecting NullPointerExceptions on Android

В Uber разработали расширение для ErrorPhone, который позволяет анализировать Java код во время компиляции на потенциальные NPE и в случае проблем не дает скомпилироваться коду.

Для тех кто пишет на Kotlin и не имеет Java исходников в проекте - библиотека неактуальна.

NullAway Github
#EffectiveJava #ErrorProne #CodeQuality

Nope'n! from Jake Wharton

Расширение для ErrorProne, которое будет полезно для авторов библиотек. Оно требует чтобы все ваши классы были явно объявлены как final, либо abstract либо помечены аннотацией @Open, в противном случае код не скомпилируется.

В результате проверки вы увидите ошибку:
Bad.java:1: error: [Nopen] Classes should be explicitly marked final, abstract, or @Openclass Bad {}
#Coroutines #Library

Coroutines Operators

RxJava очень популярное решение для работы с асинхронными задачами в Android разработке. Kotlin все активнее вытесняет Java в Android проектах и разработчики стараются втягивать нативные для зыки библиотеки, примерами которых является реализация корутин.

Для того чтобы миграция проходила проще ребята из EPAM сделали библиотеку, которая портирует основные операторы и позволяет упростить процесс миграции. Библиотека опубликована в версии 0.9.0 и авторам нужно ваше ревью и обратная связь перед релизом.

Пример использования библиотеки:
val firstName = async { "James" }
val secondName = async { "Kirk" }
zip(first, second) { first: String, second: String ->
"$first $second" // Результат = "James Kirk"
}
#Lite #Architecture #Optimizations

Expanding Access: Engineering Uber Lite

История того как в Uber пришли к тому что им надо разрабатывать Lite версию приложения из-за того что множество устройств, на которых используется приложения - это модели 2015 года и более раненого выпуска

Основные принципы которыми руководствовались разработчики:
👉 Компактный размер
👉 Минимизация расхода трафика и запросов на сервер
👉 Высокая отзывчивость UI (< 300 мс при переходе между экранами)
👉 1 DEX

Какие вопросы пришлось решать:
Поиск компактных библиотек
Выбор архитектуры приложения
ProGuard, ReDex и Android App Bundle
Настройка CI для проверок соблюдения ограничений
#UI #HowItWorks #Text

Android’s Font Renderer - Efficient text rendering with OpenGL ES

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

В статье раскрываются:
👉 libhwui - движок для отрисовки 2D на Android 3.0
👉 Работа Skia
👉 Изменения в Android 4.4: HarfBuzz, TextLayoutCache
👉 Растеризация и кэширование
👉 Альтернативы растеризации
👉 Кэширование до использования шрифтов
👉 Очистка кэша
👉 Оптимизация
#AndroidX #ViewPager #RecyclerView

ViewPager2 Alpha 1

Google показала ViewPager2. Основные изменения:
👉 Обратной совместимости нет
👉 Базируется на RecyclerView
👉 Реализована поддержка RTL
👉 Поддержка вертикальной ориентации
👉 Модифицируемый контент, когда элементами являются Fragment

Ждем стабильной версий
#Security #Encryption

Introducing Adiantum: Encryption for the Next Billion Users

Google представила новый формат шифрования - Adiantum, который предназначен для запуска на телефонах и умных устройствах, которые не имеют специального железа/чипа для шифрования на аппаратном уровне.

Необходимость такого формата связана с тем что новый миллиард устройств - это Индия, страны Африки и Южной Америки, где покупаются дешевые устройства, который работают на старых версиях ОС или Android GO + такие устройства в основе используют процессоры на основе архитектуры ARM Cortex-A7, который не имеют аппаратного шифрования.
#Room #Coroutines

Room 🔗 Coroutines

Room 2.1 добавил поддержку Kotlin Coroutines. Теперь Room DAO можно описывать следующим образом:

@Daointerface
UsersDao {
    @Query("SELECT * FROM users")
suspend fun getUsers(): List<User>

    @Insert
suspend fun insertUser(user: User)

    @Update
suspend fun updateUser(user: User)

    @Delete
suspend fun deleteUser(user: User)
}

В статье описаются детали как механизм работает под капотом
#Chromium #PWA #TrustedWeb

Introducing a Trusted Web Activity for Android

В Chromium 72 официально анонсировали поддержку Trusted Web Activity (TWA). Это позволяет вашему приложению отображать Web контент в Chrome Custom tab или WebView без UI браузера в полноэкранном режиме.
#PWA

Play Store теперь принимает прогрессивные веб-приложения (PWA)

Статья поможет вам в первых шагах с Progressive Web Apps (PWA):
👉 Преимущества перед стандартными PWA
👉 Является ли TWA гибридным фреймворком, похожим на Cordova?
👉 Требования Play Store
👉 Способы разработки
👉 Ограничения
👉 Создание первого APK с PWA
👉 Тестирование
#ANR

Причины возникновения ANR и как этого избежать

Application Not Responding (ANR) - это ошибка, которая возникает в результате приложение не отвечает. Условия возникновения ANR:
👉События ввода (кнопки, касания экрана и пр.) не обрабатываются 5 секунд
👉BroadcastReceiver.onReceive() не был обработан за отведенное время (foreground приложение - 10 сек, background - 60 сек)
👉ContentProvider не завершил выполнение в течение 10 секунд

Как избежать ANR:
👉 Вся работа, несвязанная с отображение, должна выноситься в фоновые потоки
👉 Сложные вычисления производятся в отдельном потоке
👉 Используйте Handler для взаимодействия между Main/UI потоком приложения и рабочими потоками

Удобными способами для выполнения операций в фоне является использование библиотек RxJava или Kotlin Coroutines

В статье также описывается откуда прорастает показ ANR диалога и как он показывается
#ANR #Library

ANR-WatchDog - A simple watchdog that detects Android ANR error and throws a meaningful exception

Единственный способ для Android приложения поймать ANR - это опубликовать его в Google Play и смотреть за их статистикой в консоле.Очень полезно получать ошибки с ANR во время разработки и тестирования.

Библиотека ANR-WatchDog призвана решить эту проблема. Она настраивает таймеры на определение того, что ваш Main/UI поток не отвечает. Если такое событие происходит, библиотека выбрасывает ошибку ANRError. При включенном дебагере библиотека отключается.

Подключение библиотеки
implementation 'com.github.anrwatchdog:anrwatchdog:1.3.0'

В Application.onCreate() добавьте
new ANRWatchDog().start();

Рекомендую подключать библиотеку только в тестовых сборках вашего приложения и не включать его в production.
#Kotlin

The Argument Over Kotlin Synthetics

Kotlin Android Extensions призваны упростить жизнь Android разработчиков, они включают в себя:
👉 View Binding (отказ от findViewById)
👉 Generation of Parcelable (не надо руками писать реализацию)

Какова цена за эти удобства? Действительно ли все так удобно. Автор статьи решил рассмотреть почему не стоит использовать View Binding:
Доступны только из Kotlin
Не поддерживается Nullability
Нет гарантий что сгенерированный код будет производительным
Все находиться в глобальном пространстве имен
Нет гарантий типов
#UI #Design

State of the Navigation Drawer

Navigation Drawer присутствует довольно давно в Android приложениях, но он имеет минусы:
сокрытие навигации с экрана
разработчики порой его перегружают элементами
пользователи не видят новый функционал, которая добавляется в приложения

Как альтернатива Drawer предлагается использовать Bottom Navigation. Он позволяет решить проблемы, присущие Drawer, но также имеет ограничения, например он располагает от 3 до 5 элементов.

В своих последних приложения Google стала использовать комбинированный подход с Drawer и Bottom App Bar

Что сейчас имеет место и есть ли универсальное решение? Вопрос как всегда философский и не имеет четкого ответа. В статье автор сделал обзор существующих решений и их эффективности.
#AndroidX #ViewPager2 #HowItWorks

ViewPager2 under the Hood

На днях Google представила первую альфа версию ViewPager2. Я писал об это ранее. В статье разбирается как работает под капотом ViewPager2 и каким образом перенесли функциональность ViewPager на RecyclerView.
#Kotlin #NullSafety

Null is your friend, not a mistake

Null - это бич Java разработки или нет? Очень неприятно когда у вас падает NPE 😞. Чтобы это исправить было сделано много разных решений:
👉 @Nullable, @NonNull аннотации
👉 Optional Java 8
👉 Невозможность работы с null, например RxJava 2 типы не могут эмитировать null значения
👉 Куча if(value != null)
👉 Статические анализаторы кода

Все решения имеют свои плюсы + работают не всегда.

Kotlin решил эту проблемы намного изящнее все типы делятся на Nullable и NonNullable, который четко определяют можно ли быть у вас null значение в типе и при обращение будет заставлять обрабатывать.

Роман Элизаров (папка Kotlin Coroutines) в статье рассказывает почему null - это не есть зло и как Kotlin эффективно организовал работу с такими типами значений!
#RecyclerView #Animation #DiffUtil

RecyclerView — time to animate! (with payloads and DiffUtil)

Что вы знаете о payload в RecyclerView.Adapter.notifyItemChanged(int position, Object payload) ? Она позволяет вам сообщать что изменилось, а не заставляет обновить целый элемент в RecyclerView. DiffUtil также поддерживаются payload и позволяет вам точечно обновлять элементы списка.

В статье раскрываются подробности как анимировать изменения RecyclerView на основе описанного механизма.