Android Broadcast
14.4K subscribers
3.68K photos
367 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
🤖 Как ускоряли скорость сборки в Android-приложении для продавцов Ozon (11 мин)

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

Какие практики применялись:
👉 Включение Gradle Build и Configuration Cache
👉 Разделение тяжелых для сборки модулей на более мелкие, чтобы можно было выполнять работу параллельно
👉 Выделение API-модулей и превращение их в JVM/Kotlin-модули без Android-плагинов
👉 Замена KAPT на KSP
👉 Удаление неиспользуемых зависимостей с помощью анализа от Dependency Analysis Gradle Plugin
👉 Использование нетранзитивных R-классов
👉 Базовые рекомендации от Android-команды
👉 Включение всех опций Gradle для ускорения сборки

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

#android #производительность #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
Media is too big
VIEW IN TELEGRAM
📹 Почему вам стоит включить Gradle Configuration Cache (46 мин)

Кэширование фазы конфигурации (configuration cache, СС) — одна из самых ожидаемых и очевидных оптимизаций в процессе Gradle-сборки. Однако стабильной эта оптимизация была объявлена относительно недавно — в Gradle 8.1.

Спикер рассказал о сложностях реализации CC и о «неожиданных» улучшениях производительности, которые может принести СС в вашу сборку. Если вы сомневались, поддерживать ли CC в своих сборках, — эти инсайты помогут вам ответить утвердительно.

Чтобы снять магический ореол с реализации Gradle и воодушевить вас на возможные open source-контрибуции, слайды сопровождаются ссылками на open source кодовую базу Gradle.

🔗 Скачать презентацию с сайта Mobius

#gradle #mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29
Media is too big
VIEW IN TELEGRAM
📹 Android Builds: Simple Recipes to Enhance Developer Productivity (26 мин)

Видео с Gradle DPE Summit про основные советы по Gradle для Android разработчиков

00:00 Introduction
00:48 About Toast
03:09 Build Growth Challenges
05:21 Reducing Build Times
06:28 Hardware Solutions
08:08 Gradle Properties
11:36 Memory Management
16:05 Dependency Handling
19:40 CI Optimization
23:35 Agent Configuration
25:38 Conclusion

#android #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
Отключите эти настройки Android в Gradle для ускорения сборки

В Android Gradle Plugin есть настройка разных build feature для включения разных опций
// Часть флагов могут быть доступны только в определнных типах модулей
// Указаны знгачения по умолчанию в Android Gradle Plugin 8.10.0
android {
buildFeatures {
// Включить/выключить Android ресурсы для библиотечных модулй
androidResources = true
aidl = false
buildConfig = false
compose = false
dataBinding = false
mlModelBinding = false
prefab = false
renderScript = false

// Генерация ресурсов из Gradle файла
resValues = true
shaders = true
viewBinding = false
}
}


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

Я предпочитаю явно выключить все опции по умолчанию и в каждом модуле включать их только при необходимости в модуле в build.gradle.kts. Сделать это можно через gradle.properties
# Отключение ресурсов для Android Library модулей
android.library.defaults.buildfeatures.androidresources=false
android.defaults.buildfeatures.aidl=false
android.defaults.buildfeatures.resvalues=false
android.defaults.buildfeatures.databinding=false
android.defaults.buildfeatures.mlmodelbinding=false
android.defaults.buildfeatures.shaders=false
android.defaults.buildfeatures.prefabPublishing=false
android.defaults.buildfeatures.viewbinding=false


‼️ Больше полезных советов и статей в Базе Знаний Android разработчика

#android #gradle #лучшиепрактики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54
Обзор(EN,7М) как оценивать время выполнения Gradle тасков в разных условиях для Android проектов. Если коротко - используйте Gradle Profiler и правильно настраивайте сценарий

🔗 Альтернативная ссылка

#android #gradle #производительность
👍14
🤖 Демоприложения: как жить, когда у вас 90+ application-модулей (15 мин)

Т-Банк активно использовал подход демоприложений для фичей (минимальные приложения для тестирования и быстрой сборки), что привело к 90 app-модулям в Gradle-проекте.

