Streamflix - приложение-кинотеатр с открытым исходным кодов для Android смартфонов, планшетов и Android TV для просмотра фильмов и ТВ шоу. Для видео используется ExoPlayer из Jetpack Media 3
#android #пример #opensource #androidtv #медиа
#android #пример #opensource #androidtv #медиа
🔥23👍3❤2
Стек технологий: Jetpack Compose, KotlinX Coroutines, Room, Dagger + Hilt, Coil
#android #opensource #пример #fdroid #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39❤5🤯2
‼️ Защита от атак на приложения через изменение AndroidManifest
При сборке APK финальный AndroidManifest формируется из нескольких источников:
👉 AndroidManifest всех модулей в коде вашего приложения
👉 AndroidManifest из подключённых AAR-зависимостей
👉 Изменения через Android Gradle Plugin (например, подстановка параметров и указание namespace)
👉 Сторонние Gradle-плагины, модифицирующие манифест через AGP
В результате итоговый AndroidManifest представляет собой комбинацию множества частей. Подробнее о процессе его объединения я рассказывал в этом📹 видео.
🔒 Как защититься от скрытых изменений манифеста?
Рекомендую автоматизировать проверку с помощью Gradle-плагина manifest-guard.
✅ Плагин позволяет сохранить эталонный AndroidManifest и автоматически проверять его при сборке проекта.
✅ Можно настроить запуск проверки на CI: если манифест изменился, сборка упадёт, а вы получите HTML-отчёт с разницей между эталоном и текущей версией.
#android #безопасность
При сборке APK финальный AndroidManifest формируется из нескольких источников:
👉 AndroidManifest всех модулей в коде вашего приложения
👉 AndroidManifest из подключённых AAR-зависимостей
👉 Изменения через Android Gradle Plugin (например, подстановка параметров и указание namespace)
👉 Сторонние Gradle-плагины, модифицирующие манифест через AGP
В результате итоговый AndroidManifest представляет собой комбинацию множества частей. Подробнее о процессе его объединения я рассказывал в этом
🔒 Как защититься от скрытых изменений манифеста?
Рекомендую автоматизировать проверку с помощью Gradle-плагина manifest-guard.
✅ Плагин позволяет сохранить эталонный AndroidManifest и автоматически проверять его при сборке проекта.
✅ Можно настроить запуск проверки на CI: если манифест изменился, сборка упадёт, а вы получите HTML-отчёт с разницей между эталоном и текущей версией.
#android #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍47🤯8
LinkedIn и JetBrains запартнёрились и теперь и запустили сертификацию по java.
Курс "Java Foundations Professional Certificate by JetBrains" направлен на начинающих и включается 5 глав: синтаксис, ООП, объекты и APIs, структуры данных и JDBC, после чего можно получить сертификат.
Жду программы по Kotlin
#jetbrains #linkedin #сертификация
Курс "Java Foundations Professional Certificate by JetBrains" направлен на начинающих и включается 5 глав: синтаксис, ООП, объекты и APIs, структуры данных и JDBC, после чего можно получить сертификат.
Жду программы по Kotlin
#jetbrains #linkedin #сертификация
❤50🔥14👍12
Это позволит использовать единую версию SQLite на всех устройствах и получать преимущества в скорости работы от новых функций. Причем эта возможность доступна для всех поддерживаемых платформ, которые поддерживает Room: Android, iOS, Desktop.
🔗 Подробности в документации
#android #sqlite #room #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40🔥11🤯3
Media is too big
VIEW IN TELEGRAM
В Android Studio Meerkat 2024.3.1 появится возможность создавать KMP Shared модуль для Android и iOS
#androidstudio #kmp #android #ios
#androidstudio #kmp #android #ios
🔥78👍13🤯5
Выполнение запросов 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