Android Broadcast
14.5K subscribers
3.85K photos
399 videos
11 files
6.32K links
Подборка новостей и статей для Android разработчиков.

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

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
🚀 Google готовит библиотеку AndroidX Backup Test (пока только первая альфа) для тестирования переноса аккаунта между девайсами, которое становится обязательным в Google Play

// Пример теста на JUnit 5
@ExtendWith(BackupRestoreExtension::class)
@BackupRestoreConfig(applicationId = "com.example.app")
class BackupRestoreTest {

@Test
fun prefsSurviveCloudRestore(
controller: BackupRestoreController,
@TempDir outputDir: Path,
) = runBlocking {
controller.runBackupRestoreFlow(
storage = StorageDomain.Preference("user_prefs"),
outputDir = outputDir,
mode = BackupTransportMode.CLOUD_ENCRYPTED,
)
}
}


#Android #AndroidDev #AndroidJetpack #Backup #Тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24
🚀 Вышел androidx.navigation3 1.2.0. И этот как раз допил того, что надо в реальных кейсах навигации.

Три вещи, ради которых имеет смысл обновиться:

👉 Передача результатов между экранами. Больше не надо городить SharedViewModel или колбэки через хост. Обмен происходит через шину ResultEventBus. Для сценариев «выбрал и вернулся» это как раз то, чего не хватало.

NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberResultEventBusNavEntryDecorator(),
),
entryProvider = entryProvider {
entry<Home> {
val viewModel = viewModel<HomeViewModel>()

ResultEffect<Address> { address ->
viewModel.onAddressSelected(address)
}

HomeScreen(
address = viewModel.address,
onPickAddress = { backStack.add(AddressPicker) },
)
}

entry<AddressPicker> {
val resultBus = LocalResultEventBus.current
AddressPickerScreen(
onSelected = { address ->
resultBus.sendResult(address)
backStack.removeLastOrNull()
},
)
}
},
)


👉 Поддержка KMP Deep Link API в androidx.navigation3.runtime.deeplink

👉 Упростили работы с Predictive back gesture в Android. Теперь не придется высчитывать дельту самостоятельно

#Compose #JetpackCompose #Navigation3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40🔥15❤6
🚀 Вышел WorkManager 2.12.0

👉 Новое экспериментальное Work Metrics API для изучения истории выполнения задач.

@OptIn(ExperimentalWorkMetricsApi::class)
suspend fun dumpSyncMetrics(repo: WorkMetricsInfoRepository) {
val query = WorkMetricsQuery.Builder()
.addWorkerClassNames(SyncWorker::class.java.name)
.addTags("sync")
.setBeginTimeMillis(...)
.build()

repo.getWorkMetricsInfos(query).forEach { info ->
Log.d(
"WM",
"${info.workerClassName} " +
"state=${info.state} " +
"attempts=${info.runAttemptCount} " +
"retries=${info.explicitRetryCount} " +
"worker=${info.workerDurationMillis}ms " +
"total=${info.totalRuntimeMillis}ms " +
"stops=${info.stopReasonCounts}"
)
}
}


👉 Новое экспериментальное API для слежения за событиями разных Work
// ExecutionEventListener — все 4 метода abstract
// cheduleEventListener — default, можно повесить только нужные.
@OptIn(ExperimentalEventsApi::class)
class WorkTelemetry : ExecutionEventListener, ScheduleEventListener {

override fun onStarted(workInfo: WorkInfo) {
Log.d("WM", "start ${workInfo.id} ${workInfo.workerClassName}")
}

override fun onFinished(result: ListenableWorker.Result, workInfo: WorkInfo) {
Log.d("WM", "finish ${workInfo.id} $result attempts=${workInfo.runAttemptCount}")
}

override fun onStopped(stopReason: Int, workInfo: WorkInfo) {
Log.d("WM", "stop ${workInfo.id} reason=$stopReason")
}

override fun onException(throwable: Throwable, workInfo: WorkInfo) {
Log.e("WM", "crash ${workInfo.id}", throwable)
}

override fun onEnqueued(workInfo: WorkInfo) { }

override fun onUnblocked(workInfo: WorkInfo) { }

override fun onUpdated(oldWorkInfo: WorkInfo, updatedWorkInfo: WorkInfo) { }

override fun onCancelled(workInfo: WorkInfo) { }

override fun onPrerequisiteFailed(workInfo: WorkInfo) { }
}


Что еще поменялось
👉 minSdk 23 -> 24 (Android 7.0 теперь минимум)
👉 дефолтный executor теперь Dispatchers.Default вместо собственного. Все также можно переопределить
🛠 Исправление багов и улучшение производительности

#Android #AndroidDev #WorkManager #AndroidJetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2
🤖 Android Dev Summit возвращается! Конференция от Google про Android для разработчиков снова пройдет в конце октября 2026! Уже есть расписание

#Android #AndroidDev #AndroidDevSummit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤1
🤖 Google прокачала Wi-Fi дебаг в Android 17 и вот как

Google выкатил ADB Wi-Fi 2.0 в Android 17: новый mDNS-стек вместо Bonjour и старого mDNS, плюс adbd сам гасит wireless debugging на недоверенной сети и поднимает обратно, когда ты снова дома.

Что стало лучше (цифры от Google)
👉 скорость автоконнекта +32%
👉 скорость коннекта увеличилась на 66% на 90% сессий

На практике важнее другое. В Device Manager устройство появляется само, если на телефоне включён Wireless debugging. QR или код, без ручного IP.

