Android Good Reads
3.87K subscribers
344 photos
13 videos
1 file
2K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tanyasanovna
Download Telegram
Улучшаем проигрывание видео через ExoPlayer

👉 В Reddit классически использовали DASH формат для Android и HLS для web/iOS. -> Заменили на mp4 для коротких видео длиной менее 45 секунд. Количество ошибок плейбека снизилось на 5%, просмотры за счет ускорения запуска увеличились на 1%
👉 Не стали использовать SimpleCache и стандартные методы хранения, а воспользовались DownloadManager. У этого метода есть и минусы. Например, подгрузить заранее первые 500kb данных из видео - нельзя
👉 Динамический размер буферизации для видео разной длины. Это сказалось на метриках, а вообще про буферизацию в реддит можно почитать тут
👉 Адаптивный битрейт через BandwidthMeter так же сказался на продуктовых метриках
👉 Для рендера использовали TextureView, но планируют перезжать на SurfaceView, который лучше работает с GPU, но может сказаться на перфомансе и потреблении батарейки

И что?
Проводите A/B тесты не только продуктовых фичей, но и платформенных чтобы понимать куда двигаться дальше. Связывайте продуктовые и платформенные метрики. ExoPlayer предоставляет неплохой интерфейс AnalyticsListener чтобы собирать данные касательно плеера - не самый удобный, но лучше чем ничего
Android Good Reads
А как собеседоваться в 2023? На этот раз менее техническая статья, больше про то как попасть на собеседования. Актуально для тех кто ищет работу в Европе/США. Статья стоит того чтоб ее прочитать целиком 👉 Просто оставить свое резюме на сайте компании больше…
Во вторник была жаркая дискуссия в комментариях (рекомендую почитать). Один из выводов - нужно расширять свою сеть контактов в linkedIn. Всех заинтересованных прошу оставлять ссылки на себя в комментариях
А как дела у SwiftUI в кроссплатформе

Немного сыровато, но постепенно разрастается.
Фреймворк для сборки SwiftUI под Android: https://skip.tools/
к сожалению он платный 💵

Вариант использования предлагаемый командой -
Прицепить KMP к Skip
Please open Telegram to view this post
VIEW IN TELEGRAM
Очередная хайп-статья непопулярных мнений

👉 Android Разработка не про разработку на Jetpack Compose. Да, вам действительно нужно уметь работать с базой, строить архитектуру и следить за жизненным циклом приложения во время разработки, а не только верстать. Но ведь Compose это не только про UI, но и про подход к обращению с данными?
👉 DI это не только про Hilt/Dagger
Не зацикливайтесь на фреймворке при работе с паттерном
👉 Jetpack ViewModel это не ViewModel из MVVM
Первый позволяет вам создать компонент независимый от жизненного цикла приложения. Тогда как второй больше относится к абстракции в приложении и ограничению по работе между слоями данных. Вы можете использовать первую ViewModel, не поддерживать архитектуру MVVM но и наоборот
👉 Вы можете делать обращения к репозиторию напрямую из ViewModel.
Чистая архитектура подвергается критике последние несколько лет в том числе за ненужные слои абстракций. Если вам кажется, что очередная абстракция в виде usecase не решает никакой проблемы в вашем проекте - можете игнорировать этот слой
👉 Google рекомендации это всего лишь рекомендации
👉 Вы не bigtech.
Слепое следование лучшим практикам индустрии без оглядки на команду может стоить компании продукта. Лучшие практики, примеряемые в командах, где сотня только мобильных разработчиков, может сильно тормозить команду из 4 людей. Применяйте только то, что помогает вам работать, а не потому что так делают все
Распознование поз в реальном времени с ML kit

Расширяем кругозор и трогаем хайповый ML из Android. Не так сложно как кажется, так как все сокрыто за слоями абстракции Firebase.
Koin, ближайшие планы обновлений

В последнем обновлении 3.6 beta стабилизировали корутины, компоуз и в целом ядро Koin. Так же добавили интеграцию wasm и поддержали ViewModel api для compose miltiplatform. Однако, команда решила не выкатывать релиз 3.6, а сразу двинуться к 4.0, где поддержат Kotlin 2 и почистят deprecated api.

А что вы используете для DI? Напишите в комментариях, что у вас используется в проекте. Из ваших вариантов соберу опросник в канале. Посмотрим на распределение
This media is not supported in your browser
VIEW IN TELEGRAM
Скрытые фичи текстового поля

Что рассмотрят по ссылке выше:

👉 Динамический градиентный текст и курсор, внося изменения всего в 2 строки
👉 Кастомизация decorationBox в зависимости от написанного текста
👉 Изменения шрифта без задания font (как на гифке)
👉 Текстовое поле с маской для кредитной карты
👉 Перехват взаимодействия пользователя с текстовым полем
👉 User tagging в реальном времени
👉 Подмена экшн кнопки в клавиатуре
👉 Haptic feedback для разных символов
👉 Как поддержать media content вставляемый из клавиатуры (гифки или картинки из буфера обмена)
This media is not supported in your browser
VIEW IN TELEGRAM
Добавляем проверку на номер задачки в TODO через линтер

