Forwarded from Kotlin Adept Notes (Alex Panov)
Декларативный Bottom Sheet
На мой взгляд, самый неудачный компонент в Compose из Material 2 — это Bottom Sheet. Он долгое время крашился при изменении конфигурации, его кучу раз переписывали, но все-равно на сегодняшний день он содержит много проблем:
😀 Приходится пилить костыли для работы с WindowInsets
😀 Он не прилипает к низу экрана
😀 Производительность оставляет желать лучшего
😀 Скрытие Scrim нельзя кастомизировать
А самое худшее — это его императивный API, в котором мы вынуждены управлять его показом через suspend функции show/hide, а также приходится оборачивать контент экрана в
😀 Решить проблему можно с помощью кастомной декларативной обертки
Как это работает
Показываем Bottom Sheet, если ассоциированный с ним стейт ≠ null, иначе скрываем
Особенности реализации
Нужно уметь показывать предыдущий контент, пока bottom sheet скрывается, несмотря на то, что данных уже нет
Нужно правильно вызывать лямбду
😀 Завязываться на
😀 Отслеживание изменения
Проблема😀
На текущий момент если скрыть Bottom Sheet через изменение стейта, то его скрытие можно перехватить жестом и тогда останемся в неконсистентном состоянии. Решить проблему можно либо скрытием Bottom Sheet без анимации, либо не занулять стейт, пока он не будет полностью скрыт.
😀 Гораздо лучше дела обстоят в Material 3, там из коробки Bottom Sheet уже декларативный и в нем было решено большинство проблем, только вот далеко не все используют M3 в своих проектах и, чтобы использовать его реализацию, придется копировать к себе кучу исходного кода, что тоже не круто. Таким образом если вы еще не перешли на компоузовский Bottom Sheet, то лучше пока и не торопиться😉
А как вы боретесь с проблемами с Bottom Sheet в своем проекте?
#Compose
На мой взгляд, самый неудачный компонент в Compose из Material 2 — это Bottom Sheet. Он долгое время крашился при изменении конфигурации, его кучу раз переписывали, но все-равно на сегодняшний день он содержит много проблем:
А самое худшее — это его императивный API, в котором мы вынуждены управлять его показом через suspend функции show/hide, а также приходится оборачивать контент экрана в
ModalBottomSheetLayout. Это очень не удобно, когда нужно показать не статический контент, а полноценный экран с динамическим отображением данных и своей логикой. Как это работает
Показываем Bottom Sheet, если ассоциированный с ним стейт ≠ null, иначе скрываем
Особенности реализации
Нужно уметь показывать предыдущий контент, пока bottom sheet скрывается, несмотря на то, что данных уже нет
Нужно правильно вызывать лямбду
onDismiss и здесь можно допустить ошибку:confirmValueChange не вариант, так как теперь этот callback вызывается множество разsheetState.targetValue также может привести к проблемам, так как targetValue будет Hidden даже если вы не до конца скрыли Bottom SheetПроблема
На текущий момент если скрыть Bottom Sheet через изменение стейта, то его скрытие можно перехватить жестом и тогда останемся в неконсистентном состоянии. Решить проблему можно либо скрытием Bottom Sheet без анимации, либо не занулять стейт, пока он не будет полностью скрыт.
А как вы боретесь с проблемами с Bottom Sheet в своем проекте?
#Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4😭3👍1🔥1
Forwarded from Why Android? 🌚
Tip of the day 🌚
Если надо что-то быстро посчитать не выходя из Android Studio, то по double shift можно запустить встроенный калькулятор
Если надо что-то быстро посчитать не выходя из Android Studio, то по double shift можно запустить встроенный калькулятор
🤯13🔥3👍2🤔1
Forwarded from Android Guards
Умение обходить фильтры - очень важный навык. Обычно он складывается из двух компонентов: развитого аналитического мышления и знания трюков. Сегодня будут трюки. Представим себе такой синтетический фильтр:
Один из способов - модифицировать
-
Но проверка по черному списку встречается все реже. Кажется, что разработчики начинают что-то подозревать 😰
#aht
val input = "http://evil.com"Есть мысли как его обойти? Подумайте 30 секунд.
val filter = """^(https?)://.*@?evil\..+""".toRegex()
if (filter.matches(input)) {
throw MalformedURLException("Banned URL!")
}
val okhttp = OkHttpClient()
val req = Request.Builder().url(URL(input)).build()
Один из способов - модифицировать
input любым из этих способов:-
url:http://evil.com
- http://evil.com (первый символ - пробел)Но проверка по черному списку встречается все реже. Кажется, что разработчики начинают что-то подозревать 😰
#aht
👍4🔥2😱1
Forwarded from Android Good Reads (Egor Tolstoy)
Как работают текстовые кодировки
Записали топовый выпуск Подлодки про разные неочевидные аспекты устройства текстовых кодировок и работы с ними. Больше всего, конечно, про Unicode. Если хотите узнать, почему в любом приложении, работающем с текстом, есть баги – обязательно слушайте!
По мотивам подкаста Никита Прокопов написал еще и шикарную статью, в которой подбил основные тезисы.
Записали топовый выпуск Подлодки про разные неочевидные аспекты устройства текстовых кодировок и работы с ними. Больше всего, конечно, про Unicode. Если хотите узнать, почему в любом приложении, работающем с текстом, есть баги – обязательно слушайте!
По мотивам подкаста Никита Прокопов написал еще и шикарную статью, в которой подбил основные тезисы.
podlodka.io
Podlodka #339 – Кодировки текста
There is no such thing as a plain text. Мы позвали в гости Никиту Прокопова, автора Fira Code, и разработчика сразу нескольких UI фреймворков, чтобы поговорить о том, как компьютеры работают с текстом. Тема большая, поэтому первый выпуск мы решили посвятить…
👍3🔥1
Forwarded from Mobile Developer (Алексей Гладков)
KMP Coroutines to Swift Async/Await [EN]
https://akjaw.com/async-await-coroutines-in-swift-using-kmp-nativecoroutines/
Невероятно огромная статья по тому как использовать корутины из кмп через async/await механизм в Swift. Очень полезно для SwiftUI
👉 Настройка ViewModel
👉 Что такое @NativeCoroutines
👉 Работа с Flow
👉 Обработка ошибок и отмен
👉 и многое другое...
Приятного чтения
Статья must read 🔥
https://akjaw.com/async-await-coroutines-in-swift-using-kmp-nativecoroutines/
Невероятно огромная статья по тому как использовать корутины из кмп через async/await механизм в Swift. Очень полезно для SwiftUI
👉 Настройка ViewModel
👉 Что такое @NativeCoroutines
👉 Работа с Flow
👉 Обработка ошибок и отмен
👉 и многое другое...
Приятного чтения
Статья must read 🔥
AKJAW
Async / Await Coroutines in Swift from Kotlin Multiplatform using KMP-NativeCoroutines
This is a write-up for a talk I gave at Droidcon Berlin 2023, the video version can be found here:
Calling Kotlin Multiplatform Coroutines from Swift with the help of KMP-NativeCoroutines - droidconThe official way of using Coroutines from Swift is awkward…
Calling Kotlin Multiplatform Coroutines from Swift with the help of KMP-NativeCoroutines - droidconThe official way of using Coroutines from Swift is awkward…
👍2🔥2
Forwarded from Dolgo.polo Dev | Денис Долгополов
Один аккаунт на два приложения
Авторизовался в приложении А, а потом открыл приложение Б
А там окошко "Хотите войти под тем же аккаунтом?"
Как?
Ответ: через посредника == системный сервис == AccountManager
Что произошло под капотом:
1. Приложение А получило ваш логин и пароль
2, Приложение А проверило через бекенд, что вы существуете
3, Приложение А обратилось к системному AccoutManager, создало в нем Account и положило в него ваш логин и пароль
4. Приложение Б в момент запуска тоже обратилось к AccountManager, вязало Account и увидела ваш логин и пароль
Готово, приложение Б может авторизовать вас под тем же аккаунтом, не заставляя вспоминать пароль
Схема начинает выглядеть более безопасно, если учесть два факта:
• Account можно передавать только между приложениями, имеющими одну подпись
• прихранивать логин и пароль в сыром виде не стоит. вместо этого можно передавать обезличенный токен, зашифрованный на бекенде
Почему вам это надо:
• пользователю не нужно вспоминать пароль == увеличивается шанс, что он авторизуется
• компании не надо тратить деньги на СМС с кодом авторизации
Авторизовался в приложении А, а потом открыл приложение Б
А там окошко "Хотите войти под тем же аккаунтом?"
Как?
Ответ: через посредника == системный сервис == AccountManager
Что произошло под капотом:
1. Приложение А получило ваш логин и пароль
2, Приложение А проверило через бекенд, что вы существуете
3, Приложение А обратилось к системному AccoutManager, создало в нем Account и положило в него ваш логин и пароль
4. Приложение Б в момент запуска тоже обратилось к AccountManager, вязало Account и увидела ваш логин и пароль
Готово, приложение Б может авторизовать вас под тем же аккаунтом, не заставляя вспоминать пароль
Схема начинает выглядеть более безопасно, если учесть два факта:
• прихранивать логин и пароль в сыром виде не стоит. вместо этого можно передавать обезличенный токен, зашифрованный на бекенде
• компании не надо тратить деньги на СМС с кодом авторизации
👍3🔥2🤔1
Forwarded from Android Security & Malware
Well explained blog on how to find and exploit XSS in Android apps in WebViews and Deep Links
https://securityboulevard.com/2023/10/execution-of-arbitrary-javanoscript-in-android-application/
https://securityboulevard.com/2023/10/execution-of-arbitrary-javanoscript-in-android-application/
Security Boulevard
Execution of Arbitrary JavaScript in Android Application
In this blog, we will learn about the possible ways to find cross-site noscripting by abusing JavaScript in Android applications. Cross-site noscripting (XSS) in an Android application occurs when an attacker successfully injects malicious noscripts (usually JavaScript)…
🔥2👍1
Forwarded from Android Broadcast (Кирилл Розов)
Автор статьи (15 мин) предлагает свое видение хорошей архитектуры Android приложения с набором правил что надо и Не надо делать
#architecture
#architecture
❤3🤔3👍2
Forwarded from Mobile Developer (Алексей Гладков)
Опубликованы доклады с прошедшего в этом году CrossConf'23! Подобрал для вас самые интересные на мой взгляд
📺 ОС Аврора. Статус поддержки фреймворка Flutter / Денис Глазков
📺 BDUI - Что это и зачем на примере DivKit / Ольга Ким
📺 Kotlin Multiplatform и плагины компилятора на практике / Анна Жаркова
📺 FFI или как подружить Dart с С / Артем Ефименко
📺 Зачем KMP / Андрей Ортяшов
Приятного просмотра!
📺 ОС Аврора. Статус поддержки фреймворка Flutter / Денис Глазков
📺 BDUI - Что это и зачем на примере DivKit / Ольга Ким
📺 Kotlin Multiplatform и плагины компилятора на практике / Анна Жаркова
📺 FFI или как подружить Dart с С / Артем Ефименко
📺 Зачем KMP / Андрей Ортяшов
Приятного просмотра!
YouTube
ОС Аврора. Статус поддержки фреймворка Flutter // Денис Глазков, Открытая Мобильная Платформа
О докладе:
В ходе доклада вы узнаете, почему команда операционной системы «Аврора»
решила задуматься над адаптацией популярных кроссплатформенных
фреймворков. Денис Глазков расскажет, почему портирование кроссплатформенных технологий на новую платформу —…
В ходе доклада вы узнаете, почему команда операционной системы «Аврора»
решила задуматься над адаптацией популярных кроссплатформенных
фреймворков. Денис Глазков расскажет, почему портирование кроссплатформенных технологий на новую платформу —…
❤2👍2🔥2🤮2
Forwarded from По-явански
Раздельная компиляция, min, compile, target
В целом Java-технологии привычные к раздельной компиляции. Серверные приложения компилируются с Java Class Library, которая подкладывается в compile classpath при сборке, а запускаются с другим экземпляром JCL, которая лежит на сервере.
Однако, эта раздельность почти не чувствуется. Она незримо присутствует и заключается в том, что в итоговом jar у нас не лежит весь java.lang, java.util и что мы там ещё любим. Мы запускаем приложение с той же версией JDK, с которой собирали, и всё просто работает.
Таким образом, приложение разрабатывается под одну версию платформы, без оглядки на более старые и с надеждой на совместимость с новыми.
В desktop-приложениях (кто-то их ещё пишет?) всё ещё проще: зачастую JVM приносят с собой, и раздельной компиляции как не бывало.
В Android же, как известно, зоопарк: на конечных устройствах много разных версий. И вот тут система сборки спроектирована очень удачно:
• compile SDK — последняя версия, известная разработчику приложения на момент сборки. Она подкладывается в compile classpath, за счёт чего разработчик видит все новые фичи платформы;
• min SDK — минимальная поддерживаемая версия. Старой платформе, которую разработчик не хочет поддерживать, позволяет отклонять установку приложений. Инструментарию позволяет подсказать программисту, что те или иные declarations недоступны в min и могут отсутствовать в runtime classpath, поэтому нужно обернуть их использование в if;
• target SDK — версия, на поведение которой рассчитывает приложение. Позволяет более новой версии платформы сохранить поведение старой в старом приложении.
Таким образом, в быстро меняющемся мире Android-приложение компилируется для свежей версии платформы (compile SDK), ифами поддерживает более старые версии (вплоть до min SDK), а платформа, если она новее, чем ожидаемая (target SDK), сохраняет старое совместимое поведение (тоже ифами).
Это прекрасно. Это шедевр.
Для сравнения, ситуация в мире плагинов для IntelliJ: выбираешь одну версию, которая и будет твоим compile и min. Хочешь поддержать постарше — опускаешь версию, перестаёшь видеть новые declarations. Если в новых версиях что-то deprecated — ты об этом узнаешь на этапе валидации плагина, где-то после компиляции и упаковки.
Именно поэтому при обновлении IDE плагины часто либо отключаются (разработчик указал максимальную поддерживаемую версию), либо разваливаются (мой вариант:).
Зависишь от других плагинов? Вообще страдай. Там может быть установлена любая версия. Например, если зависишь от Android-плагина для IDE, то при компиляции видишь версию, которой полгода, а в бетах Android Studio уже много раз переименовали классы, поменяли на интерфейсы, переместили в другой пакет. (И сделали это в стенах той же компании, где придумали min, compile, target.) Удачи!
В целом Java-технологии привычные к раздельной компиляции. Серверные приложения компилируются с Java Class Library, которая подкладывается в compile classpath при сборке, а запускаются с другим экземпляром JCL, которая лежит на сервере.
Однако, эта раздельность почти не чувствуется. Она незримо присутствует и заключается в том, что в итоговом jar у нас не лежит весь java.lang, java.util и что мы там ещё любим. Мы запускаем приложение с той же версией JDK, с которой собирали, и всё просто работает.
Таким образом, приложение разрабатывается под одну версию платформы, без оглядки на более старые и с надеждой на совместимость с новыми.
В desktop-приложениях (кто-то их ещё пишет?) всё ещё проще: зачастую JVM приносят с собой, и раздельной компиляции как не бывало.
В Android же, как известно, зоопарк: на конечных устройствах много разных версий. И вот тут система сборки спроектирована очень удачно:
• compile SDK — последняя версия, известная разработчику приложения на момент сборки. Она подкладывается в compile classpath, за счёт чего разработчик видит все новые фичи платформы;
• min SDK — минимальная поддерживаемая версия. Старой платформе, которую разработчик не хочет поддерживать, позволяет отклонять установку приложений. Инструментарию позволяет подсказать программисту, что те или иные declarations недоступны в min и могут отсутствовать в runtime classpath, поэтому нужно обернуть их использование в if;
• target SDK — версия, на поведение которой рассчитывает приложение. Позволяет более новой версии платформы сохранить поведение старой в старом приложении.
Таким образом, в быстро меняющемся мире Android-приложение компилируется для свежей версии платформы (compile SDK), ифами поддерживает более старые версии (вплоть до min SDK), а платформа, если она новее, чем ожидаемая (target SDK), сохраняет старое совместимое поведение (тоже ифами).
Это прекрасно. Это шедевр.
Для сравнения, ситуация в мире плагинов для IntelliJ: выбираешь одну версию, которая и будет твоим compile и min. Хочешь поддержать постарше — опускаешь версию, перестаёшь видеть новые declarations. Если в новых версиях что-то deprecated — ты об этом узнаешь на этапе валидации плагина, где-то после компиляции и упаковки.
Именно поэтому при обновлении IDE плагины часто либо отключаются (разработчик указал максимальную поддерживаемую версию), либо разваливаются (мой вариант:).
Зависишь от других плагинов? Вообще страдай. Там может быть установлена любая версия. Например, если зависишь от Android-плагина для IDE, то при компиляции видишь версию, которой полгода, а в бетах Android Studio уже много раз переименовали классы, поменяли на интерфейсы, переместили в другой пакет. (И сделали это в стенах той же компании, где придумали min, compile, target.) Удачи!
😁3👍2🔥1
Forwarded from Dev Easy Notes (Nikita)
Итак, ребята, взгляните на статью. Ничего не смущает? А вот эта? Дело в не в оформлении или стиле повествования дело в самой теме. Что первая статья, что вторая по своей сути просто пересказ книги Мартина с щепоткой заезженных истин вроде: важна золотая середина, выбирайте что лучше для вашего приложения отталкивайтесь от бизнеса требований и бла, бла, бла.
Первую статью закинули в наш Android чатик компании, с припиской поделится мнениями. Меня это не на шутку удивило, на самом деле разозлило. За последние лет 5, никто ничего концептуально нового для многомодульной архитектуры не придумал. Все эти статьи буквально пересказ предшественников и в 2023 году на серьезных щах обсуждать эти подходы это блять смешно. Вот серьезно идите посмотрите доклад Неклюдова, а потом прочитав эти статьи ответьте на вопрос, много нового они привнесли?
Вот знаете же миф о том, чтобы разработчику оставаться на одном месте ему нужно постоянно учиться. Я вот уже давно не читаю статьи по мобильной разработке и все жду того момента, когда ничего не буду понимать. За последние 5 лет самым значимым изменением было внедрение compose. Но это всего лишь один UI слой, не говоря уже о том, что большие проекты только-только начинают на него переезжать и то с большим скрипом.
Архитектуры в мобилке до жути простые и они везде одинаковые в 90% случаев. Оставшиеся 10% это какие-нибудь рибс, и то по сути те же яйца, только в профиль. Я даже не уверен, что имеет смысл говорить об архитектуре модулей когда речь идет о мобильном приложение. У бэкендеров другое дело, у них реально миллион способов связать сервисы друг с другом и там имеет место обсуждение архитектур. Потому как проеб в архитектуре у бэкендеров это реальная потеря бабок.
Больше всего забавляет архитектурная секция, где тебя просят сделать архитектору обычного мобильного приложения, у нас в компании такая есть. Хотите я за пару абзацев научу вас ее проходить?
Смотрите, первое, что нужно спросить на ней про устройство команды и планы компании. Если у нас мелкая команда и проект это проверка гипотезы, делаем одномодульное приложение и вообще не паримся. Однако на собесах почти всегда это будет приложение, где у нас ебанутся какие большие планы и нам нужно выбрать архитектуру, которая бы позволила работать над приложением большой командой. В этом случае вы, разумеется должны сказать, что тут явно нужна многомодульная архитектура. Еще можно про закон Конвея рассказать.
Затем вы собираете требования по фичам проекта и тупо отдельные фичи располагаете в разных модулях. Делаете модуль app, показываете что там есть di, затем добавим модуль навигации, ну а че бы и нет. Дальше у вас только два варианта как располагать модули. Либо всю бизнес логику делать внутри feature и если нужно шарить делаете api модуль с интерфейсами, либо делаете отдельные domain модули в которых уже будут всякие repository и interactor.
Дальше желательно сказать что проксирующие интеракторы это херня из под коня и если интервьюер адекватный, ему это понравится. Дальше вам лишь нужно выбрать уже готовую архитектору для Presentation слоя: MVVM или MVI. MVP уже никто не воспринимает всерьез. Расклад такой: с MVVM проще онбординг новых сотрудников, и она лучше по памяти когда дохера событий на экране, но она хуже когда много асинхронщины. MVI сложнее в онбординге, и создается новый State на любой чих, зато один единый State и вы забываете что такое Race Condition. Бум, все, идите к начальству и просите зарплату архитектора.
Первую статью закинули в наш Android чатик компании, с припиской поделится мнениями. Меня это не на шутку удивило, на самом деле разозлило. За последние лет 5, никто ничего концептуально нового для многомодульной архитектуры не придумал. Все эти статьи буквально пересказ предшественников и в 2023 году на серьезных щах обсуждать эти подходы это блять смешно. Вот серьезно идите посмотрите доклад Неклюдова, а потом прочитав эти статьи ответьте на вопрос, много нового они привнесли?
Вот знаете же миф о том, чтобы разработчику оставаться на одном месте ему нужно постоянно учиться. Я вот уже давно не читаю статьи по мобильной разработке и все жду того момента, когда ничего не буду понимать. За последние 5 лет самым значимым изменением было внедрение compose. Но это всего лишь один UI слой, не говоря уже о том, что большие проекты только-только начинают на него переезжать и то с большим скрипом.
Архитектуры в мобилке до жути простые и они везде одинаковые в 90% случаев. Оставшиеся 10% это какие-нибудь рибс, и то по сути те же яйца, только в профиль. Я даже не уверен, что имеет смысл говорить об архитектуре модулей когда речь идет о мобильном приложение. У бэкендеров другое дело, у них реально миллион способов связать сервисы друг с другом и там имеет место обсуждение архитектур. Потому как проеб в архитектуре у бэкендеров это реальная потеря бабок.
Больше всего забавляет архитектурная секция, где тебя просят сделать архитектору обычного мобильного приложения, у нас в компании такая есть. Хотите я за пару абзацев научу вас ее проходить?
Смотрите, первое, что нужно спросить на ней про устройство команды и планы компании. Если у нас мелкая команда и проект это проверка гипотезы, делаем одномодульное приложение и вообще не паримся. Однако на собесах почти всегда это будет приложение, где у нас ебанутся какие большие планы и нам нужно выбрать архитектуру, которая бы позволила работать над приложением большой командой. В этом случае вы, разумеется должны сказать, что тут явно нужна многомодульная архитектура. Еще можно про закон Конвея рассказать.
Затем вы собираете требования по фичам проекта и тупо отдельные фичи располагаете в разных модулях. Делаете модуль app, показываете что там есть di, затем добавим модуль навигации, ну а че бы и нет. Дальше у вас только два варианта как располагать модули. Либо всю бизнес логику делать внутри feature и если нужно шарить делаете api модуль с интерфейсами, либо делаете отдельные domain модули в которых уже будут всякие repository и interactor.
Дальше желательно сказать что проксирующие интеракторы это херня из под коня и если интервьюер адекватный, ему это понравится. Дальше вам лишь нужно выбрать уже готовую архитектору для Presentation слоя: MVVM или MVI. MVP уже никто не воспринимает всерьез. Расклад такой: с MVVM проще онбординг новых сотрудников, и она лучше по памяти когда дохера событий на экране, но она хуже когда много асинхронщины. MVI сложнее в онбординге, и создается новый State на любой чих, зато один единый State и вы забываете что такое Race Condition. Бум, все, идите к начальству и просите зарплату архитектора.
👍6🤔3🔥1
Forwarded from Android Security & Malware
BLE Spam allows now to send unwanted notifications to iOS, Android and Windows at once using Flipper Zero.
If you don't have Flipper Zero, in the blog I explained how to trigger popups using any Android smartphone even with custom messages
https://www.mobile-hacker.com/2023/10/17/spam-ios-android-and-windows-with-bluetooth-pairing-messages-using-flipper-zero-or-android-smartphone/
If you don't have Flipper Zero, in the blog I explained how to trigger popups using any Android smartphone even with custom messages
https://www.mobile-hacker.com/2023/10/17/spam-ios-android-and-windows-with-bluetooth-pairing-messages-using-flipper-zero-or-android-smartphone/
Mobile Hacker
Spam iOS, Android and Windows with Bluetooth pairing messages using Flipper Zero or Android smartphone Mobile Hacker
So far, it was possible to spam through proximity paring messages only iOS devices, either using Flipper Zero, Arduino board or any Android as explained in my previous blog here. However, recently developers of Xtreme firmware for Flipper Zero pushed and…
🔥3🥱2👍1
Forwarded from addmeto (Grigory Bakunov)
Слухи ходили давно, но вот официальное подтверждение: Xiaomi отменили разрабатываемую ей в течении 13 лет оболочку MIUI. Вместо нее будет новое решение, HyperOS. Главная заявленная цель — интегрировать в единую экосистему основные девайсы Xiaomi, т.е. выйти за пределы телефонов.
Мне немного жаль, MIUI мне казалась неплохой. Ну, посмотрим на замену, она появится на телефонах Xiaomi 14-й серии.
https://www.androidauthority.com/xiaomi-hyperos-3376622/
Мне немного жаль, MIUI мне казалась неплохой. Ну, посмотрим на замену, она появится на телефонах Xiaomi 14-й серии.
https://www.androidauthority.com/xiaomi-hyperos-3376622/
Android Authority
Xiaomi is retiring MIUI after 13 long years and replacing it with a brand new OS
Xiaomi has announced HyperOS, a new Android-based operating system that will eventually replace MIUI. It will debut on the Xiaomi 14 series.
🥱3👍1🤔1
Forwarded from Mobile Native ️️
Измеряя sequences
Достаточно объемная статья с исследованием производительности sequences и довольно интересными результатами выигрыша/проигрыша использования различных функций.
👉 Что такое Sequences
👉 Как Sequences работает под капотом
👉 Как работает преобразование обычных коллекций
👉 Как работает преобразование sequences
👉 Измерения (map, sort, filter, distinct, take, etc)
Видеоверсия → Измеряем sequence📹
Читать (Ru)
Достаточно объемная статья с исследованием производительности sequences и довольно интересными результатами выигрыша/проигрыша использования различных функций.
👉 Что такое Sequences
👉 Как Sequences работает под капотом
👉 Как работает преобразование обычных коллекций
👉 Как работает преобразование sequences
👉 Измерения (map, sort, filter, distinct, take, etc)
Видеоверсия → Измеряем sequence
Читать (Ru)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1😱1
Forwarded from Mobile Developer (Алексей Гладков)
Разбираемся с Kotlin Compiler Plugin [EN]
https://betterprogramming.pub/say-hello-to-kotlin-compiler-plugin-f4e857be9a1
Пока писал свой курс наткнулся на эту замечательную статью
👉 В чем разница между KSP и KCP
👉 Как работает компилятор котлина
👉 Что такое PSI
👉 Как работает IR
👉 и многое другое
Приятного чтения!
https://betterprogramming.pub/say-hello-to-kotlin-compiler-plugin-f4e857be9a1
Пока писал свой курс наткнулся на эту замечательную статью
👉 В чем разница между KSP и KCP
👉 Как работает компилятор котлина
👉 Что такое PSI
👉 Как работает IR
👉 и многое другое
Приятного чтения!
👍1🔥1😱1
Forwarded from Mobile AppSec World (Yury Shabalin)
Подборка историй о взломах мобильных приложений
Всем привет!
Недавно пришла в голову идея составить небольшую подборку из громких в свое время историй про взлом мобильных приложений. То есть о тех историях, которые получили публичную известность благодаря СМИ и немного пошумели.
Мне кажется, что получилось достаточно неплохо, по крайней мере мне самому было интересно ее перечитать после публикации.
Так что приятного и легкого чтения =)
#news #vulns
Всем привет!
Недавно пришла в голову идея составить небольшую подборку из громких в свое время историй про взлом мобильных приложений. То есть о тех историях, которые получили публичную известность благодаря СМИ и немного пошумели.
Мне кажется, что получилось достаточно неплохо, по крайней мере мне самому было интересно ее перечитать после публикации.
Так что приятного и легкого чтения =)
#news #vulns
securitymedia.org
ТОП компаний, чьи уязвимые мобильные приложения нанесли реальный вред бизнесу
Юрий ШабалинГенеральный директор СтингрейТехнолоджиз
Отсутствие проблем безопасностив мобильных приложениях не менее важно,чем защищенность серверной части.Этозаявление должно быть аксиомой, но в немпродолжают сомневаться - многим кажется,что мобильные приложения…
Отсутствие проблем безопасностив мобильных приложениях не менее важно,чем защищенность серверной части.Этозаявление должно быть аксиомой, но в немпродолжают сомневаться - многим кажется,что мобильные приложения…
❤3👍1
Forwarded from Mobile Compose
#Article #Medium #Fun
Building the Flappy Musk.eteer Arcade Game with Jetpack Compose
Не бизнес-приложениями едиными. Тут вам история как собрать с нуля свою версию Flappy Bird на Jetpack Compose без смс и регистрации.
Зеркало статьи 👉 тут
Building the Flappy Musk.eteer Arcade Game with Jetpack Compose
Не бизнес-приложениями едиными. Тут вам история как собрать с нуля свою версию Flappy Bird на Jetpack Compose без смс и регистрации.
Зеркало статьи 👉 тут
Medium
Building the Flappy Musk.eteer Arcade Game with Jetpack Compose
A Step-by-Step Guide to Creating an Immersive Mobile Game
👍3😱1
Forwarded from Kotlin Multiplatform Broadcast (Кирилл Розов)
Опубликовали доклад по KMP 🏝 с Mobius Весна 2023
📺 Android-Driven KMM (46 мин)
📺 KMM + 🎨 Composable Architecture в Умной Камере (26 мин)
📺 Как мы Kotlin Multiplatform внедряли (46 мин)
📺 Android-Driven KMM (46 мин)
📺 KMM + 🎨 Composable Architecture в Умной Камере (26 мин)
📺 Как мы Kotlin Multiplatform внедряли (46 мин)
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Константин Семочкин — Android-Driven KMM
Подробнее о конференции Mobius: https://jrg.su/ojGU3B
— —
Константин расскажет о том, как они в Дзене внедряют КММ с минимальным участием со стороны iOS и почему так сложилось. Он опишет особенности работы с кодом КММ как библиотеки. Спикер постарается упростить…
— —
Константин расскажет о том, как они в Дзене внедряют КММ с минимальным участием со стороны iOS и почему так сложилось. Он опишет особенности работы с кодом КММ как библиотеки. Спикер постарается упростить…
👍2🔥2
Forwarded from Android Guards
Android предоставляет весьма широки возможности по логированию различных событий. Одним из наиболее полезных, на мой взгляд, является логирование SQL запросов, которые делают приложения. Не важно, напрямую или через ORM. В логах будут те запросы, которые непосредственно выполняет БД. Включить эту возможность можно командой:
#aht
adb shell setprop log.tag.SQLiteStatements VERBOSE. После чего в logcat должны появиться логи запросов. А если поискать в исходниках Android ссылки на метод isLoggable, то можно найти другие подобные теги и включить логирование для них аналогичным способом.#aht
👍4🔥1
Forwarded from Compose Broadcast (Кирилл Розов)
QRose - Compose Multiplatform библиотека для создания QR кодов. Поддерживает Android, iOS, macOS, Web
👍6🤝4🎄3