Разработчик из T-Банка рассказал, как они занялись оптимизацией этого подхода и упрощением его поддержки, а именно:
👉 как они ушли от кода интеграции в application-модулях
👉 придумали подход collector + initializer (плагинная архитектура для настройки модулей)
👉 перешли на библиотеку App Startup, избавились от нее и стали использовать стандартный Java ServiceLoader из-за увеличения времени сборки, так как Jetpack-библиотека требует Android-модули и создает много задач

#android #gradle #оптимизация
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
🐘 Официальные лучшие Gradle практики от Google, JetBrains и разработчиков Gradle

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍45
Caupain - утилита для проверки доступности новых версий библиотек из Gradle Version Catalog (TOML файл). Можно использовать из консоли или подключить как Gradle плагин

Отчет может представить как HTML, Markdown или текстовый вывод в консоле

#gradle #инструменты
🔥42👍8
Media is too big
VIEW IN TELEGRAM
📹 Как мы случайно ускорили релизную сборку в два раза. Роман Заремба, Юрий Анисимов из Т-Банк, Mobius 2025 Весна

Спикеры рассказали о том, как боролись за ускорение релизной сборки в мобильном банке и что из этого в итоге получилось. Разобрали особенности релизной сборки, связанные с подрезкой (shrinking) кода и ресурсов. Посмотрели, как профилировать и анализировать работу R8, а также отдельных Gradle-тасок, участвующих в подготовке релизной версии приложения.

Доклад для практикующих Андроид-инженеров с элементами хардкора.

🔗 Подробнее о конференции Mobius
🔗 Скачать презентацию

#android #mobius #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34👍11
🐘 Gradle начиная с версии 8.0. обязательно требует зависимостей между task, если один использует результаты другого

Явное объявление зависимостей требуется чтобы корректно выстроить порядок выполнения task-ок, гарантировать воспроизводимость сборки.

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
20👍12🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
🐘 Gradle Develocity плагин стал доступен в Android Studio 🔨

Develocity IntelliJ плагин интегрирует возможности Develocity и Build Scan прямо в IDE. В реальном времени будете видеть информацию о вашей производительность вашей Gradle сборки

#gradle #androidstudio
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥65👍182
🐘 Вышел Gradle 9.0

Самое важное в Gradle 9 - ❗️пришло время адаптировать Configuration Cache❗️. Пока его не включили по умолчанию и отложили до 10 версии, но включение режима - рекомендованный подход для всех! Кэш конфигурации очень сильно прокачали и улучшили, он уже готов к использованию!

Что еще:
👉 Обновили используемый Kotlin до версии 2.2, а Groovy до версии 4.0
👉 Kotlin build script теперь поддерживают compilation avoidance - будет пропускаться их повторная компиляции, если не найдется значимых изменений. Это положительно скажется на время сборке, если вы используете Kotlin в buildSrc
👉 Перешли на использование JSpecify Nullability аннотаций
👉 Минимальная версия Java - 17
👉 Улучшения для авторов плагинов

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

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉39👍10🔥82
Media is too big
VIEW IN TELEGRAM
📹 Обзор что нового в Gradle 9.0 (EN, 25м)

00:00 – Что нового в Gradle 9 и как обновиться
03:08 – Configuration Cache
08:59 – Поддержка Kotlin 2.2
10:10 – Kotlin build script compilation avoidance
10:46 – Улучшения nullability в Gradle API
14:05 – Gradle теперь требует Java 17 или выше
15:39 – Обновление до Groovy 4
16:43 – Reproducible архивы включены по умолчанию
19:00 – JAVA_HOME теперь может использоваться как источник toolchain в Daemon JVM
21:39 – Gradle Wrapper теперь поддерживает символьные версии и SemVer (например, latest.release)
23:32 – Какие фичи стали стабильными, что устарело и что удалено
25:05 – Полезные ссылки на документацию и ресурсы
26:06 – Рекомендованные best practices для работы с Gradle 9
26:53 – Заключение

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Media is too big
VIEW IN TELEGRAM
📹 Gradle выложили мини курс по переиспользованию build логики между Gradle модулями (EN, 6 уроков, 30 минут)