Пустые TODO маловероятно будут исправлены, если не имеют за собой закрепленной задачи. А имея задачу очень просто найти место где возникла проблема. Автоматизация проверки формата TODO через lint и как ее делать: тут и тут
Что используете в качестве статического анализатора кода в проекте?
Final Results
73%
Detekt
46%
Lint
29%
ktLint
1%
PMD
0%
FindBugs
2%
bash скрипты 🤨
Android Good Reads
Какой DI фреймворк используете?
А вот вам еще 1 DI фреймворк, который никто не упомянул ранее!

Используем kotlin-inject в Kotlin/Compose Multiplatform проекте

Не рекомендация к использованию, а расширения кругозора ради: kotlin-inject (1200+ ⭐️)
Сompile-time инъекция зависимостей, не переусложненная схема использования и поддержка multiplatform (по сути, единственная альтернатива koin)
Please open Telegram to view this post
VIEW IN TELEGRAM
Как под капотом работает @Preview?

👉 Для просмотра метода с @Preview аннотацией используется androidx.compose.ui.tooling.PreviewActivity, который собирает параметры из @PreviewParameter и свойства из @Preview
👉 Все это должно как то собираться воедино, да? Это происходит во время градловской команды androidTest. На выходе получаем apk с превьюшками, который выводится в Android Studio.
👉 Как можно этим воспользоваться? Например, положить AndroidManifest.xml в module/src/androidTest и поменять параметры приложения, которое запускается для preview. А значит, мы можем и сами собрать приложение из наших @Preview и любых @Composable элементов на девайс!

В статье больше технических примеров, рекомендую глянуть. Практического применения этим знаниям я не могу найти, поправьте меня в комментариях если у вас есть идеи, но знать как работает под капотом инструмент, которым ты пользуешься всегда полезно
🗿 Полезности по защите кодовой базы. Чтобы скрыть часть своего проекта от Gemini LLM, которая присутствует в последних версиях Android Studio - добавьте .aiexclude файл по аналогии с .gitignore в корень проекта и укажите директории или конкретные файлы.

Документация: https://developer.android.com/studio/preview/gemini/aiexclude
Please open Telegram to view this post
VIEW IN TELEGRAM
Цикл статей про архитектуру от Zsolt.

👉 Вводная часть про инструменты и что нас ждет в следующих частях
👉 Про обработку ошибок и Монады. Читаем про то что такое монады, как это связано с архитектурой Android и на какому слое приложить
👉 Mapping Зачем это делать и почему нельзя использовать 1 серверную модель на всех слоях. Нужно ли тестировать этот процесс, и как именовать функции чтобы не запутаться
👉 Response vs Reply классы Отличия и когда-какие используем. Организация нетворк слоя

Это не гайд для архитекторов, а скорее для мидлов, которым нужно начать углубляться в детали организации слоя данных
Google Workspace переносит свои продукты на KMP

Прошедший KotlinConf24 принес еще одну новость. Команда Google Workspace, а это такие приложения как Gmail, Docs, Meet, Calendar переводит свои продукты на KMP. Первым будет приложение Google Docs.

И это очень крутая поддержка для KMP и расширение комьюнити.
Android Good Reads
🗿 Полезности по защите кодовой базы. Чтобы скрыть часть своего проекта от Gemini LLM, которая присутствует в последних версиях Android Studio - добавьте .aiexclude файл по аналогии с .gitignore в корень проекта и укажите директории или конкретные файлы. Документация:…
Как Google поможет найти уязвимости в вашем коде

В ходе проверки линтером выявляются известные уязвимости и выводятся рекомендации по их исправлению со ссылкой на источник. Это полезно, потому что держать в голове весь OWASP в области мобильной разработки (https://mas.owasp.org/MASVS/) попросту невозможно. Работает начиная с AS Giraffe+
Тем временем команда Android Studio выпустила Ladybug Canary 5 🐞, а недавний Feature Drop перешел в стадию релиз-кандидата

Что это значит для вас?
👉 Те кто сидит на Preview версии получил обновление IDE до 2024.2 + небольшие исправления существующего функционала. KMM плагин, как обычно, появится ближе к бете
👉 Для тех кто предпочитает стабильность, Koala получает финальные исправления и ждет вас с новым терминалом в стадии RC
Please open Telegram to view this post
VIEW IN TELEGRAM
MutableState vs MutableStateFlow

👉 Область применения
MutableState используется в основном совместно с Jetpack Compose обобщая состояние
MutableStateFlow можно использовать на любом уровне абстракции в том числе на слое данных

👉 Потоки
MutableStateFlow потокобезопасен в отличии от MutableState у которого возникают сложности при объединении с фоновыми процессами

👉 Жизненный цикл
MutableState тесно связан с жизненным циклом Compose и гарантирует что не возникнет проблем на UI
MutableStateFlow больше привязан viewModelScope и подойдет для асинхронной работы с данными

В целом, это абсолютно разные вещи, несмотря на схожесть в нейминге. Не путайте State и StateFlow ❗️
Please open Telegram to view this post
VIEW IN TELEGRAM
Квиз!

В Composable, в большинстве случаев, если мы используем mutableStateOf(), мы фиксируем его состояние через remember(), чтобы сохранить его при рекомпозициях. Но если мы используем mutableStateOf() в Activity — нужно ли нам использовать remember()?

Пример кода:
class MainActivity : ComponentActivity() {

private var text = mutableStateOf("Hello!")

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AppTheme {
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
TextField(value = text.value, onValueChange = {
text.value = it
})

Text(text = text.value)
}
}
}
}
}


Ответ: клик
Нужно ли использовать remember ?
Final Results
35%
Да, необходимо
65%
Нет