Reklama va hamkorlik bo'yicha: @oshigi_jannatim
Hamkor kanal: @xazilbek
Last updated 1 month, 2 weeks ago
Сотрудничество: esaul@mediar.pro
Телега со стилем и шмотом: https://t.me/esaulstyle
Это ютуб крутой бабы: https://youtube.com/c/vika02032000
Дискорд: https://discord.gg/HPzQ85rZck
Last updated 3 days, 12 hours ago
Sync speedup в Gradle
#gradle
Вечная тема для Android-разработчиков — уменьшение времени сборки и ускорение Gradle.
Вот вам ещё одна улучшайка в копилку, сам пока не пробовал, но выглядит любопытно.
Автор обратил внимание на добавляемые репозитории в проект и решил посмотреть на то, куда уходит время при синке. Выяснилось, что много времени уходит на попытки получения зависимостей в тех репозиториях, где их нет, из-за чего sync увеличивается по времени.
Недолгий research показал, что можно добавить параметры exclusiveContent и content для каждого из репозитория, указывая там группы репозиториев.
Ещё интересный фикс — это настройка порядка репозиториев, оказывается он тоже влияет на скорость синка. Может сгодиться как быстрый фикс.
У автора получилось уменьшить время sync с почти 6 минут до 3 минут 17 секунд, что выглядит крайне круто. 🔥
State in your Kotlin apps
#kotlin #android
Архитектуры с Unidirectional Data Flow сейчас очень популярны в большинстве современных приложений: это отличный подход, который позволяет избежать ошибок при обновлении экрана, да и разрабатывать с этим подходом удобнее, особенно большие приложения.
К сожалению, подход не избавляет от багов на 100%, да и многие разработчики используют его не совсем корректно.
Чтобы избежать некоторых из багов, вот отличная статья, где указываются на некоторые проблемы и способы их решения. Одинаково будет полезно как новичкам, так и опытным разработчикам, ведь от ошибок не застрахованы даже профи.
Кстати, автор статьи подписан на канал, так что свои вопросы по статье можете задать в комментариях. 🤓
Дизайн система Android через Figma API
#design #android #ci
С ростом проекта количество ресурсов, которое появляется в приложении очень сильно растёт, и управлять ими становится всё сложнее. Со временем многие команды приходят к тому, чтобы настроить и использовать свою дизайн-систему.
В проектах, где я работал — мы всегда приходили к какой-то дизайн системе. Иногда не совсем удачно, но чаще это очень сильно экономило время и ресурсы всех команд.
Правда, никогда не получалось сделать обновление ресурсов через CI.
Если вы хотите добавить ещё больше автоматизации в ваш проект — можно взять за основу эту статью, где ребята рассказывают свой путь, чтобы подружить Figma и обновление некоторых элементов дизайн-системы.
Тут и небольшой обзор текущих решений, и то, как всё это дело работает в xml и Compose. 🥸
RTL адаптация в Android
#android
Хорошая статья, где описывается опыт поддержки RTL-языков в Android, в том числе и на Compose.
Для тех, кто не в теме. RTL (right-to-left) — это чтение справа-налево, которое встречается в языках ближнего востока, например, арабский. LTR (left-to-right) — привычное нам чтение слева-направо.
В Android довольно неплохо поддерживаются RTL-языки, начиная с API 17, но тем не менее — есть масса кейсов, на которые стоит посмотреть при тестировании.
Был опыт адаптации приложения под RTL-языки? Вдруг вы настолько круты, что адаптировали свой pet-проект, кто знает, расскажите в комментариях. 🇦🇪
Device streaming
#androidstudio
О, тут в Android Studio Jellyfish подвезли Device streaming: фича, которая позволяет тестировать своё приложение на различных девайсах, которые находятся в дата центрах Google.
Прикольная фича, стоит обратить внимание, особенно когда выходит свежая версия Android, а на ваши устройства она ещё не прилетела. Да и специфические устройства, типа Fold тоже не каждый хочет себе покупать.
Работает аналогично обычному подключению устройства, и фича бесплатна, пока находится в alpha. Дальше всё за монету и будет учитываться время подключения к устройству.
Все детали можно почитать тут.
Ресурсы в Compose Multiplatform
#compose
Не секрет, что ни один из проектов не обходится без ресурсов, а управление ими становится только сложнее с ростом проекта. Ну и становится сложнее, когда проект написан на несколько платформ сразу.
Неплохая обзорная статья, где описываются основные изменения работы с ресурсами после свежего релиза Compose Multiplatform 1.6.0-beta01.
В целом, стало всё чуть удобнее, но буду рад, если поделитесь практическими примерами оптимизации ресурсов в подобных приложениях.
2️⃣0️⃣2️⃣4️⃣
Итак, подходит к концу ещё один год.
Уверен, что вы были молодцы и закрыли свои рабочие и личные задачи.
Кто знает, вероятно среди подписчиков есть те, кто поменял место жизни, а может быть — сменил работу, повысив свой уровень дохода.
У меня год пролетел крайне быстро: получилось закрыть не все свои цели, но главные из них успешно закрыты. И, как ни странно, они связаны с семьёй и здоровьем.
К чему я этот тост вообще вам говорю 🤓.
Насколько бы важными вам не казались бы ваши финансовые или профессиональные цели — всегда помните, что ваше здоровье, близкие люди и жизнь в согласии с собой сильно важнее.
Вот и желаю вам в новом году следовать за тем, что действительно важно! 🎄
Хак через десериализацию
#android
Давно я не появлялся на канале: со мной всё хорошо, но дела под конец года забрали всё свободное время, а серая погода — забрала всё желание писать. Но… надо не забывать вас, поэтому возвращаюсь!
На днях попалось любопытное видео, где описывается уязвимость приложения, связанная с использованием Serializable в крупном приложении AliExpress. В видео по шагам рассказывается о том, как провернуть подобный хак, как найти подобные в своих приложениях, ну и конечно же демонстрируется сама уязвимость.
Flow опрос #2
#квиз
Первый опрос был выше, и внимательные подписчики заметили, что мы не блокируем функцию main() от завершения. Для упрощения — так и оставлю и в нашем примере, ведь работу этих заданий я тестирую в Kotlin Playground, где все задания успешно выполняются.
Ну и на этот раз — ответ только один**.
Итак, что будет в консол**и?
```
import kotlinx.coroutines.
import kotlinx.coroutines.flow.
val coroutineScope = CoroutineScope(Dispatchers.Default)
val intFlow = flowOf(1, 2, 3)
val stringFlow = flowOf("a", "b", "c")
fun main() {
coroutineScope.launch {
intFlow
.onEach { delay(100) }
.collect { println(it) }
stringFlow
.collect { println(it) }
}
}
```
Reklama va hamkorlik bo'yicha: @oshigi_jannatim
Hamkor kanal: @xazilbek
Last updated 1 month, 2 weeks ago
Сотрудничество: esaul@mediar.pro
Телега со стилем и шмотом: https://t.me/esaulstyle
Это ютуб крутой бабы: https://youtube.com/c/vika02032000
Дискорд: https://discord.gg/HPzQ85rZck
Last updated 3 days, 12 hours ago