00:00 - Папка buildSrc
02:06 - Convention Plugin
09:29 - Version Catalog
15:58 - Общие Task
19:09 - Производительность buildSrc
23:32 - included build

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍57🔥103🤔1🤯1
🐘 Вышел Gradle 9.1.0 с поддержкой Java 25 и новыми фичами. Из интересно - "Визуалиация таска графов", но сразу грусть - не ждите картинки 😡 Насыпали везде по немного улучшений, запромоутили фичи в стабильные, поправили баги и на этом всё.

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33
⚠️ Работа с зависимостями в Gradle таит множество подводных камней:
- Откуда берётся зависимость?
- Какие транзитивные зависимости подтянутся вместе с ней?
- Как убедиться, что скачался именно тот артефакт, который вы ожидали?

Чтобы сборка была стабильной, безопасной и быстрой, стоит придерживаться ряда практик 👇

1️⃣ Используйте единый источник зависимостей

В больших компаниях принято разворачивать свой Nexus / Artifactory. Он проксирует остальные репозитории (MavenCentral, Google и др.), и для проекта остаётся один источник правды.

Это ускоряет сборку (репозиторий ближе и быстрее), а также защищает от случайного скачивания библиотек «из непонятного интернета».

2️⃣ Ограничивайте содержимое репозиториев

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

Например, для Google Maven:

// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google {
mavenContent {
includeGroupAndSubgroups("androidx")
includeGroupAndSubgroups("com.android")
includeGroupAndSubgroups("com.google")
includeGroupAndSubgroups("org.chromium.net")
includeGroupAndSubgroups("com.crashlytics.sdk")
}
}
mavenCentral()
}
}


Так вы избежите ненужных запросов в «левые» репозитории.

3️⃣ Проверяйте скачанные артефакты

Gradle поддерживает dependency verification. Это позволяет проверить контрольные суммы загружаемых артефактов и защититься от подмены.

📖 Документация: Dependency Verification

Пример gradle/verification-metadata.xml:
<verification-metadata>
<configuration>
<verify-metadata>true</verify-metadata>
<verify-signatures>false</verify-signatures>
</configuration>

<components>
<component group="org.apache.pdfbox" name="pdfbox" version="2.0.17">
<artifact name="pdfbox-2.0.17.jar">
<sha512 value="..." />
</artifact>
</component>
</components>
</verification-metadata>


4️⃣ Ограничивайте транзитивные зависимости

Любая библиотека подтягивает за собой десятки других. Чтобы не получить неожиданное поведение или небезопасные версии — используйте constraints:
dependencies {
implementation("org.apache.httpcomponents:httpclient")

constraints {
implementation("org.apache.httpcomponents:httpclient:4.5.3") {
because("previous versions have a critical bug")
}
implementation("commons-codec:commons-codec:1.11") {
because("version 1.9 pulled from httpclient has issues")
}
}
}


А если нужно зафиксировать версии жёстко:
configurations.all {
resolutionStrategy {
force("org.example:lib:1.2.3")
// Есть много других возможностей
}
}


5️⃣ Анализируйте дерево зависимостей

Чтобы понять, кто и что тянет, используйте:
./gradlew dependencies
./gradlew dependencyInsight --dependency okhttp --configuration releaseRuntimeClasspath


Это поможет отловить дубликаты и неожиданные версии.


6️⃣ Автоматизируйте обновления

Поддерживайте проект в актуальном состоянии:
🔄 используйте Gradle Versions Plugin, чтобы проверять обновления библиотек.
📝 заведите политику обновлений (например, обновлять минорные версии раз в месяц, а мажорные — отдельно и осознанно).

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

#gradle #лучшиепрактики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7314🔥4🤯2
🚀 Чтобы ускорить работу с Gradle рекомендую всем включить в настройках IDE параллельную работу синхронизации IDEA и Gradle проекта.

🐘 Что даёт включение «parallel fetching»

По умолчанию Gradle получает модели последовательно — по одному модулю за раз.
С включённой опцией IDE может запрашивать модели параллельно для нескольких модулей, что:
👉 ускоряет синхронизацию крупных многомодульных проектов;
👉 сокращает время обновления проекта после изменения Gradel build-файлов;
👉 лучше использует возможности CPU

