Android-приложения по умолчанию работают в одном процессе, но можно использовать несколько для решения нагруженных задач или изоляции.
Разработчик разобрал манифесты и байткод пятнадцати крупных Android-приложений. Отдельный процесс всегда дороже потока: своя инициализация, своя память, IPC вместо прямых вызовов в коде между потоками. Мультипроцессность имеет смысл только там, где Activity, Service и try/catch не закрывают задачу. Вот примеры:
isolatedProcess="true". Это другой UID: без разрешений приложения и без прямого доступа к его файлам. WhatsApp так же сжимает JPEG в изолированном сервисе.:memopt). Автор честно пишет, что без замеров это выглядит сомнительно.:snapkeyboard, камера Instagram с локскрина — :honolulu, Instant Games Facebook — :quicksilver, загрузчик TikTok — :downloader, capability-тесты YouTube — :glcheck. Например, это позволяет OOM отдельной функции не ронять всё приложение.Telegram, Spotify и ChatGPT свои сервисы (звонки, плеер, загрузки, войсы) держат в одном процессе. Несколько функций ≠ несколько процессов.
#Android #AndroidDev #Internals
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30❤5🔥2
Forwarded from Кирилл Розов
Обсудили как ИИ помогает делать массовый отклик (так и нашел позицию кандидат), как проходит процесс собеседования, офер: деньги, условия и прочие плюшки.
Где смотреть
#AndroidBroadcast #Видео
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤5
⚡️⚡️Топовый конкурс с розыгрышем билетов на Mobius 2026 Autumn
Разыгрываем 2 билета на Mobius — большую профильную IT-конференцию по мобильной разработке: нативной и кроссплатформенной.
📅 21–22 октября, Санкт-Петербург + online
Условия участия максимально простые:
1. Подписаться на каналы Mobius + Android Broadcast
2. Поставить любую реакцию на этот пост 👌
3. Нажать кнопку "Участвовать" 😎
Конкурс будет длиться 2 недели и закончится 7 октября.
Мы хотим, чтобы вы получили самый классный опыт от участия в Mobius — вдохновились докладами, нашли единомышленников и зарядились идеями для своих проектов вместе с нами!
🌟Также вы можете использовать промокод
Реклама. ООО «Джуг Ру Груп». ИНН 7801341446
Разыгрываем 2 билета на Mobius — большую профильную IT-конференцию по мобильной разработке: нативной и кроссплатформенной.
📅 21–22 октября, Санкт-Петербург + online
Условия участия максимально простые:
1. Подписаться на каналы Mobius + Android Broadcast
2. Поставить любую реакцию на этот пост 👌
3. Нажать кнопку "Участвовать" 😎
Конкурс будет длиться 2 недели и закончится 7 октября.
Мы хотим, чтобы вы получили самый классный опыт от участия в Mobius — вдохновились докладами, нашли единомышленников и зарядились идеями для своих проектов вместе с нами!
🌟Также вы можете использовать промокод
AndroidBroadcast, чтобы получить скидку 15% на покупку персонального билета!Реклама. ООО «Джуг Ру Груп». ИНН 7801341446
👍73🔥19❤5
Фича которую не просили, не ждали, но её добавили. Вам оно надо?
#AndroidBroadcast #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤5👍5
В Android 17 система вешает мягкие лимиты на процесс (Memory Limiter), особенно в фоне. Google Play отдельно считает анонимную память и swap по состояниям процесса, уже с Android 13. Оптимизация памяти, осознанный расход и чистка ненужных объектов в памяти теперь уже не избежать!
На Boosty вышло прикладное видео: как выделяется память приложению, чем это мерить и как не вылетать за лимиты без вреда для UX.
#AndroidBroadcast #Видео #Оптимизация #Разбор
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍12🔥9❤1
A2UI - прокотол для AI агентов, чтобы описать текстом, что надо показать пользователю (ага, очень похоже на BDUI)
Текстовый ответ AI агента ломается, когда нужна визуализация. Остается полагаться только на то как модель умеет строить UI. Обычно нечитаемая markdown каша, еще нормальным может быть HTML/JS, но для нативной мобилки не очень.
Стнадарт A2UI предлагает делать иначе. AI агент не рисует UI и ничего не исполняет. Шлёт JSON (дерево + данные), клиент рисует своими виджетами. Очень похоже на BDUI, где JSON отправляет сервер.
Протокол открытый под Apache 2.0 за которым стоит Google. Уже совсем скоро будет релиз первой финальной версии.
Клиент заранее объявляет каталоги компонентов, поэтому агент строит UI только из них. Обновления идут сообщениями
#AI #Agents #A2UI
Текстовый ответ AI агента ломается, когда нужна визуализация. Остается полагаться только на то как модель умеет строить UI. Обычно нечитаемая markdown каша, еще нормальным может быть HTML/JS, но для нативной мобилки не очень.
Стнадарт A2UI предлагает делать иначе. AI агент не рисует UI и ничего не исполняет. Шлёт JSON (дерево + данные), клиент рисует своими виджетами. Очень похоже на BDUI, где JSON отправляет сервер.
Протокол открытый под Apache 2.0 за которым стоит Google. Уже совсем скоро будет релиз первой финальной версии.
Клиент заранее объявляет каталоги компонентов, поэтому агент строит UI только из них. Обновления идут сообщениями
createSurface / updateComponents / updateDataModel. Клики и поля уходят обратно, агент патчит дерево.#AI #Agents #A2UI
❤14👍3
Media is too big
VIEW IN TELEGRAM
Лучшая демонстрация A2UI - чат с ИИ агентом в мобильном приложении, где агент дает ответы, а они нативно показываются в UI
#AI
#AI
🔥45
Решение от Google уже включает всё для интеграции с агентом, встроенным в ваше приложение.
Есть поддержка собственных каталогов компонентов и уже готовый на основе Material 3
Надеюсь, что это перенесут на Compose Multiplatform и получится удобно писать UI с агентами на Kotlin + Compose под все платформы!
🔗 Документация A2UI Compose
#Android #Compose #A2UI #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24👍7🔥1
Что нового
👉 Поддержка Java 27
👉 Улучшили отображение ошибок в логах
👉 Прокачали скорость работы на отдельных Windows компах
🛠 Исправление багов
#Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥2
// Пример теста на 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
🔥22
Три вещи, ради которых имеет смысл обновиться:
👉 Передача результатов между экранами. Больше не надо городить 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
👍33🔥12❤3
👉 Новое экспериментальное 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
👍6❤1