Уроки по Navigation Component
#navigation #jetpack #poll
Разработчики от Google начали делать раздел, посвящённый современным паттернам Android-разработки, где детально описывают, как применять современные подходы разработки для приложений.
Недавно у них завершилась неделя по Navigation Architecture Component, где нам дали краткое, но ёмкое overview по этому компоненту.
🔸в первом эпизоде описываются базовые принципы работы navigation: как добавить её в приложение, из каких частей она состоит, как работают некоторые части API, чтобы заставить навигацию работать. В текстовом виде можно почитать тут.
🔸во втором видео говорится об использовании navgiation для показа диалогов. Это пример того, как использовать navigation вне
🔸в третьем эпизоде говорится о SafeArgs: это способ безопасной передачи данных между компонентами в navgiaton. В тексте тут.
🔸в четвёртом эпизоде информация о механизме Deep Links, и о том как реализовать их при помощи navigation. В тексте тут.
🔸последний эпизод — это Q&A сессия со спикерами, где они отвечают на популярные вопросы: multiple backstacks, поддержка Jetpack Compose, Up-vs-Back, saving state и другое. Текста, к сожалению, нет, но и сделать его из такого большого видео было бы проблематично.
Также приложение, которое использовалось в качестве примера на протяжении всей серии.
А вы используете, Navigation Component в своих проектах?
#navigation #jetpack #poll
Разработчики от Google начали делать раздел, посвящённый современным паттернам Android-разработки, где детально описывают, как применять современные подходы разработки для приложений.
Недавно у них завершилась неделя по Navigation Architecture Component, где нам дали краткое, но ёмкое overview по этому компоненту.
🔸в первом эпизоде описываются базовые принципы работы navigation: как добавить её в приложение, из каких частей она состоит, как работают некоторые части API, чтобы заставить навигацию работать. В текстовом виде можно почитать тут.
🔸во втором видео говорится об использовании navgiation для показа диалогов. Это пример того, как использовать navigation вне
NavHostFragment
. В текстовом виде тут.🔸в третьем эпизоде говорится о SafeArgs: это способ безопасной передачи данных между компонентами в navgiaton. В тексте тут.
🔸в четвёртом эпизоде информация о механизме Deep Links, и о том как реализовать их при помощи navigation. В тексте тут.
🔸последний эпизод — это Q&A сессия со спикерами, где они отвечают на популярные вопросы: multiple backstacks, поддержка Jetpack Compose, Up-vs-Back, saving state и другое. Текста, к сожалению, нет, но и сделать его из такого большого видео было бы проблематично.
Также приложение, которое использовалось в качестве примера на протяжении всей серии.
А вы используете, Navigation Component в своих проектах?
Автоматическое обновление зависимостей gradle
#gradle #library
Обновление зависимостей gradle, особенно в большом проекте, может стать отдельной задачей. 🤦♂️
Разработчикам чаще всего приходится вручную проверять новые версии, что приводит к потере времени. Нет смысла не делать обновления: разработчики делают правки в библиотеках, улучшают их производительность и качество.
Есть любопытное решение, которое я не встречал раньше — Releases Hub Gradle Plugin. Плагин проверяет текущие версии библиотек (например во время сборки билда на CI) и делает PR с обновлениями. Каждый PR содержит информацию об новых фичах, добавленных в обновлении, ссылки на документацию, настройки веток и т.д.
Выглядит довольно интересно, но всё равно на разработчике и QA лежит задача проверки работоспособности приложения после каждого обновления, особенно когда дело касается важных библиотек.
Больше почитать о плагине можно тут.
#gradle #library
Обновление зависимостей gradle, особенно в большом проекте, может стать отдельной задачей. 🤦♂️
Разработчикам чаще всего приходится вручную проверять новые версии, что приводит к потере времени. Нет смысла не делать обновления: разработчики делают правки в библиотеках, улучшают их производительность и качество.
Есть любопытное решение, которое я не встречал раньше — Releases Hub Gradle Plugin. Плагин проверяет текущие версии библиотек (например во время сборки билда на CI) и делает PR с обновлениями. Каждый PR содержит информацию об новых фичах, добавленных в обновлении, ссылки на документацию, настройки веток и т.д.
Выглядит довольно интересно, но всё равно на разработчике и QA лежит задача проверки работоспособности приложения после каждого обновления, особенно когда дело касается важных библиотек.
Больше почитать о плагине можно тут.
Jetpack Compose for Desktop
#jetpack #compose
Сегодня появилась хорошая новость: команда JetBrains анонсировала выход первого релиза Jetpack Compose for Desktop — фреимворк для UI, который теперь позволяет делать UI для компьютеров!
Он базируется на известном нам Jetpack Compose, который уже в более поздней стадии разработки под Android. И самое главное то, что есть возможность переиспользования этих компонентов между собой.
Уже есть несколько примеров приложений, а чуть больше деталей об инструменте можно почитать тут.
#jetpack #compose
Сегодня появилась хорошая новость: команда JetBrains анонсировала выход первого релиза Jetpack Compose for Desktop — фреимворк для UI, который теперь позволяет делать UI для компьютеров!
Он базируется на известном нам Jetpack Compose, который уже в более поздней стадии разработки под Android. И самое главное то, что есть возможность переиспользования этих компонентов между собой.
Уже есть несколько примеров приложений, а чуть больше деталей об инструменте можно почитать тут.
Mobius 2020
#conference
Уже на следующей неделе, с 11 по 14 ноября, нас ожидает конференция для мобильных разработчиков — Mobius 2020.
Расписание полностью сформировано, и для нашего удобства доклады разделены на 4 дня.
Поделюсь парочкой интересны для меня докладов:
В докладе Увлекательная жизнь в панели уведомлений, Кирилл Розов расскажет про работу с уведомлениями, их настройкой в разных версиях Android. Выглядит интересно, и мне кажется, что notification часто недооценивают разработчики и не используют их на 100%.
Есть сразу несколько докладов, связанных с декларативными фреимворками, вот один их них: Декларативный UI сегодня — Петр Козлов и другие спикеры сравнят существующие решения для декларативного UI, в каком статусе они находятся сегодня и стоит ли использовать их в production.
В докладе Offline-mode в несколько строк кода Алексей Быков поделится тем, как правильно создавать абстракцию для работы с данными и реализовать кэширование в несколько строк кода. Посмотрим, насколько подобный подход универсален для всех приложений.
Есть несколько воркшопов, и вот один из них: Flutter Zero LiveShow от Александра Денисова, где в прямом эфире будет написано приложение с нуля на Flutter. Лично мне интересно посмотреть итоговый результат. 🤓
Всё расписание можно почитать тут, а купить билеты со скидкой по промокоду AndroidLive2020aupc на конференцию можно тут.
Но это ещё не всё. Не могу оставить вас без шанса выиграть один билет на конференцию бесплатно. 🤗
Всё что нужно сделать — это оставить свой никнейм в Telegram в этой форме, результаты розыгрыша будут объявлены 9 ноября в 18:00.
#conference
Уже на следующей неделе, с 11 по 14 ноября, нас ожидает конференция для мобильных разработчиков — Mobius 2020.
Расписание полностью сформировано, и для нашего удобства доклады разделены на 4 дня.
Поделюсь парочкой интересны для меня докладов:
В докладе Увлекательная жизнь в панели уведомлений, Кирилл Розов расскажет про работу с уведомлениями, их настройкой в разных версиях Android. Выглядит интересно, и мне кажется, что notification часто недооценивают разработчики и не используют их на 100%.
Есть сразу несколько докладов, связанных с декларативными фреимворками, вот один их них: Декларативный UI сегодня — Петр Козлов и другие спикеры сравнят существующие решения для декларативного UI, в каком статусе они находятся сегодня и стоит ли использовать их в production.
В докладе Offline-mode в несколько строк кода Алексей Быков поделится тем, как правильно создавать абстракцию для работы с данными и реализовать кэширование в несколько строк кода. Посмотрим, насколько подобный подход универсален для всех приложений.
Есть несколько воркшопов, и вот один из них: Flutter Zero LiveShow от Александра Денисова, где в прямом эфире будет написано приложение с нуля на Flutter. Лично мне интересно посмотреть итоговый результат. 🤓
Всё расписание можно почитать тут, а купить билеты со скидкой по промокоду AndroidLive2020aupc на конференцию можно тут.
Но это ещё не всё. Не могу оставить вас без шанса выиграть один билет на конференцию бесплатно. 🤗
Всё что нужно сделать — это оставить свой никнейм в Telegram в этой форме, результаты розыгрыша будут объявлены 9 ноября в 18:00.
Результаты розыгрыша билета на Mobius 2020
#конкурс #conference
Итак, самое время опубликовать результаты конкурса, который был объявлен в предыдущем посте.
В конкурсе принял участие 41 человек. При помощи генератора случайных чисел был выбран победитель — @ddgradd, с чем я его поздравляю! 🎊
Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах и конечно же выигрывайте!
#конкурс #conference
Итак, самое время опубликовать результаты конкурса, который был объявлен в предыдущем посте.
В конкурсе принял участие 41 человек. При помощи генератора случайных чисел был выбран победитель — @ddgradd, с чем я его поздравляю! 🎊
Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах и конечно же выигрывайте!
История про memory leaks, WeakReferences и ошибки при исправлении
#article
Попалась любопытная статья, где рассказывается о неверном использовании механизма ссылок
В ней описывается пример использования
Описываются все плюсы и минусы решений. Тут и EventBus, и LiveData, и RxJava с BehaviorRelay, да и многие другие, менее очевидные решения.
Множество информации можно почерпнуть тут.
#article
Попалась любопытная статья, где рассказывается о неверном использовании механизма ссылок
WeakReference
.В ней описывается пример использования
WeakReference
как костыля для работы с утечками памяти. Автор решил изучить вопрос, и рассмотрел несколько вариантов борьбы с этой проблемой.Описываются все плюсы и минусы решений. Тут и EventBus, и LiveData, и RxJava с BehaviorRelay, да и многие другие, менее очевидные решения.
Множество информации можно почерпнуть тут.
Несколько советов по Kotlin для Android разработчиков
#article #kotlin
Ни для кого не секрет, что сегодня Kotlin — это официальный язык для нативной разработки под Android. Он призван уменьшить количество написанного кода и улучшить его качество.
В целом, со своей задачей он справляется, однако не все разработчики используют все фичи этого языка при написании кода, делая всё «по старинке».
Попалась статья, которая даёт 7 советов написания кода «Kotlinic» способом. Вот несколько из них:
🔸используйте функцию `let`, чтобы проверить поле на null. Проверка на null — это очень распространённое действие, несмотря на то, что в Kotlin есть nullable-переменные. Многие забывают, что существует хорошая альтернатива
🔸используйте функции для создания списков. Очень часто мы для заполнения списков используем цикл
Например, заполнить список значениями по умолчанию можно в одну строку:
Но подобным образом можно заполнить список разными значениями:
🔸используйте `require` и `check` для работы с исключениями. Например, если мы хотим, чтобы наша переменная была больше нуля, то можно вызвать функцию:
🔸используйте `apply` и `with`, чтобы уменьшить повторы кода. Эти две функции полезны, если мы хотим сделать несколько действий с нашей переменной. Такое часто бывает при работе сo
🔸используйте методы `partition` и `groupBy` для списков. Эти функции помогают нам сделать несколько списков из одного по заданному условию.
Добавлю сюда ещё функцию
🔸используйте method references вместо lambda expressions для простых действий. Довольно интересный совет, который не так часто видишь в коде.
Например, у нас есть список объектов Person, который мы хотим преобразовать в список имён. Мы можем использовать method references в
Надеюсь, что вы нашли для себя полезный совет, который будете применять на практике. 🤓
#article #kotlin
Ни для кого не секрет, что сегодня Kotlin — это официальный язык для нативной разработки под Android. Он призван уменьшить количество написанного кода и улучшить его качество.
В целом, со своей задачей он справляется, однако не все разработчики используют все фичи этого языка при написании кода, делая всё «по старинке».
Попалась статья, которая даёт 7 советов написания кода «Kotlinic» способом. Вот несколько из них:
🔸используйте функцию `let`, чтобы проверить поле на null. Проверка на null — это очень распространённое действие, несмотря на то, что в Kotlin есть nullable-переменные. Многие забывают, что существует хорошая альтернатива
if not null
выражению — функция let, в которой код превращается в a?.let { foo(a) }
.🔸используйте функции для создания списков. Очень часто мы для заполнения списков используем цикл
for
и забываем про средста Kotlin. Например, заполнить список значениями по умолчанию можно в одну строку:
val list = IntArray(10) { 1 }.asList()
. Но подобным образом можно заполнить список разными значениями:
val list = List(5, {it*2})
, что даст нам список от 0 до 8 с шагом 2.🔸используйте `require` и `check` для работы с исключениями. Например, если мы хотим, чтобы наша переменная была больше нуля, то можно вызвать функцию:
require(n >0) { Should be more than zero }
.🔸используйте `apply` и `with`, чтобы уменьшить повторы кода. Эти две функции полезны, если мы хотим сделать несколько действий с нашей переменной. Такое часто бывает при работе сo
RecyclerView
, которому нужно задать layout manager и несколько других свойств. 🔸используйте методы `partition` и `groupBy` для списков. Эти функции помогают нам сделать несколько списков из одного по заданному условию.
Добавлю сюда ещё функцию
groupByTo
, в которой мы можем указать то, в какую структуру превратить наш список.🔸используйте method references вместо lambda expressions для простых действий. Довольно интересный совет, который не так часто видишь в коде.
Например, у нас есть список объектов Person, который мы хотим преобразовать в список имён. Мы можем использовать method references в
map
, чтобы сделать это более красивым способом:val names = persons.map(Person::name)
.Надеюсь, что вы нашли для себя полезный совет, который будете применять на практике. 🤓
Немного про let
#kotlin #article
Во вчерашнем посте был первый совет с использованием let для проверки переменной на null. @atlantik_hak подкинул годную статью, где описываются примеры, когда не стоит использовать let для этих целей, а когда let — самое лучшее решение для проверки.
Итак, когда лучше не использовать let:
⭕ для проверки на null immutable переменной. Хотя и запись
⭕ если вы хотите использовать переменную только внутри let. Чаще всего мы делаем проверку именно для того, чтобы использовать её внутри блока. Например, мы хотим что-то сделать с webView:
вместо этого можно использовать функцию
который уберёт лишние
⭕ если хотите передать переменную дальше по цепочке. Например, если вы хотите указать размер списка, если он не null, а дальше что-то продолжить делать с ним. Альтернативным решением будет использование
Когда же тогда использовать let?
🟢 для проверки на null mutable переменной. Тут хорошо подходит let, так как он избавляет нас от дополнительного
🟢 если хотите использовать переменную снаружи от let. Например, если вы хотите проициализировать другие переменные тем классом, что был у вас:
Это удобнее для review кода, чем функция
🟢 когда у вас есть проверка из цепочки `?`. Например:
генерирует больше байткода, чем:
Спасибо подписчикам, которые дают обратную связь по постам ✌️.
И уверен, что теперь вы будете использовать
#kotlin #article
Во вчерашнем посте был первый совет с использованием let для проверки переменной на null. @atlantik_hak подкинул годную статью, где описываются примеры, когда не стоит использовать let для этих целей, а когда let — самое лучшее решение для проверки.
Итак, когда лучше не использовать let:
⭕ для проверки на null immutable переменной. Хотя и запись
a?.let { foo(a) }
получается довольно изящной, она генерирует лишнюю переменную в байткоде, в отличии от аналога if not null
. Врядли вы заметите огромную разницу, но если можно избежать создания лишней переменной, то почему бы этого не сделать.⭕ если вы хотите использовать переменную только внутри let. Чаще всего мы делаем проверку именно для того, чтобы использовать её внутри блока. Например, мы хотим что-то сделать с webView:
webviewSetting?.let {
it.javaScriptEnabled = true
it.databaseEnabled = true
}
вместо этого можно использовать функцию
run
webviewSetting?.run {
javaScriptEnabled = true
databaseEnabled = true
}
который уберёт лишние
it
.⭕ если хотите передать переменную дальше по цепочке. Например, если вы хотите указать размер списка, если он не null, а дальше что-то продолжить делать с ним. Альтернативным решением будет использование
also
, хотя это тоже не идеальное решение.Когда же тогда использовать let?
🟢 для проверки на null mutable переменной. Тут хорошо подходит let, так как он избавляет нас от дополнительного
?
при взаимодействии с переменной. private var str: String? = null
fun process() {
str?.let { /*Do something*/ }
}
🟢 если хотите использовать переменную снаружи от let. Например, если вы хотите проициализировать другие переменные тем классом, что был у вас:
var javaScriptEnabled = false
var databaseEnabled = false
webviewSetting?.let {
javaScriptEnabled = it.javaScriptEnabled
databaseEnabled = it.databaseEnabled
}
Это удобнее для review кода, чем функция
run
.🟢 когда у вас есть проверка из цепочки `?`. Например:
return string?.asIterable()?.distinct()?.sorted()
генерирует больше байткода, чем:
return string?.let {
it.asIterable().distinct().sorted()
}
Спасибо подписчикам, которые дают обратную связь по постам ✌️.
И уверен, что теперь вы будете использовать
let
аккуратнее.Как сделать компилятор Kotlin умнее
#article #kotlin
Компилятор Kotlin довольно умный и даёт нам подсказки о наших же ошибках.
Одной из самых заметных фич в компиляторе Kotlin является smart casting. Это значит, что компилятор может выполнять приведение типов на основе проверок, выполненных разработчиком.
Однако механизм smart casting не безграничен. Например, компилятор может проверить переменные только в том блоке, где эти проверки были непосредственно выполнены.
Немногие разработчики знают, что можно написать контракты, которые помогут компилятору в его работе. Например, если вы создадите контракт, функция которого возвращает true, в случае если переменная не равна null, компилятор выполнит приведение типа и сделает нашу переменную non-nullable.
Contract DSL выглядит так:
Можно использовать следующие функции для того, чтобы описать контракт:
🔸returns(value) — описывает ситуацию, когда функция нормально возвращается с указанным значением.
🔸returnsNotNull() — описывает ситуацию, когда функция возвращает non-nullable значение.
🔸implies(booleanExpression) — указывает, что данный наблюдаемый эффект будет истинным при заданном booleanExpression
🔸callsInPlace(lambda, kind) — позволяет указать, как часто будет выполняться данная лямбда.
Краткое описание параметров способно запутать, но можно обратиться к статье, чтобы получить больше информации с примерами. Надеюсь, что в будущем появится ещё больше функций для описания контрактов 🤟.
#article #kotlin
Компилятор Kotlin довольно умный и даёт нам подсказки о наших же ошибках.
Одной из самых заметных фич в компиляторе Kotlin является smart casting. Это значит, что компилятор может выполнять приведение типов на основе проверок, выполненных разработчиком.
Однако механизм smart casting не безграничен. Например, компилятор может проверить переменные только в том блоке, где эти проверки были непосредственно выполнены.
Немногие разработчики знают, что можно написать контракты, которые помогут компилятору в его работе. Например, если вы создадите контракт, функция которого возвращает true, в случае если переменная не равна null, компилятор выполнит приведение типа и сделает нашу переменную non-nullable.
Contract DSL выглядит так:
fun foo(): Boolean {
contract {
// Effect
}
// Function body
}
Можно использовать следующие функции для того, чтобы описать контракт:
🔸returns(value) — описывает ситуацию, когда функция нормально возвращается с указанным значением.
🔸returnsNotNull() — описывает ситуацию, когда функция возвращает non-nullable значение.
🔸implies(booleanExpression) — указывает, что данный наблюдаемый эффект будет истинным при заданном booleanExpression
🔸callsInPlace(lambda, kind) — позволяет указать, как часто будет выполняться данная лямбда.
Краткое описание параметров способно запутать, но можно обратиться к статье, чтобы получить больше информации с примерами. Надеюсь, что в будущем появится ещё больше функций для описания контрактов 🤟.
Новый рубрики
#android_live
Хочется добавить на канал больше социальной активности и пользы для вас, мои подписчики ✌️. Поэтому, хочу анонсировать две новые рубрики на канале:
1) От подписчика. Теперь у каждого из вас есть возможность поделиться чем-то с другими. Это может быть что угодно: начиная от статьи, которая вам понравилась и может понравиться другим и заканчивая уникальным опытом работы в компании, открытия своего стартапа или проекта. А вдруг среди нас есть авторы известных библиотек, и вы хотите ответить на вопросы разработчиков, чтобы сделать своё творение ещё лучше. Всем этим можно поделиться на канале в виде простого поста или целого треда с обсуждениями.
2) Вопрос к эксперту. Также у вас есть возможность узнать ответ на наболевший вопрос у экспертов. Возможно, вы не знаете как правильно решить конфликт у себя в команде, а может у вас нет представления, куда двигаться в карьерном плане. Теперь можно получить ответы на эти и многие другие вопросы здесь – на канале. Эксперты будут подбираться мной в зависимости от специфики вопроса.
Важно, чтобы этот вопрос был интересен не только вам, а также не был таким, ответ на который легко загуглить.
Не стесняйтесь участвовать в этих активностях и пишите мне. А также напоминаю, что обсудить всё, что происходит на канале можно у нас в чате.
#android_live
Хочется добавить на канал больше социальной активности и пользы для вас, мои подписчики ✌️. Поэтому, хочу анонсировать две новые рубрики на канале:
1) От подписчика. Теперь у каждого из вас есть возможность поделиться чем-то с другими. Это может быть что угодно: начиная от статьи, которая вам понравилась и может понравиться другим и заканчивая уникальным опытом работы в компании, открытия своего стартапа или проекта. А вдруг среди нас есть авторы известных библиотек, и вы хотите ответить на вопросы разработчиков, чтобы сделать своё творение ещё лучше. Всем этим можно поделиться на канале в виде простого поста или целого треда с обсуждениями.
2) Вопрос к эксперту. Также у вас есть возможность узнать ответ на наболевший вопрос у экспертов. Возможно, вы не знаете как правильно решить конфликт у себя в команде, а может у вас нет представления, куда двигаться в карьерном плане. Теперь можно получить ответы на эти и многие другие вопросы здесь – на канале. Эксперты будут подбираться мной в зависимости от специфики вопроса.
Важно, чтобы этот вопрос был интересен не только вам, а также не был таким, ответ на который легко загуглить.
Не стесняйтесь участвовать в этих активностях и пишите мне. А также напоминаю, что обсудить всё, что происходит на канале можно у нас в чате.
Пост для Android-разработчиков, которые следят за безопасностью своих приложений 🔥🔥🔥
Авторский канал «paradiSEcurity» расскажет про информационную безопасносность мобильных приложений.
В кратких, но емких постах раскрываются важные темы:
🌶 как создавать безопасные приложения
🌶 как сделать реверс приложения
🌶 почему сложно организовать голосование на выборах через приложение
Если интересуешься лучшими практиками защиты приложений и хочешь понимать, почему даже они не всегда выдерживают хакерские атаки, то 👉 @paradisecurity
Авторский канал «paradiSEcurity» расскажет про информационную безопасносность мобильных приложений.
В кратких, но емких постах раскрываются важные темы:
🌶 как создавать безопасные приложения
🌶 как сделать реверс приложения
🌶 почему сложно организовать голосование на выборах через приложение
Если интересуешься лучшими практиками защиты приложений и хочешь понимать, почему даже они не всегда выдерживают хакерские атаки, то 👉 @paradisecurity
Firebase Android BoM
#firebase
Недавно настраивал пуш-уведомления для проекта и, как обычно, полез в документацию Firebase, чтобы посмотреть необходимые зависимости.
К моему удивлению, появился механизм, который называется Firebase Android BoM.
Суть в том, что теперь не нужно обновлять все версии Firebase библиотек по отдельности, а достаточно обновить только одну версию — версию BoM. Главной фишкой является то, что обновлённые библиотеки будут совместимы между собой.
Выглядит это так:
Посмотреть, какие конкретно версии библиотек включены в конкретный BoM можно тут, а почитать детальнее можно в документации.
#firebase
Недавно настраивал пуш-уведомления для проекта и, как обычно, полез в документацию Firebase, чтобы посмотреть необходимые зависимости.
К моему удивлению, появился механизм, который называется Firebase Android BoM.
Суть в том, что теперь не нужно обновлять все версии Firebase библиотек по отдельности, а достаточно обновить только одну версию — версию BoM. Главной фишкой является то, что обновлённые библиотеки будут совместимы между собой.
Выглядит это так:
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:26.1.0')
// Declare the dependencies for the desired Firebase products without specifying versions
// For example, declare the dependencies for Firebase Authentication and Cloud Firestore
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.firebase:firebase-firestore'
}
Посмотреть, какие конкретно версии библиотек включены в конкретный BoM можно тут, а почитать детальнее можно в документации.
Знакомство с MotionLayout
#intro #motionlayout
Думаю, что многие из вас уже знакомы с MotionLayout и теми фичами, которые он предоставляет. Если нет или вы недавно в Android-разработке, то пара статей поможет вам быстро разобраться с базовыми вещами, которые в нём есть.
Для начала есть статья, которая описывает функции Motion Editor — базового инструмента для предварительного просмотра созданных при помощи MotionLayout анимаций. В ней можно почитать про основные панели — Overview, Selection, Attribute, Preview и на примере посмотреть, как их использовать в проекте.
А если вы уже изучили теорию или она кажется вам слишком скучной, то есть CodeLab, где можно на практике закодидить анимацию и посмотреть, как она будет работать в реальном проекте. Тут можно изучить:
• ConstraintSets;
• анимации, которые работают на drag events;
• изменение анимации при помощи KeyPosition;
• изменение атрибутов при помощи KeyAttribute.
• анимацию шапки при помощи MotionLayout.
#intro #motionlayout
Думаю, что многие из вас уже знакомы с MotionLayout и теми фичами, которые он предоставляет. Если нет или вы недавно в Android-разработке, то пара статей поможет вам быстро разобраться с базовыми вещами, которые в нём есть.
Для начала есть статья, которая описывает функции Motion Editor — базового инструмента для предварительного просмотра созданных при помощи MotionLayout анимаций. В ней можно почитать про основные панели — Overview, Selection, Attribute, Preview и на примере посмотреть, как их использовать в проекте.
А если вы уже изучили теорию или она кажется вам слишком скучной, то есть CodeLab, где можно на практике закодидить анимацию и посмотреть, как она будет работать в реальном проекте. Тут можно изучить:
• ConstraintSets;
• анимации, которые работают на drag events;
• изменение анимации при помощи KeyPosition;
• изменение атрибутов при помощи KeyAttribute.
• анимацию шапки при помощи MotionLayout.
Ещё про MotionLayout
#motionlayout #subscribers
Новая рубрика, где каждый из вас может поделиться интересными статьями начинается!
Вдогонку ко вчерашнему посту, рассказывающем о знакомстве с MotionLayout, @Vel_daN делится циклом своих статей, где рассказывает о более глубоком использовании этого компонента.
Главным недостатком MotionLayout является то, что если мы хотим создать анимацию с его использованием, то необходимо зарегистрировать все состояния в MotionScene при помощи ConstraintSet. Если наша анимация объёмная, то это сбивает с толку, становится нечитаемым, ну и всё ещё не отображается в runtime.
Решение — это использовать xml-файлы, что заметно сокращает код и делает его более читаемым. Пока есть три статьи, вот первая, вторая и третья.
@Vel_daN также согласился ответить на ваши вопросы, связанные с MotionLayout и поделиться своим опытом, поэтому если у вас есть вопросы — можете задавать их в нашем чате.
#motionlayout #subscribers
Новая рубрика, где каждый из вас может поделиться интересными статьями начинается!
Вдогонку ко вчерашнему посту, рассказывающем о знакомстве с MotionLayout, @Vel_daN делится циклом своих статей, где рассказывает о более глубоком использовании этого компонента.
Главным недостатком MotionLayout является то, что если мы хотим создать анимацию с его использованием, то необходимо зарегистрировать все состояния в MotionScene при помощи ConstraintSet. Если наша анимация объёмная, то это сбивает с толку, становится нечитаемым, ну и всё ещё не отображается в runtime.
Решение — это использовать xml-файлы, что заметно сокращает код и делает его более читаемым. Пока есть три статьи, вот первая, вторая и третья.
@Vel_daN также согласился ответить на ваши вопросы, связанные с MotionLayout и поделиться своим опытом, поэтому если у вас есть вопросы — можете задавать их в нашем чате.
Кроссплатформенные приложения на Kotlin
#kotlin #crossplatform #compose
Одним из главных преимуществ Flutter перед Kotlin Multiplatform на сегодня является возможность создавать общий UI. К счастью, JetBrains работает над этой проблемой, и не так давно был анонс Jetpack Compose, который работает на Windows.
Нашёл статью, где описан пример приложения, работающего как под Windows, так и под Android. Автор использует библиотеку Decompose, созданную для улучшения работы с бизнес логикой, навигацией и UI.
Уже нет сомнений, что Jetpack Compose будущее UI для Android. Интересно, насколько Jetpack Compose приживётся в создании приложений под Windows? 🤔
#kotlin #crossplatform #compose
Одним из главных преимуществ Flutter перед Kotlin Multiplatform на сегодня является возможность создавать общий UI. К счастью, JetBrains работает над этой проблемой, и не так давно был анонс Jetpack Compose, который работает на Windows.
Нашёл статью, где описан пример приложения, работающего как под Windows, так и под Android. Автор использует библиотеку Decompose, созданную для улучшения работы с бизнес логикой, навигацией и UI.
Уже нет сомнений, что Jetpack Compose будущее UI для Android. Интересно, насколько Jetpack Compose приживётся в создании приложений под Windows? 🤔
Как узнать время старта приложения?
#performance
Тестирование времени запуска приложения — это довольно популярная задача оптимизации приложения. От времени старта зависит общее впечатление от использования продукта.
Совсем недавно Google анонсировал библиотеку App Startup, которая позволяет правильно инициализировать компоненты для приложения.
Но чтобы понять, насколько улучшилось время запуска, нужно знать результаты до и после её применения.
Самым распространённым подходом является использование функции
Но главная проблема в том, что мы не можем узнать время запуска до начала вызова нашего кода, соответственно и до вызова этой функции.
Есть хороший подход, описанный в этой статье. Автор делится командами adb, которые позволяют понять время запуска приложения с момента клика на иконку.
Итоговая команда выглядит так:
Кроме того в статье, говорится о том, как избежать ситуацию с троттлингом процессора, что очень сильно может помешать тестированию производительности приложения.
#performance
Тестирование времени запуска приложения — это довольно популярная задача оптимизации приложения. От времени старта зависит общее впечатление от использования продукта.
Совсем недавно Google анонсировал библиотеку App Startup, которая позволяет правильно инициализировать компоненты для приложения.
Но чтобы понять, насколько улучшилось время запуска, нужно знать результаты до и после её применения.
Самым распространённым подходом является использование функции
System.currentTimeMillis()
, при помощи которой можно залогировать время, и вычислить разницу межу нужными нам кусками кода. Но главная проблема в том, что мы не можем узнать время запуска до начала вызова нашего кода, соответственно и до вызова этой функции.
Есть хороший подход, описанный в этой статье. Автор делится командами adb, которые позволяют понять время запуска приложения с момента клика на иконку.
Итоговая команда выглядит так:
adb shell am start-activity -W -n com.android.samples.mytest/.MainActivity | grep "TotalTime" | cut -d ' ' -f 2
Кроме того в статье, говорится о том, как избежать ситуацию с троттлингом процессора, что очень сильно может помешать тестированию производительности приложения.
Jetpack Compose и традиционные View
#compose #jetpack #view
Многие разработчики, которые хотят переписать своё приложение на Jetpack Compose задумываются об обратной совместимости с текущими View. Ведь это непосильная задача, особенно для небольших команд.
К счастью, у нас есть возможность использовать традиционные View и Layout в Compose и наоборот.
Существует класс
Но есть также класс
Также есть
Подробнее можно почитать в этой и этой статьях.
Jetpack Compose очень крутой фреимворк, который станет будущим UI нативной Android-разработки. Если вы хотите нырнуть в Jetpack Compose больше, то есть канал @android_compose, где автор делится полезными статьями про этот инструмент.
Совсем скоро будет анонс нашего мероприятия, где каждый из нас сможет «пощупать» Compose на реальном проекте 😎
#compose #jetpack #view
Многие разработчики, которые хотят переписать своё приложение на Jetpack Compose задумываются об обратной совместимости с текущими View. Ведь это непосильная задача, особенно для небольших команд.
К счастью, у нас есть возможность использовать традиционные View и Layout в Compose и наоборот.
Существует класс
AndroidView
, который легко позволяет использовать обычные View внутри Composable-функций. Это особенно полезно при использовании сложных компонентов, например MapView
.Но есть также класс
ComposeView
, который позволяет использовать Composable-классы внутри xml-файлов. После это необходимо задать контент в виде Composable фукнции. Также есть
AbstractComposeView
, который даёт возможность сделать Composable view, где внутри можно прописать необходимую функциональность. Подробнее можно почитать в этой и этой статьях.
Jetpack Compose очень крутой фреимворк, который станет будущим UI нативной Android-разработки. Если вы хотите нырнуть в Jetpack Compose больше, то есть канал @android_compose, где автор делится полезными статьями про этот инструмент.
Совсем скоро будет анонс нашего мероприятия, где каждый из нас сможет «пощупать» Compose на реальном проекте 😎
Best practices для безопасности приложений
#security
Уверен, что мы все старательно подходим к безопасности написанных нами приложений, особенно когда они связаны с персональными данными наших пользователей.
Но не все знают о ресурсе от Google, где описаны годные практики, связанные с безопасностью. И главное, что туда регулярно добавляются свежие подходы. Давайте пройдёмся по некоторым из ним.
👉 опасайтесь неявных Intents. Напомню, что это такие
👉 изучите разрешения на уровне подписи. Это довольно крутая штука, если вам нужно передавать данные между двумя вашими приложениями. Вы можете прописать разрешение на уровне подписи, и никакое другое приложение не получит достук к передаваемым файлам.
👉 используйте Internal Storage. Для сохранения приватной информации нельзя использовать внешнее хранилище, к которому есть доступ других приложений. Кроме того, внутреннее хранилище удалится, если пользователь захочет удалить ваше приложение.
👉 помните про приватный режим SharedPreferences. Кстати, стоит уже обратить внимание на свежий Jetpack DataStore, который скоро придёт на замену префам.
👉 проверьте ContentProvider. Если у вас есть этот компонент, то проверьте, надо ли вам отдавать данные наружу. Если нет, то пропишите флаг
👉 используйте SSL-соединения. Все запросы, которые вы делаете на сервер должны выполняться через https. Кроме того, подумайте о конфигурации trust manager для сетевых запросов. Чуть больше можно почитать тут.
👉 используйте WebView с осторожностью. Важно запретить пользователю уйти куда-то вне вашего контента WebView. Помните также о Chrome Tabs, если вам нужно просто показать контент из сети, но внутри приложения.
👉 проверьте набор Permissions. Важно, чтобы ваше приложение не запрашивало тех разрешений, которые ему не понадобятся для работы. Хорошим советов тут будет использовать Intent вместо разрешений, если возможно. К примеру, есть Intent для добавления контакта в телефонную книгу, и он избавит вас от запроса
👉 обновляйте зависимости. Для себя я выделил правило обновления большинства зависимостей приложения сразу после релиза. Это даст время на тестирование и поимку багов, связанных с этими обновлениями. Но всё же от обновлений больше пользы, чем вреда, ведь разработчики активно исправляют баги, в том числе и безопасности, в своих библиотеках.
Если хотите добавить ещё каких-то правил или обсудить описанные, то обязательно пишите в чат или мне.
#security
Уверен, что мы все старательно подходим к безопасности написанных нами приложений, особенно когда они связаны с персональными данными наших пользователей.
Но не все знают о ресурсе от Google, где описаны годные практики, связанные с безопасностью. И главное, что туда регулярно добавляются свежие подходы. Давайте пройдёмся по некоторым из ним.
👉 опасайтесь неявных Intents. Напомню, что это такие
Intents
, которые позволяют показать диалог выбора приложения через который можно открыть предлагаемый файл. Типичный сценарий — это sharing файлов, когда мы выбираем нужное нам приложение из кучи вариантов. Важно осторожно относиться к ним, потому что «подписаться» на передаваемые файлы могут любые приложения. 👉 изучите разрешения на уровне подписи. Это довольно крутая штука, если вам нужно передавать данные между двумя вашими приложениями. Вы можете прописать разрешение на уровне подписи, и никакое другое приложение не получит достук к передаваемым файлам.
👉 используйте Internal Storage. Для сохранения приватной информации нельзя использовать внешнее хранилище, к которому есть доступ других приложений. Кроме того, внутреннее хранилище удалится, если пользователь захочет удалить ваше приложение.
👉 помните про приватный режим SharedPreferences. Кстати, стоит уже обратить внимание на свежий Jetpack DataStore, который скоро придёт на замену префам.
👉 проверьте ContentProvider. Если у вас есть этот компонент, то проверьте, надо ли вам отдавать данные наружу. Если нет, то пропишите флаг
android:exported="false»
, что скроет ваши данные внутри приложения.👉 используйте SSL-соединения. Все запросы, которые вы делаете на сервер должны выполняться через https. Кроме того, подумайте о конфигурации trust manager для сетевых запросов. Чуть больше можно почитать тут.
👉 используйте WebView с осторожностью. Важно запретить пользователю уйти куда-то вне вашего контента WebView. Помните также о Chrome Tabs, если вам нужно просто показать контент из сети, но внутри приложения.
👉 проверьте набор Permissions. Важно, чтобы ваше приложение не запрашивало тех разрешений, которые ему не понадобятся для работы. Хорошим советов тут будет использовать Intent вместо разрешений, если возможно. К примеру, есть Intent для добавления контакта в телефонную книгу, и он избавит вас от запроса
WRITE_CONTACTS
. Очень часто разработчики запрашивают разрешение на запись файлов, хотя им достаточно только считывать их.👉 обновляйте зависимости. Для себя я выделил правило обновления большинства зависимостей приложения сразу после релиза. Это даст время на тестирование и поимку багов, связанных с этими обновлениями. Но всё же от обновлений больше пользы, чем вреда, ведь разработчики активно исправляют баги, в том числе и безопасности, в своих библиотеках.
Если хотите добавить ещё каких-то правил или обсудить описанные, то обязательно пишите в чат или мне.
Kotlin DSL для runtime permissions
#kotlin #kotlindsl #library
Запрос разрешений в Android довольно распространённая практика, и многие разработчики используют библиотеки для упрощения этого процесса.
Одна из них — это Eazy Permission, особенность которой в использовании Kotlin DSL, возможности использовать LiveData и coroutines для получения ответа об успешном запросе.
Но мне кажется, что главное — это возможность ещё раз посмотреть на довольно мощную функциональность dsl в Kotlin и написать удобные обёртки для своих задач. 🤓
Ссылка на библитеку тут, а подробнее почитать об использовании можно тут
#kotlin #kotlindsl #library
Запрос разрешений в Android довольно распространённая практика, и многие разработчики используют библиотеки для упрощения этого процесса.
Одна из них — это Eazy Permission, особенность которой в использовании Kotlin DSL, возможности использовать LiveData и coroutines для получения ответа об успешном запросе.
Но мне кажется, что главное — это возможность ещё раз посмотреть на довольно мощную функциональность dsl в Kotlin и написать удобные обёртки для своих задач. 🤓
Ссылка на библитеку тут, а подробнее почитать об использовании можно тут
Android Study Jams. Первый митап
#intro
Большинство моих подписчиков — это практикующие Android-разработчики или люди, которые интересуются технологиями.
Если вы не пишите под Android, или знаете тех, кто давно хотел это сделать, но не знал с чего начать, то этот пост для вас.
У Google есть целый раздел с учебниками для новичков в Android-разработке. Есть несколько приложений, где вы сможете сделать их по шагам. Единственный недостаток — это отсутствие практикующего разработчика, который ответит на вопросы.
К счастью, эту проблему тоже можно решить.
Я помогаю ребям из студенческого сообщества DSC (Developer Student Clubs) в первых шагах, связанных с Android. Первый митап будет у сообщества из Саратова. Уже завтра, 4 декабря в 18:30 по МСК, мы вместе сделаем небольшое, но рабочее приложение под Android! Во время мероприятия вы сможете задавать ваши вопросы.
У каждого есть возможность поучаствовать в этом, достаточно просто перейти по ссылке и в деталях сообщения заполнить форму на участие.
Участие абсолютно бесплатное, а мероприятие будет онлайн. От вас не требуются знания программирования (хотя с ними будет проще).
Обратите внимание, что перед воркшопом нужно установить Android Studio и добавить эмулятор, инструкция есть тут.
Торопитесь, ведь число мест ограничено🤓
#intro
Большинство моих подписчиков — это практикующие Android-разработчики или люди, которые интересуются технологиями.
Если вы не пишите под Android, или знаете тех, кто давно хотел это сделать, но не знал с чего начать, то этот пост для вас.
У Google есть целый раздел с учебниками для новичков в Android-разработке. Есть несколько приложений, где вы сможете сделать их по шагам. Единственный недостаток — это отсутствие практикующего разработчика, который ответит на вопросы.
К счастью, эту проблему тоже можно решить.
Я помогаю ребям из студенческого сообщества DSC (Developer Student Clubs) в первых шагах, связанных с Android. Первый митап будет у сообщества из Саратова. Уже завтра, 4 декабря в 18:30 по МСК, мы вместе сделаем небольшое, но рабочее приложение под Android! Во время мероприятия вы сможете задавать ваши вопросы.
У каждого есть возможность поучаствовать в этом, достаточно просто перейти по ссылке и в деталях сообщения заполнить форму на участие.
Участие абсолютно бесплатное, а мероприятие будет онлайн. От вас не требуются знания программирования (хотя с ними будет проще).
Обратите внимание, что перед воркшопом нужно установить Android Studio и добавить эмулятор, инструкция есть тут.
Торопитесь, ведь число мест ограничено🤓