Чтобы это работало надо использовать:
👉 Девайс на Android 17 или новее
👉 Android Platform-Tools 37.0.0 или новее
👉 Android Studio Quail 3 или новее

Я пользуюсь отладкой по беспроводу и это удобно, но ВАЖНО иметь хорошую точку доступа (точно 5 или 6 GHz) с высокой скоростью, иначе все ускорения коту под хвост.

🔗 Документация
📹 Доклад на Android Makers 2026

#Android #AndroidDev #Tooling #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥6❤2
🤖 Обновленный гайд по поиску лагов UI в Android

Показано как искать проблемы на версиях Android с 12 и выше, а также на Android 11, Android 10 и ниже. Разница вызвана тем, что внутри ОС защиты разные инструменты для анализа.

#Android #AndroidDev #Оптимизация #UI
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍1
🛒 Google Play расширяет возможности и типы платных подписок

В блоге Android Developers рассказали про большой пакет обновлений по Google Play Billing, который будет раскатываться постепенно.

Из уже доступного всем явно называют только In-App Messaging API: всплывающие уведомления внутри приложения, чтобы починить отклонённую карту или предупредить о смене цены подписки.

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

👉 Multi-Quantity — покупаешь несколько копий подписок один раз и можно раздать их семье, команде или студентам. Это то, чего B2B и EdTech на Play не хватало годами.

👉 Usage-Based Billing — предоплата + автопополнение, когда баланс падает ниже порога. Направлено на тип "Pay as You Go", например, генерация картинок/видео. Также убирает зависимость от платёжки картой и в теории должно повысить процент успешного оформления.

👉 Mixed Carts — подписка и one-time purchase в одной оплате и одном API-вызове. Можно добавлять скидку, если берут бандл.

👉 Cross-Developer Bundling — связка двух подписок, в том числе с чужим приложением. Коллабы становится делать выгоднее.

#Android #AndroidDev #GooglePlay
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥7❤1
‼️NoOp — удобный способ отключить API в релизных сборках без усложнения кода

Отладочные инструменты часто вызываются из src/main: логирование экрана, свой интерцептор OkHttp. По умолчанию такой код попадает в релиз, а пользователю он не нужен. Чтобы оставить его только в отладочных сборках, обычно прячут каждый вызов под if (DEBUG), разносят сами вызовы по разным src или заводят плагинную архитектуру.

NoOp проще. Две реализации одного публичного API: одна рабочая, вторая с теми же методами, но без работы. Вызов в общем коде не меняется, в релизе он ничего не делает. По исходникам разделяется только место, где создаётся реализация.

interface ScreenTracer {
fun trace(screen: String)

object NoOp : ScreenTracer {
override fun trace(screen: String) = Unit
}
}


// src/release
fun createScreenTracer(): ScreenTracer = ScreenTracer.NoOp

// src/debug. Этот класс в release не попадает.
fun createScreenTracer(): ScreenTracer = DebugScreenTracer()

class DebugScreenTracer : ScreenTracer {
override fun trace(screen: String) {
Log.d("Screen", screen)
}
}


class AppContainer(
val screenTracer: ScreenTracer = createScreenTracer(),
)


// Одна и та же строка в debug и в release
screenTracer.trace("Checkout")


Пример маленький, но так же собираются целые модули. Правила те же:

1. Публичное API совпадает целиком: те же типы, методы и сигнатуры.
2. Если метод что-то возвращает, NoOp отдаёт нейтральное значение, от которого дальше ничего не запускается: null, пустую коллекцию, константу DISABLED, -1.
3. Методы NoOp не делают работу: не пишут логи, не ходят в сеть, не держат состояние.

//  Подключение зависимостей с разной реализацией
debugImplementation(project(":lib:debug"))
releaseImplementation(project(":lib:noop"))


Оба модуля отдают одни и те же публичные типы. В сборку попадает один из них.

NoOp можно сочетать с вырезанием кода на этапе R8, чтобы в релизе не осталось даже заглушки. Если пост наберёт 200 огоньков 🔥 , разберу, как совместить оба подхода.

#Android #AndroidDev #Архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥86👍8❤2
📹 День, когда сайдлоадинг остановился. Google запустила верификацию разработчиков при установке приложений на сертифицированные Android смартфоны.

В видео разбираю подробности и эффект первой волны, ну и конечно же делюсь своим мнение касательно хорошей затеи во во славу безопасности пользователей!

📹 Смотреть на YouTube

#AndroidBroadcast #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3🔥3
👨🏻‍💻 Строим мультиагентные системы для разработки на Podlodka AI Crew

Инженерные задачи редко состоят из одного действия.
В традиционной разработке их распределяют между специалистами. Мультиагентный подход переносит эту логику в ИИ: вместо одного исполнителя работают несколько виртуальных агентов. Как построить такую систему и сделать её эффективной?

Эксперты Podlodka AI Crew ответят на этот вопрос в новом сезоне «Мультиагентные системы» с 12 по 16 октября. Генеральный партнёр — RWB.

Что узнаете:
🧩 Как построить внутреннюю ИИ-платформу разработки
🧠 Как устроен «мозг» агента
🔄 Как убрать себя из агентского цикла с помощью оркестрации
🏭 Как построить «завод» из ИИ-агентов с узкими задачами
🔍 Как быстро находить ошибки и не тратить лишние токены


Формат: онлайн, 5 дней, утренние и вечерние сессии в Zoom. Много практики и обсуждений в закрытом Telegram-канале. Цена ниже привычных конференций.

🎟 Промокод AI_BROADCAST — скидка на сайте

#реклама
👍2❤1