Android Broadcast
🤯 Dagger Hilt блокирует переход на AGP 9.0 UPD. 21 января вышел Dagger 2.59 с поддержкой AGP Android Gradle Plugin 9.0 официально зафиксировал новый стабильный конфигурационный API (вышла стабильная версия с релизом AS Otter FD 3) — это одно из самых значимых…
🔥 В Dagger 2.59 добавили поддержку AGP 9.0. Одним блокером для миграции на AGP 9.0 стало меньше
#Android #Gradle
#Android #Gradle
🔥51👍16👎5🤯2🎉1
Android Broadcast
🔥 В Dagger 2.59 добавили поддержку AGP 9.0. Одним блокером для миграции на AGP 9.0 стало меньше #Android #Gradle
Сразу после выхода Dagger с поддержкой AGP стал пробовать миграцию на AGP 9.0. Блокером послужил baselineprofile Gradle plugin. Текущая его стабильная версия 1.4.1 не поддерживает новый DSL, но зато альфа версия 1.5.0-alpha01 (вышла 17 декабря 2025) уже работает.
Учитывая, что это не влияет на код в рантайте, то я бы обновился в проде.
#Android #Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👎7🔥3
Современный флагманский смартфон — это система из взаимосвязанных компонентов:
- Большой экран с высоким разрешением и 120+ Гц
- Мощная камера с 4K/60FPS видео и многокадровой обработкой
- On-device ИИ без интернета
- Топовый процессор от Qualcomm
Когда ты покупаешь такой телефон, ты ожидаешь, что ничего не будет тормозить. И вот беда — для этого нужна оперативная память. Много....
Помните, когда Google представили Pixel 8? Фишка была в том, что ИИ работает прямо на устройстве, без облака. Звучало отлично. Но Pixel 8 получил эту фичу только в виде бета-версии. Полноценно она работала только на Pixel 8 Pro.
Причина одна: памяти не хватает.
Pixel 8 Pro имеет 12 ГБ оперативной памяти. Pixel 8 имеет 8 ГБ. Разница в одной цифре, но это критично.
Вот как распределяется память:
- Android ОС: 4 ГБ (обязательно)
- Google Play Services: 1 ГБ (постоянно работает)
- Фоновые процессы: 2-3 ГБ (система держит приложения в памяти)
- On-device ИИ: 3-4 ГБ (чтобы работал всегда готов)
Итого базовые: 12 ГБ
На Pixel 8 просто нечем запустить ИИ, не ломая остальное. На Pixel 8 Pro есть запас. Вот и вся история.
Кстати, есть ещё один момент, который все игнорируют. Разработчики приложений не спешат оптимизировать код.
Почему? Потому что нет критических проблем или потерь репутации. Это затратно — нужны хорошие специалисты, исследования, тестирование. А пока приложение “вроде работает”, зачем?
Разработчики рассчитывают, что пользователь просто купит себе телефон мощнее. Это же работает в разработке игр — выпустил требования на RTX 4080, и всё, проблема решена.
Но со смартфонами этот сценарий начинает ломаться.
Сейчас происходит кризис памяти. AI серверы пожирают DRAM как не в себя. Цены растут. Производители уже обсуждают, как урезать объём памяти в 2026-м году.
И вот здесь наступает проблема: мы больше не сможем рассчитывать на стабильный рост памяти каждые 5 лет. Это становится роскошью.
Вопрос: что будет с телефонами? Память станет сдерживающим фактором всего развития. Флагманы смогут подороже продаваться с запасом памяти — да, давай по 16-20 ГБ и цена выше. Но бюджетный сегмент начнёт деградировать. Samsung выпускает серию A годами с одними и теми же характеристиками, только наименование меняет. Народ покупает — что ещё им остаётся? И то что телефон лагает — это уже проблема пользователя.
🤔 Вывод: память — это потолок на развитие
Всё, что мы видим в смартфонах, ограничено одной переменной: количеством оперативной памяти.
- Больше памяти → можно добавить ИИ
- Больше памяти → можно поднять разрешение экрана
- Больше памяти → можно оставить больше приложений в фоне
- Больше памяти → можно записывать 8K видео без подвисаний
Без памяти все эти фишки просто не работают.
И когда памяти становится дефицит, а цены на неё растут — рост характеристик смартфонов замораживается. Мы уже не сможем видеть стабильный апгрейд каждый год.
Первыми это почувствуют пользователи бюджетного сегмента. Их телефоны будут либо дорожать, либо худеть в характеристиках. Третьего не дано.
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍49👎32❤6🤯3🤔2👏1
Google запустил функцию "Save for later" в Google Play Console. Теперь можно контролировать, какие изменения отправлять на ревью, а какие пока отложить.
Раньше все изменения автоматически группировались и отправлялись на ревью вместе.
Это создавало сложности:
👉 Приходилось задерживать hot fix или публиковать изменения, которые ещё не готовы
👉 Нельзя было разделить обновление тестовых треков и маркетинговые изменения
👉 Сложно было поменять решения касательно релиз на ходу
Теперь в разделе "Changes not yet sent for review" можно отметить группы изменений как "Save for later".
Эти изменения:
👉 Не попадут в текущее ревью
👉 Можно в любой момент вернуть обратно
👉 После начала ревью автоматически вернутся в очередь
Функция работает вместе с проверками перед ревью.
Новая фича позволяет быстрее итерировать и минимизировать влияние реджектов на график релизов. Особенно полезно, когда часть изменений готова, а часть — нет.
🔗 Подробности в блоге
#Android #GooglePlay
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24👍14👎6
Forwarded from iOS Broadcast (Андрей Зонов)
Я вам несколько раз рассказывал про Skip и о своих надеждах и сомнениях по поводу этого инструмента и пришли новости. Платно получать лок на вендора желающих достаточно не оказалось, но наработки пригодились Apple рабочей группе по Android.
📱 Проблема: cross-platform “без компромиссов” всегда упирался в доверие
Многие команды хотят Swift/SwiftUI → Android, но боятся строить стратегию на маленьком закрытом платном туле: “а если завтра rug pull / покупка / закрытие?”. Skip прямо называет этот страх ключевым барьером adoption.
Начиная с Skip 1.7:
Моя оценка Skip в 2026:
Please open Telegram to view this post
VIEW IN TELEGRAM
👎30👍8❤3
Если у вас тяжёлая Android-сборка (много модулей, R8, CI с ограниченной памятью), имеет смысл принудительно завершать Kotlin Daemon после компиляции и до запуска R8 🔪
Kotlin Daemon нужен только на этапе компиляции Kotlin. После этого он спокойно живёт до конца сборки и держит память. R8 — один из самых прожорливых этапов по CPU и RAM 🔥 По итогу Daemon и R8 начинают конкурировать за ресурсы памяти
Что вы реально получаете если убивает Kotlin демона после компиляции кода:
🔗 Источник с измерениями и подробным разбором
#Android #Kotlin #R8 #Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍49👎8❤6🤔1
Чтобы получить доступ к пользовательским данным или сенсорам, разработчику приходится работать с механизмом разрешений (permissions): пользователь должен выдать приложению право на использование соответствующего ресурса. Однако наличие
Permission не гарантирует, что приложение действительно сможет получить эти данные.Например, приложению выдали доступ к геолокации, и формально оно имеет право узнать, где находится пользователь. Но при запросе локации приложение получает null. Почему?
Здесь и появляется понятие
Ability — фактическая возможность получить данные в текущий момент времени. И она может отсутствовать даже при наличии разрешения.Причин может быть множество:
👉 пользователь отключил геолокацию через быстрые настройки;
👉 система временно приостановила доступ (например, в режиме энергосбережения);
👉 прошивка вендора ограничила работу сенсора;
👉 администратор устройства запретил доступ к геолокации;
👉 отсутствует физический сигнал (GPS недоступен, нет сети и т.д.).
Итог:
Permission — это юридическое право, Ability — это реальная техническая возможность.С точки зрения архитектуры, наличие permission не должно рассматриваться как гарантия наличия данных. Бизнес-логика и use case’ы должны быть спроектированы так, чтобы корректно работать в ситуации отсутствия ability.
Другими словами: приложение должно быть готово к тому, что внешний мир в любой момент может стать недоступным — даже если формально все разрешения выданы. Это означает:
Permission — это контракт с пользователем. Ability — это контракт с реальностью. И именно второй чаще всего нарушается.#AndroidDev #AndroidOS #Архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81❤11👎8🤔3🔥2
По умолчанию Android Gradle Plugin создаёт Gradle-задачи для запуска unit-тестов во всех доступных build types, что на практике почти никогда не нужно. Обычно тесты запускаются только для debug-сборки.
В реальных проектах (особенно с product flavors и большим количеством модулей) это приводит к сотням лишних задач, увеличению времени конфигурации и дополнительной нагрузке на IDE и CI.
Чтобы оптимизировать работу Gradle, начиная с AGP 9.0, можно в gradle.properties добавить:
android.onlyEnableUnitTestForTheTestedBuildType=true
После этого unit-тесты будут генерироваться только для основного тестируемого build type (как правило, debug). Это:
👉 убирает лишние Gradle-задачи;
👉 сокращает время конфигурации проекта;
👉 снижает потребление памяти;
👉 ускоряет локальную разработку и CI-пайплайны.
Если вы не запускаете unit-тесты для release-сборок (а так делают почти все), то включение этого флага — бесплатная оптимизация сборочной инфраструктуры.
Это хороший пример того, как дефолтные настройки инструментов ориентированы на универсальность, а не на эффективность, и почему их стоит регулярно пересматривать в контексте реальной архитектуры проекта.
#Android #AndroidDev #Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍45👎3❤2🔥1👏1
Какая версия Kotlin используется в вашем основном проекте ? Делитесь в комментариях почему не переходите на самую новую
Anonymous Poll
22%
2.3.X
28%
2.2.X
14%
2.1.X
10%
2.0.X
7%
1.9.X
2%
1.8 и более ранний
3%
Мой проект на Java
0%
Другой вариант
12%
Не участвую в опросе
👍8👎8
В AGP 9.0 R8 получил несколько изменений, в основном направленных на оптимизацию Kotlin-кода, упрощение desugaring-пайплайна и улучшение диагностики.
Основные изменения:
👉 Новая опция
-processkotlinnullchecks для обработки null-проверок, сгенерированных компилятором Kotlin. Можно задать одно из значений:-
keep - оставить проверки;-
remove_message - убрать сообщения об ошибках;-
remove - полностью удалить проверки.Опция используется для уменьшения байткода и снижения runtime-накладных расходов в production. Я еще в 2019 писал статью про это и удалял код с помощью
-assumenosideeffects👉 Keep rules больше не применяются к companion methods
R8 перестал переносить keep-информацию на синтетические companion-методы, сгенерированные при desugaring интерфейсов.
Это ломает редкий кейс с minSdk < 24, но делает поведение более консистентным с остальными синтетическими элементами.
👉 Минимизированные имена синтетических классов в L8
L8 теперь генерирует более короткие имена для synthetic-классов ($1, $2 вместо длинных $$ExternalSynthetic...), что уменьшает размер DEX.
L8 — это утилита, стоящая за library desugaring в Android. Позволяет использовать новые API на старых версиях Android и править баги в них, делая использование API прозрачным.
AGP 9.0 прокачало R8 и L8, чтобы делать меньше лишнего байткода, более агрессивно оптимизировать Kotlin. Большинство изменений работают прозрачно, но в сумме дают более компактные сборки и более предсказуемый build-процесс.
🔗 Источник - документация по AGP 9.0
#Android #AndroiDev #Gradle #R8
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍10🔥7👎3🤔2
override fun getRefreshKey(state: PagingState<Int, UiItem>): Int? {
val anchor = state.anchorPosition ?: return null
val closestItem = state.closestItemAroundPosition(
anchorPosition = anchor,
// например, пропускаем разделители/заглушки
predicate = { it.isAnchorable }
)
return closestItem?.id
}#Android #AndroidX
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔28👎8👍6