// Пример теста на 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
Три вещи, ради которых имеет смысл обновиться:
👉 Передача результатов между экранами. Больше не надо городить 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
👉 Новое экспериментальное 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 #AndroidDev #AndroidDevSummit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤1
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 #AndroidDev #Tooling #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥6❤2
Показано как искать проблемы на версиях Android с 12 и выше, а также на Android 11, Android 10 и ниже. Разница вызвана тем, что внутри ОС защиты разные инструменты для анализа.
#Android #AndroidDev #Оптимизация #UI
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍1
В блоге 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
Отладочные инструменты часто вызываются из
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🔥89👍8❤2
В видео разбираю подробности и эффект первой волны, ну и конечно же делюсь своим мнение касательно хорошей затеи во во славу безопасности пользователей!
#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-канале. Цена ниже привычных конференций.
🎟 Промокод
#реклама
Инженерные задачи редко состоят из одного действия.
В традиционной разработке их распределяют между специалистами. Мультиагентный подход переносит эту логику в ИИ: вместо одного исполнителя работают несколько виртуальных агентов. Как построить такую систему и сделать её эффективной?
Эксперты Podlodka AI Crew ответят на этот вопрос в новом сезоне «Мультиагентные системы» с 12 по 16 октября. Генеральный партнёр — RWB.
Что узнаете:
🧩 Как построить внутреннюю ИИ-платформу разработки
🧠 Как устроен «мозг» агента
🔄 Как убрать себя из агентского цикла с помощью оркестрации
🏭 Как построить «завод» из ИИ-агентов с узкими задачами
🔍 Как быстро находить ошибки и не тратить лишние токены
Формат: онлайн, 5 дней, утренние и вечерние сессии в Zoom. Много практики и обсуждений в закрытом Telegram-канале. Цена ниже привычных конференций.
🎟 Промокод
AI_BROADCAST — скидка на сайте#реклама
👍2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20