#Kotlin
Zero-cost* abstractions in Kotlin
Очень часто приходится сталкиваться в коде с тем, что в виде чисел могут представляться разные по смыслу переменные. Лучший пример - идентификаторы ресурсов в Android. Все это выражается цифрами и передать неправильное значение довольно легко.
Google дала нам решение в виде xxxRes, IntDef, IntRange и др. аннотаций над типами, но это не позволяет избавиться от ошибки во время компиляции.
Как же это решать? Оборачивать все в отдельные классы? Это доп. расход памяти и всех нас учили использовать Java примитивы в предпочтение типам оберткам.
В Kotlin предложили свое решение - inline классы, которые во время компиляции встраивают обернутый объект в место вызова. В статье вы найдет больше подробностей об это возможности языка Kotlin и когда компилятор не может развернуть тип
Zero-cost* abstractions in Kotlin
Очень часто приходится сталкиваться в коде с тем, что в виде чисел могут представляться разные по смыслу переменные. Лучший пример - идентификаторы ресурсов в Android. Все это выражается цифрами и передать неправильное значение довольно легко.
Google дала нам решение в виде xxxRes, IntDef, IntRange и др. аннотаций над типами, но это не позволяет избавиться от ошибки во время компиляции.
Как же это решать? Оборачивать все в отдельные классы? Это доп. расход памяти и всех нас учили использовать Java примитивы в предпочтение типам оберткам.
В Kotlin предложили свое решение - inline классы, которые во время компиляции встраивают обернутый объект в место вызова. В статье вы найдет больше подробностей об это возможности языка Kotlin и когда компилятор не может развернуть тип
Medium
Zero-cost* abstractions in Kotlin
Kotlin Vocabulary: inline classes
#JUnit #Test
Вышла новая версия JUnit 5.6.0
Основные изменения:
👉 Новый
👉 Новое API
👉 Улучшение отчетов для крэшей во время поиска/выполнения тестов
👉 Модуляризация Javadoc
Множество других улучшений который вы можете найти в полном описание изменений
Вышла новая версия JUnit 5.6.0
Основные изменения:
👉 Новый
@Enabled/@DisabledForJreRange условия для выполнения теста👉 Новое API
TestInstancePreDestroyCallback для расширений👉 Улучшение отчетов для крэшей во время поиска/выполнения тестов
👉 Модуляризация Javadoc
Множество других улучшений который вы можете найти в полном описание изменений
Какую версию JUnit используете вы?
JUnit 5 (Spek 2 здесь) - 33
👍👍👍 13%
JUnit 4 - 115
👍👍👍👍👍👍👍👍 47%
Не пишу тесты - 83
👍👍👍👍👍👍 34%
Не знаю - 5
👍 2%
Использую другой тестовый framework - 3
👍 1%
Секрет. Но результаты посмотрю - 7
👍 3%
👥 246 человек уже проголосовало.
JUnit 5 (Spek 2 здесь) - 33
👍👍👍 13%
JUnit 4 - 115
👍👍👍👍👍👍👍👍 47%
Не пишу тесты - 83
👍👍👍👍👍👍 34%
Не знаю - 5
👍 2%
Использую другой тестовый framework - 3
👍 1%
Секрет. Но результаты посмотрю - 7
👍 3%
👥 246 человек уже проголосовало.
#Gradle #CI #Performance
How fast are your Android CI builds? And why it matters
Android проекты растут и разрабатываются долгое время большими командами. Все разработчики локально страдают от того как собираются долго проекты, но на CI это делается еще дольше так как обычно ему надо сделать:
👉 Скомпилировать код
👉 Прогнать Unit тесты
👉 Запустить статический анализатор KtLint, Detekt, Checkstyle, Android Lint и др.
Все это еще происходит медленнее чем на локальной машине т.к. на сервере выключается Gradle демон, который не имеет смысла на CI, когда собирается много разных ветках или вовсе все в Docker контейнерах.
В статье приводится история ребят, которые вместе с DevOps сели решить проблему долгой сборки проекта (47 минут) и как у них получилось (8 минут)
От себя рекомендую периодически запускать Gradle Build Scan, чтобы проверить где у вас есть проблемные места в сборке.
How fast are your Android CI builds? And why it matters
Android проекты растут и разрабатываются долгое время большими командами. Все разработчики локально страдают от того как собираются долго проекты, но на CI это делается еще дольше так как обычно ему надо сделать:
👉 Скомпилировать код
👉 Прогнать Unit тесты
👉 Запустить статический анализатор KtLint, Detekt, Checkstyle, Android Lint и др.
Все это еще происходит медленнее чем на локальной машине т.к. на сервере выключается Gradle демон, который не имеет смысла на CI, когда собирается много разных ветках или вовсе все в Docker контейнерах.
В статье приводится история ребят, которые вместе с DevOps сели решить проблему долгой сборки проекта (47 минут) и как у них получилось (8 минут)
От себя рекомендую периодически запускать Gradle Build Scan, чтобы проверить где у вас есть проблемные места в сборке.
Medium
How fast are your Android CI builds? And why it matters.
Over time our Android CI builds gradually got slower and slower and before we knew it our CI build times were taking 47 minutes and…
#Kotlin #DSL #Builder
Builder Pattern vs Kotlin DSL
Когда у класса в конструкторе много параметров, хорошим тоном является использовать паттерн Builder. Но Kotlin может предложить более интересную альтернативу - Kotlin DSL.
В статье разбирается как заменить старый подход новым.
Builder Pattern vs Kotlin DSL
Когда у класса в конструкторе много параметров, хорошим тоном является использовать паттерн Builder. Но Kotlin может предложить более интересную альтернативу - Kotlin DSL.
В статье разбирается как заменить старый подход новым.
Medium
Builder Pattern vs kotlin DSL
Creating complex objects using Builder pattern vs Kotlin DSL. We’ll see which one is compact, more readable etc…
Починить, хакнуть, раскопать. Решаем онлайн-квест Droid Mission
В прошлом году Яндекс провел квест для мобильных разработчиков Droid Mission. После подведения итогов можно ознакомиться с решениями задач.
Тематика их абсолютно разная: SQLite, Android SDK, утечки памяти, Java, Android NDK, Dagger, Reverse Engineering и взлом приложений
В прошлом году Яндекс провел квест для мобильных разработчиков Droid Mission. После подведения итогов можно ознакомиться с решениями задач.
Тематика их абсолютно разная: SQLite, Android SDK, утечки памяти, Java, Android NDK, Dagger, Reverse Engineering и взлом приложений
Хабр
Починить, хакнуть, раскопать. Решаем онлайн-квест Droid Mission
В прошлом году мы провели онлайн-квест для мобильных разработчиков — Droid Mission. В течение месяца участники должны были решить как можно больше задач в трёх...
#Dagger
Dagger Browser - простая утилита для навигации по сгенерированному Dagger графу с помощью SPI плагина
Dagger Browser - простая утилита для навигации по сгенерированному Dagger графу с помощью SPI плагина
#Fragment
Android MultiStacks
Популярный дизайн паттерн в Android приложениях Bottom Navigation имеет один недостаток в реализации - в библиотеке AndroidX Fragment нет поддержки множества стеков для каждой вкладки ☹️. Библиотека Android MultiStacks предлагает решение этой проблемы.
Android MultiStacks
Популярный дизайн паттерн в Android приложениях Bottom Navigation имеет один недостаток в реализации - в библиотеке AndroidX Fragment нет поддержки множества стеков для каждой вкладки ☹️. Библиотека Android MultiStacks предлагает решение этой проблемы.
GitHub
GitHub - DimaKron/Android-MultiStacks: Easy multiple stack emulation for Android
Easy multiple stack emulation for Android. Contribute to DimaKron/Android-MultiStacks development by creating an account on GitHub.
#Podcast
Android Broadcast #5: "Как стать крутым разработчиком" с Денисом Неклюдовым
Каково это быть крутым и популярным разработчиком? Когда ты выступаешь на митапах и конференциях, твой голос узнают в подкастах и читают твои статьи. Однозначно интересно! Это дает как профессиональное развитие, так и карьерное продвижение. Как стать таким разработчиком выяснил с Денисом Неклюдовым. Завсегдатый Dev Fest-ов и тайный поклонник Android Academy.
Денис Неклюдов - Android разработчик в Lyft, Google Developer Expert в Android, IoT и Google Pay. Ведущий подкаста "Android Dev Podcast". Чаcтый спикер на конференция Mobius и Apps Conf.
Полезные ссылки:
👉 Android Dev Podcast RU
👉 Android Dev Podcast EN
👉 Android Dev Podcast Telegram
👉 Доклад "Google Ecosystem for Apps. Total Integrations"
👉 Доклад "Переезд: подготовка, выбор, освоение территории"
👉 Доклад "Переезд Vol2. Детальный разбор направлений"
👉 Интервью с Денисом "Об удаленке в Тайланде, переезде в Сингапур, экстраординарной визе в США!"
👉 Отзывы на "90 Seconds"
👉 Анонс курсов по трудоустройству от Дениса и Кати из Подлодки Подкаста
👉 Программа "Google Developer Experts"
👉 Денис на сайте GDE
Контакты:
👉 Кирилл Розов - krl.rozov@gmail.com, t.me/krlrozov
👉 Денис Неклюдов - t.me/nekdenis
Отдельное спасибо Александру Марцинкевичу за помощь в монтаже выпуска
Android Broadcast #5: "Как стать крутым разработчиком" с Денисом Неклюдовым
Каково это быть крутым и популярным разработчиком? Когда ты выступаешь на митапах и конференциях, твой голос узнают в подкастах и читают твои статьи. Однозначно интересно! Это дает как профессиональное развитие, так и карьерное продвижение. Как стать таким разработчиком выяснил с Денисом Неклюдовым. Завсегдатый Dev Fest-ов и тайный поклонник Android Academy.
Денис Неклюдов - Android разработчик в Lyft, Google Developer Expert в Android, IoT и Google Pay. Ведущий подкаста "Android Dev Podcast". Чаcтый спикер на конференция Mobius и Apps Conf.
Полезные ссылки:
👉 Android Dev Podcast RU
👉 Android Dev Podcast EN
👉 Android Dev Podcast Telegram
👉 Доклад "Google Ecosystem for Apps. Total Integrations"
👉 Доклад "Переезд: подготовка, выбор, освоение территории"
👉 Доклад "Переезд Vol2. Детальный разбор направлений"
👉 Интервью с Денисом "Об удаленке в Тайланде, переезде в Сингапур, экстраординарной визе в США!"
👉 Отзывы на "90 Seconds"
👉 Анонс курсов по трудоустройству от Дениса и Кати из Подлодки Подкаста
👉 Программа "Google Developer Experts"
👉 Денис на сайте GDE
Контакты:
👉 Кирилл Розов - krl.rozov@gmail.com, t.me/krlrozov
👉 Денис Неклюдов - t.me/nekdenis
Отдельное спасибо Александру Марцинкевичу за помощь в монтаже выпуска
YouTube
"Как стать крутым разработчиком" c Денисом Неклюдовым
Каково это быть крутым и популярным разработчиком? Когда ты выступаешь на митапах и конференциях, твой голос узнают в подкастах и читают твои статьи. Однозначно интересно! Это дает как профессиональное развитие, так и карьерное продвижение. Как стать таким…
#Android10 #DarkTheme
Dark Mode
Темная тема - одна из самых долгожданных функций в Android 10. Её наличие позволяет сократить расход батареи и уменьшить напряжение на глаза в темных условиях. В видео разбирают как можно адаптировать ваше приложение под темную тему.
Dark Mode
Темная тема - одна из самых долгожданных функций в Android 10. Её наличие позволяет сократить расход батареи и уменьшить напряжение на глаза в темных условиях. В видео разбирают как можно адаптировать ваше приложение под темную тему.
YouTube
Dark Mode
Dark theme is a new alternative to Android's default light theme, which is a system wide setting that applies to all apps that support it. By supporting Dark theme, you can reduce power usage by a significant amount and improve usability for users who have…
"Now in Android" теперь на YouTube
"Now in Android" с последними новостями Android разработки из Google от Chet Haase теперь стало доступно в видео формате
"Now in Android" с последними новостями Android разработки из Google от Chet Haase теперь стало доступно в видео формате
YouTube
Now in Android: 01 - Room, KTX extensions, AndroidX, conference videos, ADB podcast & more!
Welcome to Now in Android, your ongoing guide to what’s new and notable in the world of Android development. In this video, Chet Haase goes over the new Room and KTX docs, AndroidX releases, a new Room article, a new codelab, videos from recent conferences…
#AndroidKtx #Kotlin #Codelab
Building a Kotlin extensions library
Используете ли вы Android KTX библиотеки? Это расширения стандартного API и библиотек из Jetpack чтобы удобно писать под Android на языке Kotlin.
Google выпустила новую Codelab с руководством как создать свою собственную Ktx библиотеку и адаптировать ее API. Рассматриваются:
👉 Extension Functions
👉 Coroutines
👉 Flow
Также рекомендую посмотреть доклад "KotlinConf 2019: Android Jetpack ❤️ Kotlin: On the road to more wholesome APIs" от Wojtek Kaliciński
Building a Kotlin extensions library
Используете ли вы Android KTX библиотеки? Это расширения стандартного API и библиотек из Jetpack чтобы удобно писать под Android на языке Kotlin.
Google выпустила новую Codelab с руководством как создать свою собственную Ktx библиотеку и адаптировать ее API. Рассматриваются:
👉 Extension Functions
👉 Coroutines
👉 Flow
Также рекомендую посмотреть доклад "KotlinConf 2019: Android Jetpack ❤️ Kotlin: On the road to more wholesome APIs" от Wojtek Kaliciński
#Jetpack #Fragment
Jetpack Updates 22.01.2020
Новая пачка обновлений библиотек из Jetpack:
👉 Activity 1.1.0
👉 Fragment 1.2.0
👉 Lifecycle 2.2.0
👉 ViewModel-SavedState 1.0.0
👉 Navigation 2.2.0
👉 Sqlite 2.1.0
👉 Transition 1.3.0
👉 WorkManager 2.3.0
Также еще вышли новые альфы CameraX, Ads, Heif Writer и TextClassifier
Давайте подробнее пройдется по каждой из библиотек
Jetpack Updates 22.01.2020
Новая пачка обновлений библиотек из Jetpack:
👉 Activity 1.1.0
👉 Fragment 1.2.0
👉 Lifecycle 2.2.0
👉 ViewModel-SavedState 1.0.0
👉 Navigation 2.2.0
👉 Sqlite 2.1.0
👉 Transition 1.3.0
👉 WorkManager 2.3.0
Также еще вышли новые альфы CameraX, Ads, Heif Writer и TextClassifier
Давайте подробнее пройдется по каждой из библиотек
Android Developers
Recent Release Notes | Android Developers
#Jetpack #ViewModel #SavedState
ViewModel-SavedState 1.0.0
В
ViewModel-SavedState 1.0.0
В
ViewModel решена задача с сохранением данных при изменение конфигурации. Ранее состояние сохранялась пока жив процесс, но вот при его уничтожение системой способа сохранить данные "из коробки" не было. Теперь есть - SavedStateHandle#Jetpack #Activity #ViewModel
Activity 1.1.0
Важным изменением в новой версии Activity стала изменение используемой по умолчанию фабрики для создания
Теперь вы можете получить SavedStateHandle в конструкторе ViewModel, например
Activity 1.1.0
Важным изменением в новой версии Activity стала изменение используемой по умолчанию фабрики для создания
ViewModel. Раньше использовалась AndroidViewModelFactory на смену которой пришла SavedStateViewModelFactory. Теперь вы можете получить SavedStateHandle в конструкторе ViewModel, например
class MyActivity : Activity() { val vm: MyViewModel by viewModels()}class MyViewModel( savedState: SavedStateHandle) : ViewModel()#Fragment #ViewModel #Jetpack
Fragment 1.2.0
👉 FragmentContainerView - новая
👉 Изменение используемой по умолчанию фабрики для создания
👉
👉 Новые проверки Android Lint: теперь проверяется правильность использования
👉
👉
Fragment 1.2.0
👉 FragmentContainerView - новая
ViewGroup, предназначенная специально для размещения в ней Fragment. Она исправляет проблемы с анимациями при выполнение транзакций. Забудь о FrameLayout или <fragment>, теперь только FragmentContainerView.👉 Изменение используемой по умолчанию фабрики для создания
ViewModel по аналогии с Activity 1.1.0👉
Fragment.onDestroyView() теперь вызывается только после окончания анимации/transition👉 Новые проверки Android Lint: теперь проверяется правильность использования
getViewLifecycleOwner()👉
Fragment.getFragmentManager() переименовано в Fragment.getParentFragmentManager() 👉
FragmentManager теперь поддерживает операции (add/replace и др.) с Fragment по их классу, в дополнение к заранее созданному объекту. Это улучшает поддержку возможности по интеграции DI в конструктор Fragment.#ArchitectureComponent #ViewModel #Lifecycle #Coroutines
Lifecycle 2.2.0
Много новых интеграций с Kotlin Coroutines:
👉 Конвертация
👉 liveData { } - генератор значений с помощью Coroutine, которые доставляются через
👉 LifecycleCoroutineScope - специальный
👉 suspend функции, связанные с
Но помимо этого
👉 Теперь вместо
👉 Gradle Incremental Annotation Processor: Теперь вместо аннотирования методов, который должны вызываться на методы жизненного цикла, с помощью
Lifecycle 2.2.0
Много новых интеграций с Kotlin Coroutines:
👉 Конвертация
Flow <-> LiveData👉 liveData { } - генератор значений с помощью Coroutine, которые доставляются через
LiveData👉 LifecycleCoroutineScope - специальный
CoroutineScope, связанный с Lifecycle. Он позволяет запускать Coroutine, когда Lifecycle достигнет определенного состояния с помощью launchWhenCreated, launchWhenResumed и launchWhenStarted👉 suspend функции, связанные с
LifecycleOwner и Lifecycle, которые позволяют дождаться заданного состояния Lifecycle: whenCreated, whenStarted, whenResumed, whenStateAtLeast (только для Lifecycle)Но помимо этого
👉 Теперь вместо
ViewModelProviders.of() надо создавать ViewModelProvider через конструктор👉 Gradle Incremental Annotation Processor: Теперь вместо аннотирования методов, который должны вызываться на методы жизненного цикла, с помощью
@OnLifecycleEvent используйте DefautLifecycleObserver.#Jetpack #ArhitectureComponents #WorkManager
WorkManager 2.3.0
Появилась возможность задавать системе, что выполняемая операция важна, и что процесс должен оставаться живым как можно дольше во время выполнения. Работает механизм поверх Foreground Service. Используйте setForegroundAsync
Также появилась возможность отображать прогресс выполнения задачи с помощью setProgressAsync
WorkManager 2.3.0
Появилась возможность задавать системе, что выполняемая операция важна, и что процесс должен оставаться живым как можно дольше во время выполнения. Работает механизм поверх Foreground Service. Используйте setForegroundAsync
Также появилась возможность отображать прогресс выполнения задачи с помощью setProgressAsync
#Jetpack #Navigation
Navigation 2.2.0
👉 Возможность получения элемента из back stack по id элемента из графа. Используйте getBackStackEntry
👉 Параметры в Deep Link теперь могут быть в любом порядке
👉 Появилась поддержка опциональных параметров в Deep Link
👉 Улучшение работы анимаций
Navigation 2.2.0
👉 Возможность получения элемента из back stack по id элемента из графа. Используйте getBackStackEntry
👉 Параметры в Deep Link теперь могут быть в любом порядке
👉 Появилась поддержка опциональных параметров в Deep Link
👉 Улучшение работы анимаций
Стоит ли делать обзоры обновлений Jetpack в формате t.me/android_broadcast/1397 ?
Final Results
63%
Да, несколько постов тредом
26%
Да, все в одном посте
7%
Нет, выноси на отдельный ресурс и пости ссылку
3%
Не стоит делать вообще такого
2%
Другое
#Gradle #Performance #Modularization
O(1) Android build time at Tiki
Разработчики подходят с разных сторон в попытке оптимизировать Gradle сборку и сделать работу быстрее. В Tiki сделал довольно интересно решение - подключение только одного feature модуля с которым сейчас работает разработчик, что позволил сократить время разработки.
Как это реализовать и каким образом должны подключаться модули вы можете найти в статье.
O(1) Android build time at Tiki
Разработчики подходят с разных сторон в попытке оптимизировать Gradle сборку и сделать работу быстрее. В Tiki сделал довольно интересно решение - подключение только одного feature модуля с которым сейчас работает разработчик, что позволил сократить время разработки.
Как это реализовать и каким образом должны подключаться модули вы можете найти в статье.
Medium
O(1) Android build time at Tiki
This is how we reduce half of our build time.