Выполнение запросов SQLite на множестве потоков может привести к замедлению вашего приложения 🤯
Разработчик делает классный разбор того, как работают запросы SQLite в Android и как их оптимизировать. Статья - параллельность в Android SQLite (EN,11м)
Основные выводы:
👉 Используйте забандленную версию SQLite (добавит около 1 Мб за каждый ABI)
👉 Если работает с несколькими БД через ROOM, то задавайте CoroutineContext или Executor для выполнения запросов
👉Больше полезного в статье, почитай. Она того стоит
#android #room #sqlite #jetpack
Разработчик делает классный разбор того, как работают запросы SQLite в Android и как их оптимизировать. Статья - параллельность в Android SQLite (EN,11м)
Основные выводы:
👉 Используйте забандленную версию SQLite (добавит около 1 Мб за каждый ABI)
👉 Если работает с несколькими БД через ROOM, то задавайте CoroutineContext или Executor для выполнения запросов
👉
#android #room #sqlite #jetpack
🤯28👍14❤3
Forwarded from AvitoTech
Зачем мы пошли в разработку своих решений на базе low-сode & Backend-Driven UI
Представим, что перед нами стоит максимально тривиальная задача — поменять в карточке объявлений цену, выделив ее ярким фоном, и название товара.
Обновления необходимо внести на всех трех платформах: Web, Android и iOS. Следовательно, задача должна пройти полный цикл разработки — от постановки в бэклог до финального релиза. И вот тут возникает проблема. Во-первых, команды могут быть заняты решением более приоритетных задач. Во-вторых, разные платформы обновляются по-разному. И, как итог, time to market даже для такого простого изменения составит существенную величину.
📌 Решить это можно через переход на WebView или использование кроссплатформенных инструментов, таких как Flutter. Однако мы остановились на подходе Backend-Driven UI. Что из этого вышло рассказал в новой статье Михаил Шевченко, архитектор и разработчик backend low-code-платформы Bricks в Авито.
#backend_avitotech #habr_avitotech
Представим, что перед нами стоит максимально тривиальная задача — поменять в карточке объявлений цену, выделив ее ярким фоном, и название товара.
Обновления необходимо внести на всех трех платформах: Web, Android и iOS. Следовательно, задача должна пройти полный цикл разработки — от постановки в бэклог до финального релиза. И вот тут возникает проблема. Во-первых, команды могут быть заняты решением более приоритетных задач. Во-вторых, разные платформы обновляются по-разному. И, как итог, time to market даже для такого простого изменения составит существенную величину.
#backend_avitotech #habr_avitotech
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍5
Развитие Android глазами разработчика(11м)
Обзор как развивался с 2007 года и до новых дней: Ant, Eclispe, NetBeans, RoboGuiece, ActionBarSherlock, AsyncTask, EventBus, MVC, Android Studio, Gradle, Material Design, RxJava, Volley, Retrofit, MVP/MVVM, Dagger, Kotlin, Coroutines, Gradle Kotlin DSL, Jetpack Compose, MVI,
#android
Обзор как развивался с 2007 года и до новых дней: Ant, Eclispe, NetBeans, RoboGuiece, ActionBarSherlock, AsyncTask, EventBus, MVC, Android Studio, Gradle, Material Design, RxJava, Volley, Retrofit, MVP/MVVM, Dagger, Kotlin, Coroutines, Gradle Kotlin DSL, Jetpack Compose, MVI,
#android
🔥33👍9
Детские ошибки при сборке Gradle-приложений (10м)
Статья с рекомендациями по ускорению Gradle сборки Android и не только проектов
👉 Прибегайте к инкрементальной сборке
👉 Настройте Gradle Build Cache
👉 Включите Gradle Configuration Cache. Нужно чтобы все подключенные плагины поддерживали Config Cache. Актуальный статус тут
👉 Используйте Gradle Daemon
👉 ABI vs non-ABI зависимости
Всё очень базово и вы не найдете в статье рецепты, но точно подсветит базу
#gradle #android #производительность
Статья с рекомендациями по ускорению Gradle сборки Android и не только проектов
👉 Прибегайте к инкрементальной сборке
👉 Настройте Gradle Build Cache
👉 Включите Gradle Configuration Cache. Нужно чтобы все подключенные плагины поддерживали Config Cache. Актуальный статус тут
👉 Используйте Gradle Daemon
👉 ABI vs non-ABI зависимости
Всё очень базово и вы не найдете в статье рецепты, но точно подсветит базу
#gradle #android #производительность
🔥35🤯6👍4
Google I/O 2025 пройдет 20-21 мая. Ждем новые анонсы и много слов AI. Скорее всего в рамках Googel IO и выпустят стабильную Android 16
#googleio
#googleio
👍23
Google выпустила Codelab по погружению в разработку под Android XR - ОС на основе Android для устройств смешенной реальности
#android #codelab #androidxr
#android #codelab #androidxr
👍23🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Демонстрация добавления перевода строк с помощь Gemini в Android Studio
Какие сценарии для AI в IDE вы еще бы хотели увидеть ?
#androidstudio #gemini
Какие сценарии для AI в IDE вы еще бы хотели увидеть ?
#androidstudio #gemini
👍50🔥6🤯2
Не нужно делать UseCase для простых вызовов
В статье приводится пример с получением данных через UseCase с простым вызовом метода из единственной зависимости. Конечно, есть принятый подход, но зачем делать лишний класс только потому, что "так принято".
Мне не нравится делать так:
а на замену просто получать данные из репозитория в ViewModel:
Не делайте избыточный код просто потому, что так принято у всех остальных или потому, что так сказал какой-то умный эксперт по разработке. Оценивайте здраво, что вам нужно сейчас, и при изменении требований вводите новые элементы в архитектуре.
#android #архитектура #лучшиепрактики
В статье приводится пример с получением данных через UseCase с простым вызовом метода из единственной зависимости. Конечно, есть принятый подход, но зачем делать лишний класс только потому, что "так принято".
Мне не нравится делать так:
class FetchMemesUseCaseImpl(
private val memeRepository: MemeRepository
) : FetchMemesUseCase {
override suspend operator fun invoke(): List<Meme> {
return memeRepository.fetchMemes()
}
class MemeListViewModel(
private val fetchMemesUseCase: FetchMemesUseCase
) : ViewModel()
а на замену просто получать данные из репозитория в ViewModel:
class MemeListViewModel(
private val memeRepository: MemeRepository
) : ViewModel()
Не делайте избыточный код просто потому, что так принято у всех остальных или потому, что так сказал какой-то умный эксперт по разработке. Оценивайте здраво, что вам нужно сейчас, и при изменении требований вводите новые элементы в архитектуре.
#android #архитектура #лучшиепрактики
🔥98👍34🤯11💯8❤1👏1
В вашем коде есть UseCase в одну строку? (как в посте выше)
Anonymous Poll
50%
Да
29%
Нет
2%
Не знаю
15%
Не использую UseCase
0%
Не пишу код
4%
Не участвую в опросе
👍4
Увлекательное путешествие в мир безопасности Android! Разобрали самые интересные и коварные уязвимости, такие как Path Traversal, SQL-инъекции и Tapjacking. Но основное внимание уделили WebView: неправильной валидации данных, уязвимостям в библиотеке для парсинга URL, JavaScript Interface и загрузке диплинков.
В докладе нет скучных терминов и монотонных объяснений. Вместо этого — захватывающая история поиска уязвимостей и их устранения, основанная на личном опыте при разработке приложений.
Будет полезно всем тем, кто интересуется безопасностью Android-приложений.
📹 Версия на VK Video
#android #безопасность #mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍38❤9🔥1
Как лишние ресурсы могут повлиять на UI вашего приложения
Библиотеки от Google и других популярных SDK часто содержат строки для десятков локалей, тогда как большинство приложений поддерживают всего 7–10 наиболее востребованных языков.
Механизм выбора ресурсов в Android устроен таким образом, что система подбирает наиболее подходящий ресурс с учётом квалификаторов (например, локали). Если для конкретной локали, установленной на устройстве, в вашем проекте отсутствует соответствующий перевод, система может использовать строку из библиотеки по умолчанию. Это может привести к неожиданному отображению интерфейса.
Чтобы избежать подобных ситуаций, вы можете явно задать набор локалей, которые поддерживает ваше приложение. Тогда все ресурсы для неуказанных локалей не попадут в финальный APK, что не только снижает его размер, но и обеспечивает предсказуемость UI.
Пример настройки в build.gradle.kts (application модуль):
Ранее Android Gradle Plugin позволял фильтровать ресурсы по различным группам квалификаторов (например, плотность экрана, ориентация и т.д.), однако начиная с AGP 8.0 эта возможность объявлена устаревшей и поддерживается только фильтрация по локалям. Это связано с тем, что App Bundle эффективно разделяет ресурсы по плотности экрана, а применение других фильтров использовалось крайне редко.
#android #gradle #локализация #лучшиепрактики
Библиотеки от Google и других популярных SDK часто содержат строки для десятков локалей, тогда как большинство приложений поддерживают всего 7–10 наиболее востребованных языков.
Механизм выбора ресурсов в Android устроен таким образом, что система подбирает наиболее подходящий ресурс с учётом квалификаторов (например, локали). Если для конкретной локали, установленной на устройстве, в вашем проекте отсутствует соответствующий перевод, система может использовать строку из библиотеки по умолчанию. Это может привести к неожиданному отображению интерфейса.
Чтобы избежать подобных ситуаций, вы можете явно задать набор локалей, которые поддерживает ваше приложение. Тогда все ресурсы для неуказанных локалей не попадут в финальный APK, что не только снижает его размер, но и обеспечивает предсказуемость UI.
Пример настройки в build.gradle.kts (application модуль):
android {
androidResources {
// Автоматически сгенерировать список локалей на основе ресурсов проекта
// По умолчанию false
generateLocaleConfig = true
// Либо явно указать поддерживаемые локали
localeFilters.addAll(setOf("en", "ru", "es", "de"))
}
}Ранее Android Gradle Plugin позволял фильтровать ресурсы по различным группам квалификаторов (например, плотность экрана, ориентация и т.д.), однако начиная с AGP 8.0 эта возможность объявлена устаревшей и поддерживается только фильтрация по локалям. Это связано с тем, что App Bundle эффективно разделяет ресурсы по плотности экрана, а применение других фильтров использовалось крайне редко.
#android #gradle #локализация #лучшиепрактики
👍46🔥10
Forwarded from AvitoTech
This media is not supported in your browser
VIEW IN TELEGRAM
Три слова для привлечения внимания любого тимлида: OKR, планирование и мотивация команды 🚀
А теперь, пока вы тут: встречаемся 26 февраля на Avito TeamLead Drinkup #3!
Обсудим, как оценивать софт скиллы на собеседовании, растить и мотивировать команду и зачем ИИ в менеджменте. Без нетворка, конечно, не оставим — он будет после основной программы.
Для регистрации кликайте сюда. Осталось не так много мест!🔥
#management_avitotech
А теперь, пока вы тут: встречаемся 26 февраля на Avito TeamLead Drinkup #3!
Обсудим, как оценивать софт скиллы на собеседовании, растить и мотивировать команду и зачем ИИ в менеджменте. Без нетворка, конечно, не оставим — он будет после основной программы.
Для регистрации кликайте сюда. Осталось не так много мест!
#management_avitotech
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Вышла вторая из четырёх Beta версий Android 16. Улучшили работу с медиа, новые возможности Camera2 API, форсирование Edge-to-edge и другие. Как всегда расскажу отдельными постами про самые интересные фичи
#android16
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤2
val intent = Intent(MediaStore.ACTION_MOTION_PHOTO_CAPTURE)
// или MediaStore.ACTION_MOTION_PHOTO_CAPTURE_SECURE
// Задаем куда сохранить
intent.putExtra(MediaStoreEXTRA_OUTPUT, uri)
// или Uri через ClidData
intent.setClipData(clipData)
context.startActivity(intent)
#android16
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
В Android 16 добавлены новые режимы гибридной автоэкспозиции (Hybrid AE) в Camera2. Теперь можно вручную управлять отдельными параметрами экспозиции, оставляя остальное на алгоритм автоэкспозиции (AE).
Доступны два новых режима:
👉 ISO + AE – вы задаёте ISO, а автоэкспозиция регулирует выдержку.
👉 Выдержка + AE – вы управляете временем экспозиции, а AE настраивает ISO.
Это даёт больше гибкости по сравнению с прежним подходом, где нужно было либо полностью полагаться на автоэкспозицию, либо вручную контролировать все параметры.
fun setISOPriority() {
// ...
val availablePriorityModes = mStaticInfo.characteristics.get(
CameraCharacteristics.CONTROL_AE_AVAILABLE_PRIORITY_MODES
)
// ...
// Включение AE режима
reqBuilder.set(
CaptureRequest.CONTROL_AE_MODE,
CameraMetadata.CONTROL_AE_MODE_ON
)
reqBuilder.set(
CaptureRequest.CONTROL_AE_PRIORITY_MODE,
CameraMetadata.CONTROL_AE_PRIORITY_MODE_SENSOR_SENSITIVITY_PRIORITY
)
reqBuilder.set(
CaptureRequest.SENSOR_SENSITIVITY,
TEST_SENSITIVITY_VALUE
)
val request: CaptureRequest = reqBuilder.build()
// ...
}#android #android16 #камера #camera2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
В Android 16 появилась поддержка точной настройки цветовой температуры и оттенка для камеры, что особенно полезно для профессиональных видеосъёмочных приложений.
Ранее в Android управление балансом белого осуществлялось через CONTROL_AWB_MODE, но выбор ограничивался предустановками (например, “Лампа накаливания”, “Облачно”, “Сумерки”).
Теперь новый режим COLOR_CORRECTION_MODE_CCT позволяет использовать параметры COLOR_CORRECTION_COLOR_TEMPERATURE и COLOR_CORRECTION_COLOR_TINT для более точной коррекции баланса белого на основе коррелированной цветовой температуры (CCT).
Пример кода:
fun setCCT() {
val colorTemperatureRange: Range<Int> =
mStaticInfo.characteristics[CameraCharacteristics.COLOR_CORRECTION_COLOR_TEMPERATURE_RANGE]
// Переключаемся в ручной режим для активации CCT
reqBuilder[CaptureRequest.CONTROL_AWB_MODE] = CameraMetadata.CONTROL_AWB_MODE_OFF
reqBuilder[CaptureRequest.COLOR_CORRECTION_MODE] = CameraMetadata.COLOR_CORRECTION_MODE_CCT
reqBuilder[CaptureRequest.COLOR_CORRECTION_COLOR_TEMPERATURE] = 5000
reqBuilder[CaptureRequest.COLOR_CORRECTION_COLOR_TINT] = 30
val request: CaptureRequest = reqBuilder.build()
}Теперь разработчики могут добиваться более точной цветопередачи, что особенно важно для профессиональной видеосъёмки.
#android #android16 #camera2 #камера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👏2
Появилась поддержка UltraHDR в HEIC, также работают на поддержкой в AVIF. Также добавили новые параметры UltraHDR из черновика стандарта ISO 21496-1
#android #android16
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
В Android 15 есть флаг R.attr#windowOptOutEdgeToEdgeEnforcement, который позволял отключить для приложения "обязательное" включение Edge-to-Edge. В Android 16 флаг помечен как устаревший (deprecated) и система его игнорирует, а значит для вашего приложения включится режим отображения от края до края экрана.
#android #android16 #edgetoedge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🤯21