#gradle #androidstudio #idea
Please open Telegram to view this post
VIEW IN TELEGRAM
👍69🔥52
🪙 Разрабатываю Gradle плагин для Swift кода в Android сборке (2 ч)

Не так давно разобрал как работает Swift для Android, но там совсем "на скорую руку" сделали интеграцию с Gradle билд системой.

Решил показать как будет сделать нормальный плагин по лучшим практикам Gradle. Демонстрация разработки в новом видео.

Если у вас есть проблемы с Boosty - пишите @ab_manager

#AndroidBroadcast #Gradle #Swift #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍13🔥94🤯1
🤖 Готовьтесь к Android Gradle Plugin 9.0 — грядут большие перемены!

Совсем скоро состоится релиз Android Gradle Plugin 9.0 (AGP), который полностью меняет подход к конфигурации Android‑проектов: удаляет устаревшие API, упрощает настройку и пересматривает организацию конфигурации.

Ключевые изменения:
👉 Переход на Gradle 9.X
👉 Поддержка Kotlin теперь встроена в AGP — подключение org.jetbrains.kotlin.android больше не требуется и даже будет рушить сборку. Из плюсов — минус один плагин.
👉 Плагин org.jetbrains.kotlin.multiplatform больше не будет работать с com.android.library и com.android.application. Используйте com.android.kotlin.multiplatform.library, а для приложения создавайте отдельный модуль.
👉 Массовые изменения в API — множество удалений без прямых альтернатив. В целом идёт отказ от старых публичных интерфейсов, ведь новые уже давно доступны, и авторы плагинов могут их использовать.
👉 Некоторые возможности конфигурации теперь будут доступны только в библиотечном плагине.

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

Подробнее обо всех изменениях — в документации

Надеюсь, Android Studio добавит ассистента по миграции. А вот авторам плагинов, похоже, прибавится работы 😅

Как вам перемены? Пойдут ли они на пользу скорости сборки и удобству использования AGP?

#Android #AndroidDev #Gradle #AGP #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍357🔥5👎1
🤖 AGP 9.0: Fused Library Plugin — новый способ публикации нескольких модулей как один AAR

В Android Gradle Plugin (AGP) 9.0 и новее появился инструмент, которого ждали многие разработчики SDK и библиотек. Встречайте плагин Fused Library (com.android.fused-library). Пока в экспериментальном режиме.

Раньше, если вы разбивали свой код на много модулей, перед вами вставала дилемма: заставлять пользователя подключать 5 разных зависимостей или использовать неофициальные "fat-aar" скрипты. Теперь Google предлагает нативное решение.

Fused Library плагин позволяет взять несколько Android Library модулей и упаковать их в один AAR [1].

1️⃣ Для включения фичи надо будет добавить флаг в gradle.properties:
android.experimental.fusedLibrarySupport=true


2️⃣ Затем создаем модуль для публикации (например, my-sdk-fused). В его build.gradle.kts добавляем:

plugins {
id("com.android.fused-library")
`maven-publish`
}

androidFusedLibrary {
namespace = "dev.androidbroadcast.mysdk"
minSdk = 23
}

dependencies {
// Указываем модули для "слияния"
include(project(":core"))
include(project(":ui-components"))
// Можно вливать даже внешние либы!
include("dev.androidbroadcast:cool-fonts:1.0")
}

Обратите внимание на include — это ключевая команда для упаковки.

3️⃣ Используем компонент fusedLibraryComponent при публикации артефакта:

publishing {
publications {
register<MavenPublication>("release") {
groupId = "dev.androidbroadcast"
artifactId = "fat-sdk"
version = "1.0.0"
from(components["fusedLibraryComponent"])
}
}
}


Инструмент мощный, но есть особенности:
Data Binding не поддерживается.
⚠️ Ресурсы: При совпадении имен побеждает ресурс из зависимости, указанной первой.
⚠️ Build Types: Нельзя слить debug и release в один проход, нужны разные fused-модули.
🐞 Source JAR: Пока есть известные проблемы с генерацией исходников.

Подробнее читайте в [документации](https://developer.android.com/build/publish-library/fused-library)

#Android #AndroidDev #Gradle #AGP #Maven
Please open Telegram to view this post
VIEW IN TELEGRAM
👍38🔥165👎1