Forwarded from Android Good Reads (Egor Tolstoy)
Контекстные ресиверы – это новая языковая фича, прототип которой был выпущен в Kotlin 1.6.20. С ее помощью можно неявно передавать в функцию дополнительные параметры. В статье разбирается пример того, как контекстные ресиверы помогают сделать запутанную бизнес-логику более понятной и корректной.
A Java geek
Toying with Kotlin's context receivers
Kotlin added the idea of Context Receivers in version 1.6.20. In this post, I’d like to toy with them to understand how useful they can be. If you want to play along, you’ll need to compile with the -Xcontext-receivers flag. The main idea behind context receivers…
Forwarded from Android Guards
Сколько было разговоров о том, что Fuchsia OS заменит Android и начнется новая эра? И где теперь эта Fuchsia OS? Оказалось, что она все еще активно разрабатывается и похоже не собирается умирать. Чтобы не прозозохать все на свете и быть готовым, когда Fuchsia OS придет в ваш дом - рекомендую прочитать этот серьезный материал. Из статьи вы узнаете:
- Что из себя представлет Fuchsia OS и как выглядит ее модель безопасности
- Как собрать ОС из исходников и написать приложение для нее
- Как выглядит ядро ОС и как его подебажить с помощью GDB и QEMU
- Как разрабатывать эксплойты для ядра Fuchsia OS (Zirocon)
Под чай с печеньками прочитать не выйдет. Придется включать мозги 👨🔬
- Что из себя представлет Fuchsia OS и как выглядит ее модель безопасности
- Как собрать ОС из исходников и написать приложение для нее
- Как выглядит ядро ОС и как его подебажить с помощью GDB и QEMU
- Как разрабатывать эксплойты для ядра Fuchsia OS (Zirocon)
Под чай с печеньками прочитать не выйдет. Придется включать мозги 👨🔬
PT SWARM
A Kernel Hacker Meets Fuchsia OS
Fuchsia is a general-purpose open-source operating system created by Google. It is based on the Zircon microkernel written in C++ and is currently under active development. The developers say that Fuchsia is designed with a focus on security, updatability…
😁1
Forwarded from Mobile Native ️️
Многомодульный BDSM: стоит ли внедрять Gradle модули и какие типы модулей бывают?
Достаточно полезная статья про многомодульность, в которой рассматриваются актуальные вопросы и проблемы: стоит ли внедрять Gradle модули, для чего это нужно, какие типы модулей бывают, связи и зависимости модулей и т.д.
Читать (Ru)
Достаточно полезная статья про многомодульность, в которой рассматриваются актуальные вопросы и проблемы: стоит ли внедрять Gradle модули, для чего это нужно, какие типы модулей бывают, связи и зависимости модулей и т.д.
Читать (Ru)
Forwarded from Android Live 🤖
Как мы уменьшили ANR в 3 раза
#android
Ошибка "Приложение не отвечает" — весьма неприятное событие для пользователя, ведь в этом случае он вынужден закрывать приложение и делать незавершённое действие с начала.
Кроме этого, эти ошибки довольно непросто повторить и поправить, ведь они могут то появляться, то исчезать, а также иметь зависимость от устройств.
Вот неплохая статья, которая описывает то, откуда вообще появляются ANR и то, как с ними бороться.
Автор говорит, что они ощутимо снизили процент этих ошибок в своём приложении, а также значительно улучшили время старта приложения.
#android
Ошибка "Приложение не отвечает" — весьма неприятное событие для пользователя, ведь в этом случае он вынужден закрывать приложение и делать незавершённое действие с начала.
Кроме этого, эти ошибки довольно непросто повторить и поправить, ведь они могут то появляться, то исчезать, а также иметь зависимость от устройств.
Вот неплохая статья, которая описывает то, откуда вообще появляются ANR и то, как с ними бороться.
Автор говорит, что они ощутимо снизили процент этих ошибок в своём приложении, а также значительно улучшили время старта приложения.
Forwarded from Android Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
#compose
Lazy Grid layouts in Compose
Примеры настройки LazyGrid в различных вариациях, будет полезно если не знали о возможностях
Lazy Grid layouts in Compose
Примеры настройки LazyGrid в различных вариациях, будет полезно если не знали о возможностях
Forwarded from Mobile Native ️️
19 Things to Know About Kotlin Flow — A Quick Note
Статья-заметка, 19 пунктов о которых нужно знать про Kotlin Flow.
Читать (En)
Статья-заметка, 19 пунктов о которых нужно знать про Kotlin Flow.
Читать (En)
Mobile Native ️️
19 Things to Know About Kotlin Flow — A Quick Note Статья-заметка, 19 пунктов о которых нужно знать про Kotlin Flow. Читать (En)
This media is not supported in your browser
VIEW IN TELEGRAM
разбираемся с тем, как Flow эмитит события наглядно
😁3
Пример анимации нескольких виджетов по отношению друг к другу с использованием
https://proglib.io/w/d3a57cdc
MotionLayout в Jetpack Compose.https://proglib.io/w/d3a57cdc
Mobile Dev Notes
Using MotionLayout in Compose — Mobile Dev Notes
A demo of using MotionLayout with Jetpack Compose with motion scene set up as a JSON5
Forwarded from Android Live 🤖
Parallax Effect в Jetpack Compose
#compose
Попалась красивая реализация эффекта параллакса, которая написана на Jetpack Compose.
Не уверен на 100%, что вам есть где использовать этот эффект в приложении, но любопытно посмотреть на саму реализацию. Тем более, на столь популярном в последнее время Compose.
Автор добавил немного модификаторов для тени и карточки. В итоге получился приятный и красивый эффект.
Чуть больше деталей реализации, ну и, конечно, примеры кода можно найти тут. 🤓
#compose
Попалась красивая реализация эффекта параллакса, которая написана на Jetpack Compose.
Не уверен на 100%, что вам есть где использовать этот эффект в приложении, но любопытно посмотреть на саму реализацию. Тем более, на столь популярном в последнее время Compose.
@Composable элементы меняют своё положение на основе ориентации устройства и приходящих данных с SensorManager. Далее, создаётся DisposableEffect, который используется для репозиционирования Image.Автор добавил немного модификаторов для тени и карточки. В итоге получился приятный и красивый эффект.
Чуть больше деталей реализации, ну и, конечно, примеры кода можно найти тут. 🤓
👍1
Forwarded from Android Good Reads (Egor Tolstoy)
Uber рассказывают, как они используют ApplicationExitInfo API, чтобы детектить Application Not Responding события. По сравнению с другими способами, таким образом получается детектить больше ANR и получать полную информацию о стектрейсах.
Speaker Deck
ANR overview at Uber + Leveraging ApplicationExitInfo API
Basic patterns how ANR occurs, how we detect ANR at Uber, and how you can manage your app's ANR
Presented at Droidcon San Francisco 2022 by <a href="…
Presented at Droidcon San Francisco 2022 by <a href="…
Forwarded from Android Good Reads (Egor Tolstoy)
И еще про Uber. Смотрите, как выглядит их ферма из сотней Pixel девайсов. Она используется для всех видов тестирования – ручного, автотестов, перфоманса.
Forwarded from Kotlin Multiplatform Broadcast
#compose
Jetpack Compose: Quick tips to avoid recomposition
Советы по тому как уменьшить количество рекомпозиций в Jetpack Compose, что позволит увеличить производительность UI. Советы:
👉 Переиспользуйте лямбды или используйте ссылки на методы
👉 Используйте обертку над List
👉 Логируйте рекомпозицию
👉 Анализируйте с помощью Compose Compile Metrics
Jetpack Compose: Quick tips to avoid recomposition
Советы по тому как уменьшить количество рекомпозиций в Jetpack Compose, что позволит увеличить производительность UI. Советы:
👉 Переиспользуйте лямбды или используйте ссылки на методы
👉 Используйте обертку над List
👉 Логируйте рекомпозицию
👉 Анализируйте с помощью Compose Compile Metrics
👍1
Forwarded from Android Live 🤖
How to write the best Usecase/Interactors ever!
#android
Попалась на глаза неплохая статья, которая рассказывает о принципах написания корректных
ℹ️ Вообще
🤔 Автор рассказывает о том, как лучше сделать базовый класс для ваших
🖖 Идея с
#android
Попалась на глаза неплохая статья, которая рассказывает о принципах написания корректных
UseCases. Если вы совсем не знакомы с тем, что это за слой архитектуры, то стоит ознакомиться с этой статьёй. ℹ️ Вообще
UseCase — весьма полезный класс, который сильно облегчает взаимодействие между Repository и ViewModel. Правда, существует много разных подходов, связанных с корректным управлением жизненным циклом этого UseCase.🤔 Автор рассказывает о том, как лучше сделать базовый класс для ваших
UseCase, а также как с наименьшим количеством повторяющегося кода запускать, показывать индикатор загрузки и отменять запущенные UseCase. 🖖 Идея с
CoroutinesUseCaseRunner удобная, так что рекомендую попробовать подобный подход в своих проектах.Forwarded from Разработка ждёт балета
Занимательный пост. За 4 месяца чуваки выпустили первую версию STEPN. Ну и вот рассказали, с какими трудностями столкнулись. Про решения там без конкретики, да :С
За ссылку скажем спасибо @istima.
#gps #blockchain #gamedev
За ссылку скажем спасибо @istima.
#gps #blockchain #gamedev
Medium
How did we build the World’s first move2earn NFT game in four months?
Introduction
Forwarded from Android Broadcast
#compose
Jetpack Compose under the hood: Touch Events (5 мин)
Из статьи вы узнаете как происходит обработка касания экрана в Composе. Полезно знать чтобы делать крутые штуки
Jetpack Compose under the hood: Touch Events (5 мин)
Из статьи вы узнаете как происходит обработка касания экрана в Composе. Полезно знать чтобы делать крутые штуки
Forwarded from Android Broadcast
#compose
Diving Into Compose — Lessons Learned While Building Maps Compose (7 мин)
Google сделали библиотеку Maps Compose - обертку над MapView для Compose. Авторы библиотеки делятся то как происходила адаптация, какие изменения пришлось вносить и пр. опыт, который получили в результате создания
Diving Into Compose — Lessons Learned While Building Maps Compose (7 мин)
Google сделали библиотеку Maps Compose - обертку над MapView для Compose. Авторы библиотеки делятся то как происходила адаптация, какие изменения пришлось вносить и пр. опыт, который получили в результате создания
Достаточно содержательный доклад с прошедшей конференции
В основе построения пользовательского интерфейса был использован подход
В процессе доклада авторы показывают, как можно реализовать собственные сущности и компоненты, а также детально раскрывают то, как происходит итоговая отрисовка иерархии сущностей на
https://www.youtube.com/watch?v=4U9B0qMxIc0
Android Makers 2022 о создании собственного UI-фреймворка Apex от Romain Guy и Chet Haase.В основе построения пользовательского интерфейса был использован подход
Entity Component System, часто применяемый в геймдеве. Каждый элемент UI-фреймворка представляется в виде простой сущности, которой можно добавить некоторое поведение или свойство с помощью отдельных компонентов.В процессе доклада авторы показывают, как можно реализовать собственные сущности и компоненты, а также детально раскрывают то, как происходит итоговая отрисовка иерархии сущностей на
Android с помощью Choreographer.https://www.youtube.com/watch?v=4U9B0qMxIc0
Forwarded from Android Good Reads (Egor Tolstoy)
Если вы используете Compose и столкнулись с задачей реализации взаимозависимого скролла вложенных друг в друга View и scrollable composables, вас очень порадует экспериментальный интероп между ними! Документация и сэмпл.
GitHub
compose-samples/Jetchat at main · android/compose-samples
Official Jetpack Compose samples. Contribute to android/compose-samples development by creating an account on GitHub.
Forwarded from Стой под стрелой (Nikita Prokopov)
Давайте я вас таймзонам научу? А то бытует мнение, что это что-то сложное, но на самом деле там все просто, если разобраться.
Самое простое, что нужно понять — Unix timestamp. Формально это количество миллисекунд, которые прошли с момента, когда 1 января 1970-го года в Гринвиче часы показывали 00:00:00. Узнать его можно, например, так:
Кайф в том, что unix time одинаково по всей земле. То есть любой человек где угодно на планете, если запустит эту вот строчку кода одновременно со мной (в ту же миллисекунду) получит то же самое число. Где бы он ни находился.
И это очень удобно. Unix time не зависит от часового пояса, летнего времени и прочей чепухи. Каждую секунду он увеличивается на 1000 по всей Земле одновременно. Любое число это какой-то момент времени, и любому моменту времени соответствует какое-то число, без пропусков.
Да, когда мы полетим на Марс, станет сложнее (из-за релятивистских эффектов), но пока это очень удобная точка, от которой можно плясать.
Дальше. Понятно, что считать время таким образом не очень удобно. Люди привыкли общаться в терминах «четыре утра» или «семь тридцать вечера». Это называется Wall clock time, то есть время, которое будут показывать часы на стене в данном месте в этот конкретный момент времени.
В чем подвох? В один и тот же момент времени в разных точках земли часы на стенах показывают разное время. У меня 14:19, в Москве 15:19, а в Нью-Йорке 8:19. Это называется «часовые пояса».
То есть чтобы получить wall clock time, надо знать Unix timestamp и место. Это преобразование тотально (то есть работает всегда) — в любой unix timestamp в любом месте часы будут показывать _что-то_.
Обратное преобразование тоже возможно, но уже не всегда определено. Связано это с летним временем — когда часы переводят вперед, возникают цифры, которые часы не показывают никогда. Скажем, если часы перевели с 2 ночи на 3 ночи, ни в какой момент времени они не покажут 2:30. То есть перевести 2:30 в Unix timestamp не получится — в этом нет смысла.
Хуже того, если часы переводят назад (с 3 часов на 2), то 2:30 возникнет на них дважды в день, то есть из 2:30 можно получить аж два разных (с интервалом в 3600000 мс) Unix timestamp-а — преобразование неоднозначно.
Именно из-за этих неопределенностей Unix timestamp первичен, а wall clock time вторичен. Если вы храните Wall clock time (даже с часовым поясом), вы теряете информацию.
Теперь про часовые пояса. В простейшем случае это просто число минут, на которое время отличается от UTC — скажем, у меня сейчас UTC+0200, то есть на два часа больше, чем UTC. UTC это типа wall clock в Лондоне без летнего времени (на самом деле, атомные часы, но про это позже). Есть вроде таймзоны, отличающиеся кратно на 30 и на 15 минут, но более идиотских нет (хотя раньше были).
Однако простого UTC+0200 недостаточно, потому что есть еще два фактора — летнее время и история. Летнее время это собственно два раза в год переход от одного UTC-смещения к другому и обратно. Скажем, у меня в Германии летом UTC+2 (CEST), а зимой UTC+1 (CET). Поэтому когда вы выбираете часовой пояс, вы выбираете Europe/Berlin, а не UTC+2 — смещение плавает.
Плавает оно и из-за исторических прецедентов. Скажем, мой родной Новосибирск несколько раз только на моей памяти менял часовой пояс между UTC+6 и UTC+7. Это никак, разумеется, нельзя предсказать или предвидеть — правительства разных стран могут менять эти вещи произвольно, иногда объявляя об этом за пару недель и только в местных газетах.
Это была часть 1/3, продолжение ниже!
Самое простое, что нужно понять — Unix timestamp. Формально это количество миллисекунд, которые прошли с момента, когда 1 января 1970-го года в Гринвиче часы показывали 00:00:00. Узнать его можно, например, так:
>>> new Date().getTime()
1655208767805
Кайф в том, что unix time одинаково по всей земле. То есть любой человек где угодно на планете, если запустит эту вот строчку кода одновременно со мной (в ту же миллисекунду) получит то же самое число. Где бы он ни находился.
И это очень удобно. Unix time не зависит от часового пояса, летнего времени и прочей чепухи. Каждую секунду он увеличивается на 1000 по всей Земле одновременно. Любое число это какой-то момент времени, и любому моменту времени соответствует какое-то число, без пропусков.
Да, когда мы полетим на Марс, станет сложнее (из-за релятивистских эффектов), но пока это очень удобная точка, от которой можно плясать.
Дальше. Понятно, что считать время таким образом не очень удобно. Люди привыкли общаться в терминах «четыре утра» или «семь тридцать вечера». Это называется Wall clock time, то есть время, которое будут показывать часы на стене в данном месте в этот конкретный момент времени.
В чем подвох? В один и тот же момент времени в разных точках земли часы на стенах показывают разное время. У меня 14:19, в Москве 15:19, а в Нью-Йорке 8:19. Это называется «часовые пояса».
То есть чтобы получить wall clock time, надо знать Unix timestamp и место. Это преобразование тотально (то есть работает всегда) — в любой unix timestamp в любом месте часы будут показывать _что-то_.
Обратное преобразование тоже возможно, но уже не всегда определено. Связано это с летним временем — когда часы переводят вперед, возникают цифры, которые часы не показывают никогда. Скажем, если часы перевели с 2 ночи на 3 ночи, ни в какой момент времени они не покажут 2:30. То есть перевести 2:30 в Unix timestamp не получится — в этом нет смысла.
Хуже того, если часы переводят назад (с 3 часов на 2), то 2:30 возникнет на них дважды в день, то есть из 2:30 можно получить аж два разных (с интервалом в 3600000 мс) Unix timestamp-а — преобразование неоднозначно.
Именно из-за этих неопределенностей Unix timestamp первичен, а wall clock time вторичен. Если вы храните Wall clock time (даже с часовым поясом), вы теряете информацию.
Теперь про часовые пояса. В простейшем случае это просто число минут, на которое время отличается от UTC — скажем, у меня сейчас UTC+0200, то есть на два часа больше, чем UTC. UTC это типа wall clock в Лондоне без летнего времени (на самом деле, атомные часы, но про это позже). Есть вроде таймзоны, отличающиеся кратно на 30 и на 15 минут, но более идиотских нет (хотя раньше были).
Однако простого UTC+0200 недостаточно, потому что есть еще два фактора — летнее время и история. Летнее время это собственно два раза в год переход от одного UTC-смещения к другому и обратно. Скажем, у меня в Германии летом UTC+2 (CEST), а зимой UTC+1 (CET). Поэтому когда вы выбираете часовой пояс, вы выбираете Europe/Berlin, а не UTC+2 — смещение плавает.
Плавает оно и из-за исторических прецедентов. Скажем, мой родной Новосибирск несколько раз только на моей памяти менял часовой пояс между UTC+6 и UTC+7. Это никак, разумеется, нельзя предсказать или предвидеть — правительства разных стран могут менять эти вещи произвольно, иногда объявляя об этом за пару недель и только в местных газетах.
Это была часть 1/3, продолжение ниже!
👍1