Неделю назад в мире опенсорс разработки произошло интересное событие.
Опенсорс — это когда разработчик пишет программу (как правило, эта программа нужна для работы других программ) и выкладывает её в общий доступ на полностью свободных началах. В большинстве случаев после этого кто угодно может делать с этой программой абсолютно что угодно: копировать, изменять, продавать решения на её основе за деньги и так далее. Иногда то, что пишут такие разработчики-волонтёры, оказывается невероятно удобно и полезно. Настолько, что гигантские корпорации используют это у себя. А кроме них — ещё десятки тысяч проектов по всему миру. Такое использование называется «зависимость», и оно создаёт связь между автором опенсорс-проекта и тем, кто взял его труд.
Связь обычно такая: в моей программе где-то указано, что вот этот вот код взят по такому-то адресу у опенсорс разработчика Васи. Моя программа иногда может на этот адрес заглядывать и смотреть, а не внёс ли Вася чего нового. Вдруг он улучшил работу и исправил ошибки — тогда я скачаю новую версию его программы и установлю её у себя. Формально для такого обновления должны существовать ограничения. По факту человеческая лень и негласный этикет среди разработчиков приводят к тому, что обновления ставят не глядя. Считается, что Вася будет выкладывать только улучшенную и проверенную новую версию своей программы, ведь за ним наблюдает миллион других разработчиков. Пацаны во дворе не поймут, если Вася сделает что-то неаккуратно.
Один из разработчиков по имени Marak Squires написал некоторое время назад две очень полезные программные библиотеки. Как раз такие, которые скачали десятки тысяч людей, в том числе в крупных корпорациях, и использовали у себя. В прошлом году этот разработчик написал что-то вроде: «Эй, корпорации, вы берёте мой труд бесплатно. Конечно, я его раздал бесплатно, но вы чёртовы капиталистические гиганты, и у вас миллиарды баксов, а я вам сэкономил миллионы баксов на разработке. Я жду от вас чек на почту в благодарность». Конечно, всем было пофигу.
А неделю назад этот разработчик внёс в свои библиотеки деструктивное обновление, которое сделало программы, установившие его, неработоспособными, и вывело на экран «LIBERTY LIBERTY LIBERTY». Это обновление положило кучу проектов, в том числе у гигантов-корпораций. Поднялась буря.
Одна часть интернета заявила, что разработчик никому ничего не должен, поэтому волен делать со своим кодом всё, что хочет. Вторая часть претендовала на то, что совершённый им поступок это вандализм и осознанный вред другим разработчикам. Дров в огонь подкинуло то, что GitHub, на котором размещался код этого разработчика, заблокировал его аккаунт. А система хранения пакетов NPM откатила изменения до предыдущих версий. Хотя формально никаких законов он не нарушал: компании брали его код по собственной воле, а он ничего никому не гарантировал.
___________________________
Я не готов назвать здесь однозначно правую сторону. Пока выглядит, как «Все мудаки». Но на мой взгляд это показательный пример вот чего: никакие формальные правила никогда не покроют всё многообразие человеческих взаимоотношений, и поэтому личностный аспект тоже важен. Даже если нет закона или правила, по которому вы что-то должны, есть смысл стараться действовать созидательно и стремиться, хотя бы частично, к всеобщему благу, а не только к личному. Особенно в ситуации, когда у тебя в руках сосредоточена та или иная власть. Корпорации действительно могли бы найти способ отблагодарить разработчика (и вообще — всех разработчиков, чей код они бесплатно берут в таких масштабах). Просто из чувства благодарности, а не потому, что должны. Разработчик мог бы просто закрыть проект и не стараться нанести урон. Просто из чувства неприятия всего деструктивного. Это, конечно, идеализированный мир розовых пони, но сила и власть это как раз способность двигать границы реальности.
#dev
🤖Handoff в Android 17 — очень интересно, но пока много вопросов
Handoff — новая функция и API, появляющиеся в Android 17. Она предназначена для реализации cross-device continuity — возможности начать работу с активностью приложения на одном Android-устройстве и продолжить её на другом устройстве, связанном с тем же Google-аккаунтом.
На текущий момент попробовать функцию невозможно: API ещё недоступен, а сам сервис не работает даже в эмуляторе с Android 17 Beta 1.
По своей идее Handoff сильно напоминает Continuity в iOS. Вероятно, эта функциональность станет важной частью развития Android в сторону desktop-сценариев и Android for Desktop.
Технически Handoff основан на восстановлении состояния активности на другом устройстве. Концептуально это похоже на восстановление из Saved State, однако появляются новые ограничения и вопросы. Например, данные, сохранённые только локально, автоматически перенести не получится — их потребуется загружать заново. Также пока неясно, каким образом будет организована работа с навигацией и насколько необходимым станет общий или синхронизируемый state приложения.
Пока остаётся ждать официальных примеров и рекомендаций от Google.
🔗 Источник — Android 17 Changes
#Android17
🤖Вышел Android 17 Beta 4
Что нового:
👉 Ограничения на выделяемую память для приложений (некий новый механизм)
👉 Автоматической обнаружение аномалий в использовании приложениями ресурсов устройства
👉 Пост квантовое шифрование в Android Keystore
Подробно читайте в отдельных постах @android_broadcast
🔗 Источник Android Developers Blog
#Android#Android17
🤖В Android 17 нельзя менять `static final` поля через рефлексию или JNI. Звучит логично — static final по определению константа, но на практике это использовалось годами для разных хаков.
👉 Попытка изменить такое поле через рефлексию бросает IllegalAccessException
👉 Попытка через JNI SetStaticLongField() и аналоги — сразу краш приложения
👉 Ограничение включено только для приложений с targetSdk = 37, но в Beta 1 проверка активна для всех приложений, чтобы выловить проблемы раньше
Зачем это нужно? Пока static final поле формально могло меняться, рантайм не мог агрессивно оптимизировать код, который к нему обращается. Теперь — может. На практике это чаще всего задевает тесты, которые через рефлексию подменяют константы в production-коде, и старые хаки с логированием или конфигурацией. Где-то жить станет чуть сложнее, но в целом всё закономерно — меньше хаков, честнее код.
🔗 Источник: developer.android.com
#android#android17
// Пример запуска EyeDropper
val eyeDropperLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
result -> if (result.resultCode == Activity.RESULT_OK) {
val color = result.data?.getIntExtra(Intent.EXTRA_COLOR)
// Обрабатываем полученный результат
}
}
fun launchColorPicker() {
val intent = Intent(Intent.ACTION_OPEN_EYE_DROPPER)
eyeDropperLauncher.launch(intent)
}
#Android#Android17
В Android 17 на Pixel появится возможность запускать приложение как плавающее окно. Да-да. Вы скажете, что это давно уже было на многих планшетах. Теперь и в стоковой оболочки Pixel будет, хотя вот другим производителям всё равно от этого изменения
#Android#Android17
🤖 В Android 17 переписали один из самых старых и критичных механизмов работы UI потока.
Это изменение почти никто не увидит в changelog’ах, но оно напрямую влияет на то, насколько плавно работает интерфейс любого приложения.
MessageQueue — это очередь задач главного потока с которой работает Handler. Каждый Android-разработчик фактически работает с ней каждый день, даже если напрямую не задумывается об этом. Looper берёт из неё сообщения, передаёт их Handler’ам, выполняет UI-обновления, lifecycle-события, обработку ввода, invalidate, работу фреймворков и большую часть межпоточного взаимодействия. По сути, это диспетчер всей работы main thread.
Исторически эта очередь почти не менялась около двадцати лет. Внутри она была защищена одним lock’ом. Пока один поток добавлял сообщение, другой не мог работать с очередью. На старых устройствах это не было критично, но на современных многоядерных системах стало появляться всё чаще: background-поток держит lock, планировщик переключает CPU на другие задачи, а UI-поток в этот момент ждёт.
В Android 17 мезанизм работы очереди переписали полностью. Новая реализация стала lock-free. Вместо общего lock используются атомарные операции, а сама структура очереди разделена на две части: потоки могут добавлять сообщения без блокировок, а главный поток уже самостоятельно упорядочивает и выполняет задачи. Важное свойство такого подхода — хотя бы один поток всегда может продолжать работу независимо от поведения остальных.
Это не обновление из категории «приложение стало быстрее на X процентов». Изменение работает глубже. Оно снижает вероятность случайных блокировок главного потока, уменьшает количество missed frames и делает время кадра стабильнее под нагрузкой. Особенно это заметно в сценариях, где одновременно происходит много фоновой работы: запуск приложения, работа камеры, тяжёлые UI, интенсивные операции в фоне.
🤯 В одном из примеров Google показывают блокировку UI-потока почти на 18 мс только из-за конкуренции за lock — этого уже достаточно, чтобы пропустить кадр на экране 60 Гц, не говорю уже про 120.
‼️ Большинству приложений ничего делать не нужно — улучшение происходит автоматически. Но обратить внимание стоит тем, кто занимается производительностью, анализирует Perfetto-трейсы или использует рефлексию и внутренние поля MessageQueue. Такие вещи могут перестать работать, потому что внутренняя реализация изменилась.
На самом деле это интересный сигнал о направлении развития Android. Долгое время оптимизации происходили на уровне API и фреймворков. Сейчас Google всё чаще переписывает базовые механизмы конкурентности самой платформы. И это логично: современные устройства уже редко упираются в вычислительную мощность, чаще — в синхронизацию потоков и contention. MessageQueue находится в центре всей работы UI-потока, поэтому даже небольшие улучшения здесь масштабируются на всю экосистему.
🔗 Больше подробностей про работу механизма можно найти в техническом разборе от Google
#Android#Android17
🤖Вышла первая Beta Android 17, а Dev Preview не будет. Google ранее запустила Canary сборки Android ОС и теперь это и есть Dev Preview.
Новых фичей первый апдейт этого года не принесет (всё сладкое будет в Q4), но заложит улучшения в платформу и сделаем жизнь разработчиков сложнее.
Что самого важного
❌ Убирают возможность отключения принудительной работы приложения на больших экранах, которая появилась в Android 16. Флаг будет игнорироваться
🚀 Сделали улучшения для ускорения работы ОС
📷 Прокачали работу с камерой
🤯 Handoff: Перенос Activity между девайсами для продолжения работы
👉 Другие улучшения по мелочи
📅 Релиз стоит ждать в мае-июне 2026.
Буду отдельными постами рассказывать всё подробнее в @android_broadcast
Источник Android Dev Blog
#Android#Android17
‼️Vulkan становится обязательным для Android
В рамках Game Developer Conference Google объявила что все чипы, которые будут выходить с Android 17+ (выйдет летом 2026 года) как первый релиз будут обязаны поддерживать Vulkan API 1.4.
Вендоры при выпуске устройств с Android 17+ (не обновления) должны будут поддерживать ANGLE
ANGLE (Almost Native Graphics Layer Engine) — это реализация OpenGL ES поверх Vulkan или Direct3D, используемая в Android для запуска приложения без поддержки Vulkan
#android#android17
🤖Android 17 закручивает гайки для фонового аудио
В Android 17 появилось новое ограничение, которое затронет авторов музыкальных плееров, подкаст-приложений и всего, что воспроизводит звук в фоне без видимого UI.
Суть в следующем: теперь аудио фреймворк проверяет, имеет ли приложение право взаимодействовать с аудио в фоне. Без корректно запущенного foreground service с While-In-Use (WIU) возможностями звук просто отключится.
WIU — это условие, при котором Foreground Service запущен из видимого UI или в ответ на MediaSessionEvent. Если FGS запущен, например, по BOOT_COMPLETE и лезет в аудио — он будет заблокирован.
Рекомендуемый путь — использовать Jetpack Media3 MediaSessionService, который сам управляет жизненным циклом и не требует дополнительных телодвижений. Если media3 не используется, нужно вручную следить за тем, чтобы mediaPlayback FGS запускался из foreground и оставался живым на время транзиентных сбоев (не дольше 10 минут).
На мой взгляд, изменение правильное. Баги, когда приложение просыпается через несколько часов после заморозки и неожиданно начинает воспроизведение — реальная проблема. Другой вопрос, что тихая блокировка без каких-либо ошибок в API сделает диагностику неочевидной. Инструменты вроде `adb dumpsys audio` и logcat помогут, но разработчики, которые не читают changelog, узнают об этом только от пользователей.
🔗 Источник developer.android.com
#Android#AndroidDev#Android17
🤖Google рассказала больше про Contact Picker из Android 17
Вышла отдельная статья в блоге со скриншотами — можно наконец посмотреть как пикер выглядит в живую.
Из того, что не было в анонсе: на Android 17 старые ACTION_PICK с контактными типами автоматически апгрейдятся до нового пикера. То есть часть приложений получит приватный выбор контактов вообще без изменений кода. Приятный бонус для тех, кто не торопится мигрировать.
В Compose интегрируется через rememberLauncherForActivityResult — код в статье рабочий, можно брать напрямую.
🔗 Источник: android-developers.googleblog.com
📖 Документация: developer.android.com
#Android#AndroidDev#Android17
📹 В Android перестали появляться новые фичи. Разбирай каждый год новую версию ОС от Google я вообще не вижу там ничего существенно. Всё происходит для улучшения самой ОС: архитектуры, механизмов, ART, работы с памятью, а часть этих фичей доставляют и на предыдущие версии ОС.
Что это? Стагнация? Постепенное закрытие Android или подготовка к будущей трансформации ОС? Делюсь мыслями в новом видео https://youtu.be/WIhFnKRMIfY?si=QVsYvdJLVpmCFS8u
#AndroidBroadcast#Android#Android17