ru
Feedback
Kotlin Adept Notes

Kotlin Adept Notes

Открыть в Telegram

Канал о разработке на Kotlin и обо всем, что с ним связано По всем вопросам и рекламе: @ajiekcx

Больше
2 347
Подписчики
-124 часа
-67 дней
-1430 день
Архив постов
Тестировщики, общий сбор! Что успеете сделать за 100 минут работы? Делимся идеей: можно запустить параллельные тесты приложен
Тестировщики, общий сбор! Что успеете сделать за 100 минут работы? Делимся идеей: можно запустить параллельные тесты приложения на разных устройствах, проверить производительность, нажатия и UI. И все это — бесплатно в Мобильной ферме от Selectel, потому что при регистрации вы получаете 100 бонусных минут в сервисе. Что дает Мобильная ферма Selectel: ● Парк из 50+ моделей от популярных до редких смартфонов на Android и iOS. ● Удобство — настройки сохраняются, пока устройство закреплено за вами вне зависимости от количества тестов и длины сессии. ● Безопасность — информация о ваших сессиях автоматически удаляется после завершения аренды. Регистрируйтесь и получите промокод на 100 минут при первом заказе: https://slc.tl/z6ujt Реклама. АО "Селектел". erid:2W5zFHq1xQH

Насколько AI ускоряет TTM в большой компании 🧠 Мы запустили первое приложение, которое целиком написано с помощью AI: от про
Насколько AI ускоряет TTM в большой компании 🧠 Мы запустили первое приложение, которое целиком написано с помощью AI: от прототипов и бэкенда до мобильных приложений. И хочется обсудить, насколько это реально ускорило общий TTM. Можно услышать сотни историй о том, как вайбкодеры одновременно работают над десятком проектов и пишут по 30 тысяч строк кода в день. Это всё работает, пока ты делаешь это один. Но в большой компании, где куча команд, ещё больше микросервисов, своя инфраструктура, дизайн-система, правила безопасности и многое другое, тогда без полноценной перестройки процессов на уровне всей компании такой подход просто не получится внедрить. Поэтому сейчас речь идёт именно о применении AI-агентов для написания кода, без глобального изменения процессов и с тем же уровнем качества кода, что и раньше. Итак, я замерил показатели предыдущих MVP наших проектов и получил интересные цифры. 🟡Разработка действительно ускорилась, но не драматически — примерно на 50%. Всё потому, что раньше мы тратили большую часть времени на написание кода, попутно уточняя требования и валидируя результат. Теперь это время, по сути, переместилось в фазу планирования и валидации. 🟢А вот ускорение time to market получилось действительно разительным: от идеи до релиза приложения стало проходить в три раза меньше времени, чем обычно. Но, по сути, AI здесь ни при чём. Это произошло потому, что значительно сократилось количество людей в цепочке. Разумеется, это всего лишь один пример, который проще всего было измерить. На большом масштабе цифры могут сильно отличаться. 📊 А какие цифры получаются у вас?

Как устроены продукты, которые задают тренды? Т-Банк готовит летний фест для тех, кому важно не просто слушать, а разбираться
Как устроены продукты, которые задают тренды? Т-Банк готовит летний фест для тех, кому важно не просто слушать, а разбираться, как реально устроены продукты 20 июня «Сезон кода» собирает разработчиков, аналитиков и продактов в Санкт-Петербурге, чтобы показать, как создаются продукты — от первых гипотез до продакшена. Вас ждут: — прикладные доклады команд Т-Банка и других компаний про архитектуру, бэкенд и интеграции; — демо-зоны с ключевыми платформенными и коммуникационными сервисами и графовой аналитикой; — продуктовый стрим «Продуктовая кухня»: разберем, как данные превращаются в решения, а гипотезы — в рост продукта и ценность для пользователя; — формат, где знакомства происходят прямо по ходу программы. А еще — баскетбольная площадка, пинг-понг и большое афтепати с диджеем. Фест пройдет в ИТ-хабе Группы компаний «Т-Технологии». Количество мест ограничено — успейте зарегистрироваться

Как сделать аналог availability check из iOS в KMP В Swift есть специальный механизм проверки доступности API на разных версиях ОС: ``swift if #available(iOS 17.4, *) { newAPI() } else { legacyAPI() }


Это позволяет выполнять код только на определённых версиях ОС, где нужный API гарантированно существует.

Но, к сожалению, такого механизма нет в Kotlin Native при работе над KMP-проектами. И если мы хотим реализовать данную возможность только в Kotlin-коде, то придётся искать обходное решение.

В первую очередь понадобится метод для определения версии iOS:

```kotlin
internal fun isIosVersionAtLeast(major: Int, minor: Int = 0, patch: Int = 0): Boolean {
    val target = cValue<NSOperatingSystemVersion> {
        majorVersion = major.toLong()
        minorVersion = minor.toLong()
        patchVersion = patch.toLong()
    }
    return NSProcessInfo.processInfo.isOperatingSystemAtLeastVersion(target)
}
Однако само по себе это не поможет. Приложение всё равно будет крашиться при запуске на старых версиях ОС, если во фреймворке есть символы несуществующего класса. Поэтому придётся добавить в настройки сборки shared-фреймворка специальный флаг линковки, который будет подключать указанный системный фреймворк только в том случае, если он доступен:

it.binaries.framework {
    linkerOpts.addAll(listOf("-weak_framework", "AuthenticationServices"))
}
Однако если обратиться к несуществующему классу, то приложение всё равно упадет в рантайме. Поэтому для дополнительной безопасности можно также проверять наличие класса через NSClassFromString("ClassName").

kmp-telegram-login Решил реализовать пример работы с OAuth 2.0 в KMP, как и обещал, но делать просто пример в вакууме не хотелось, и я вспомнил про недавно вышедший android-telegram-login. Подумал, что было бы полезно адаптировать его под KMP. Но что бы вы думали? Разумеется, кто-то уже навайбкодил это до меня здесь, причём всего пару дней назад 💅 В целом код из репозитория и наша реализация довольно схожи, за исключением некоторых важных моментов. Там также используется безопасный Code Flow + PKCE, но если Telegram не установлен на устройстве, то вместо нового AuthTabIntent используется CustomTabsIntent и есть подозрение, что с https-схемой могут быть проблемы на некоторых браузерах. ⚠️ Однако в либе есть очень критичная проблема. Похоже, разработчики ещё не запускали код на устройствах с iOS ниже 17.4 или не удосужились написать, как это исправить. Если собрать KMP-фреймворк с этой библиотекой, приложение просто крашнется при запуске, поскольку ASWebAuthenticationSessionCallback доступен только начиная с этой версии ОС. Именно поэтому мы у себя в итоге отказались от использования Universal Links и оставили только кастомную схему. На самом деле это можно исправить, и о том, как это сделать, я расскажу в следующем посте, так что stay tuned!

Недушное изучение и практика разговорного английского в онлайн-школе Authentic Pigeon, чтобы привести язык в порядок и дотянуться до офферов за рубежом. Узнать подробнее и записать на бесплатное демо-занятие можно в телеграм-боте.
Абсолютно кайфую от подхода … Занятия тут это не потогонка, а крутой дружеский разговор.
Студент школы — Иван Реклама. ИП Моисеева А.А. ИНН 270393875959

Решили тут перейти в дизайн-системе на state-based TextField, чтобы порешать разные проблемы предыдущей версии. И, как говори
Решили тут перейти в дизайн-системе на state-based TextField, чтобы порешать разные проблемы предыдущей версии. И, как говорится, что же могло пойти не так 😐 Какие плюсы получили: 🟢Упростилась работа с курсором — страшные хаки больше не нужны 🟢Перестали лагать быстрые изменения текста на старых устройствах 🟢VisualTransformation теперь разделился на InputTransformation и OutputTransformation, что позволяет гибче работать с изменением текста Какие минусы: 🔘Пришлось костылить обёртку с двумя LaunchedEffect, чтобы сохранить перегрузку с предыдущим API 🔘Ну и самое бесячее: в новом TextField почему-то решили поменять отступ от клавиатуры. Теперь экран подскролливается к каретке ввода, и выглядит это как на изображении выше. А фиксится всё ужасно костыльным образом. 💬 Так что вопрос к знатокам: кто-нибудь уже сталкивался с подобной проблемой? И если да, то как её решили?

Особенности работы с OAuth 2.0 в KMP Во многих мобильных приложениях аутентификация и авторизация пользователей происходят через протокол OAuth 2.0, который является индустриальным стандартом. В нём предусмотрены различные флоу авторизации, и наиболее подходящим для мобильных приложений считается Authorization Code + PKCE. Этот флоу предотвращает перехват данных благодаря генерации временных параметров: codeChallenge и codeVerifier. Я не сторонник использования сторонних неофициальных библиотек в целом, и тем более для такой критичной вещи, как аутентификация. А в мире KMP найти что-то подходящее ещё сложнее, поэтому часто приходится делать всё самому. 🤖 Android Для Android в пакете androidx.browser появился очень удобный механизм AuthTabIntent, который берёт на себя почти всю работу, хотя и не без нюансов. Если выбранный в системе браузер по умолчанию не поддерживает AuthTab, ничего работать не будет. А кроме Chrome и Firefox, насколько я знаю, его почти никто не поддерживает. Поэтому придётся либо явно указывать пакет браузера, либо делать fallback, если подходящего браузера нет. 🍏iOS На iOS есть аналогичный удобный механизм ASWebAuthenticationSession. Но, как это часто бывает у Apple, не все фичи работают на старых версиях iOS. Например, редирект через https-схему (Universal Links) поддерживается только начиная с iOS 17.4, а на более ранних версиях придётся использовать кастомную схему. И в KMP это довольно сложно разграничить — приходится прибегать к чёрной магии чтобы исключать символы при загрузке фреймворка 🤨 ⭐️Если тема для вас актуальна и нужен KMP-сэмпл, ставьте реакции и я постараюсь собрать полноценный пример. #KMP #OAuth

Твой код — в сердце мощного ИИ! 💚 Команда GigaChat зовёт на One Day Offer амбициозных Java-разработчиков, которые готовы соз
Твой код — в сердце мощного ИИ! 💚 Команда GigaChat зовёт на One Day Offer амбициозных Java-разработчиков, которые готовы создавать AI‑продукты уровня BigTech и стать частью крупнейшего AI-комьюнити. Если ты дружишь с Java (версии 8–25), ладишь со Spring и Hibernate, а PostgreSQL и ClickHouse для тебя — не просто слова, переходи по ссылке и занимай слот на One Day Offer. Встречаемся 23 мая — очень ждём именно тебя!

Переход на AGP 9 в KMP-проектах Мы долго откладывали миграцию на AGP 9, ждали, пока всякие авторы по типу Huawei адаптирует свои плагины, и наконец решились ⚪️ Казалось бы, спустя столько времени это должна была быть легкая прогулка, но не тут-то было. С какими проблемами столкнулись 🟢Теперь нельзя использовать плагин android.application в KMP-модулях. 🟢Все модули нужно было мигрировать на новый Android Gradle Plugin. 🟢Больше нельзя генерировать BuildType в KMP-модулях. 🟢Значительно изменились многие API, которые мы использовали в своих Gradle-плагинах. Помимо этого, обновление Kotlin и Compose нам тоже вставило палки в колеса, но сегодня не об этом. Так что поделюсь рекомендациями для тех, кто еще не перевел свои проекты. Скиллы для агентов 🟢Официальный skill от Google для миграции KMP-проектов абсолютно не подходит: он лишь понаделал кучу deprecated свойств в gradle.properties. 🟢А вот аналогичный skill от JetBrains хорош! К сожалению, мы узнали о нем поздно, поэтому пришлось делать свой, но с pet-проектом он справился отлично. Что еще почитать 🟢Переход на Android Gradle Plugin для KMP 🟢Миграция на built-in Kotlin 🟢Гайд по миграции на AGP 9 💬 А как прошла ваша миграция на APG 9?

Особенности работы с Passkeys в Android и iOS Мы наконец-то реализовали мультиплатформенный модуль для работы с Passkeys и хочу поделиться нюансами, с которыми столкнулись.
Passkeys — более безопасная и простая альтернатива паролям, где аутентификация в сервисе происходит по биометрии.
В случае с Android поддержка Passkeys появилась с Android 9, в то время как на iOS только с iOS 16. При этом технология значительно совершенствовалась в последних версиях ОС, например, предоставляя выбор кастомного менеджера паролей. 🤖 В Android работа с Passkeys происходит через CredentialManager и реализована довольно удобно: почти всё происходит под капотом, достаточно лишь передать JSON с бэкенда. Но есть две проблемы: обработка ошибок и необходимость в Activity context, что создаёт определённые архитектурные сложности. В случае обработки ошибок приходится вручную извлекать из текста через регулярки коды ошибок, чтобы отображать понятные пользователю сообщения. 🇨🇳 А вот пользователи Huawei, к сожалению, не смогут воспользоваться этой фичей, так как CredentialManager просто отказывается работать с другими менеджерами паролей. Хотя для Huawei существует своя реализация FIDO2, API там реализован далеко не лучшим образом, и всё это делается через отдельную Activity, которая будет открываться даже если ключей нет 😐 🍏В iOS же работа с Passkeys происходит через ASAuthorizationController, где приходится вручную мапить каждое поле, конвертировать NSData в Base64URL и обратно. В общем, работать со всем этим добром не очень удобно. Также имеются отличия от Android: например, нельзя передать excludeCredentials для исключения дубликатов ключей, и не поддерживается direct attestation, который позволяет определить, что устройство подписано корневым сертификатом производителя. 💬 А вы интегрировали Passkeys в свой проект или планируете это сделать? #Passkeys #KMP #Android #iOS

Mobius 2026 Spring: конференция для мобильных разработчиков Почему мобильные приложения тормозят на проде? Как строить архите
+4
Mobius 2026 Spring: конференция для мобильных разработчиков Почему мобильные приложения тормозят на проде? Как строить архитектуру, которая масштабируется с ростом пользователей? Где AI уже помогает решать инженерные задачи? Эти и многие другие вопросы разберем на Mobius этой весной. 📅 12–13 мая, Москва + онлайн Два дня докладов, воркшопов и живого общения мобильного сообщества. В программе — интеграции с бэкендом, управление состоянием, CI/CD, инструменты, оптимизация перфоманса и поддержка крупных проектов. Листайте карточки — собрали топовые доклады из программы. Используйте промокод, чтобы купить персональный билет со скидкой — KOTLINADEPT Купить билет Реклама. ООО «Джуг Ру Груп». ИНН 7801341446

Генерация макетов через Figma MCP 🖌 Пока все говорят про "убийцу Figma", хочу рассказать о том, как мне удалось примерить шапочку дизайнера и собрать макеты приложения в Figma с использованием корпоративной дизайн-системы с помощью Figma MCP. Не так давно Figma сделала скил под названием figma-use, который даёт доступ к рисованию на канвасе, переменным, стилям и компонентам. И это стало отличным шансом собрать макеты приложения без навыков работы в Figma. Я не стал сразу пытаться собирать макеты в Figma, а начал с генерации макетов в виде сайта, скормив бизнес-сценарии приложения и несколько изображений-референсов по стилю AI-агенту. В целом Claude с одного промта справился очень даже неплохо, дальше пришлось просто допилить некоторые моменты. И уже после этого я решил зафиксировать макеты в Figma на основе сгенерированного сайта. Но первое, во что я упёрся — это лимиты Figma: они закончились буквально за пару вызовов MCP, так что на бесплатном тарифе можете даже не пытаться что-то сделать 🙃 Далее я попробовал выборочно перенести экран как есть, без использования дизайн-системы, и это сработало хорошо, всё перенеслось так, как я и ожидал. Но проблемы начались, когда нужно было использовать компоненты существующей дизайн-системы. В нашем случае ключевой проблемой оказались кастомные шрифты, которых нет в Figma, из-за чего MCP не может редактировать текст в компонентах 😠 В итоге, чтобы добиться хоть какого-то вменяемого результата, мне пришлось создать ещё два скила: один для корректной работы с палитрой, чтобы правильно выбирать цвета, и отдельно для работы с дизайн-системой, где описаны id всех компонентов и их свойства, а также решения для всех проблем, возникших по пути. Через боль и страдания я перенёс все макеты. И что могу сказать по текущему статусу работы Figma MCP: пока что это очень сырая штука. Механизм self-валидации через скриншоты работает ужасно — такое ощущение, что работаешь со слепым дизайнером. Да и в целом всё это работает очень долго, даже банальные задачи могут занимать несколько минут, которые профессиональный дизайнер сделает в разы быстрее. 💬 А что вы думаете: сможет ли Figma адаптироваться к новому миру? Или макеты уже прошлый век, и всё сразу будет верстаться в коде? #Figma #MCP #AI

Как защитить API от нежданных клиентов На днях я делал приложение для bug bounty активности на конференции, в котором нужно будет найти секретную ссылку. Мне не хотелось, чтобы всё решилось простым запросом в AI или пересборкой приложения с отключением SSL-пиннинга, поэтому я задумался о том, как защититься от пересборки приложения, чтобы только версия с моей подписью могла делать запросы к серверу. Я решил попробовать Play Integrity. Всё бы ничего, но приложение должно быть обязательно опубликовано в Google Play, хотя бы во внутреннем тестировании, иначе аттестация устройства не будет проходить. Поэтому этот вариант мне не подошёл, и я решил реализовать собственный сервер аттестации, который проверяет цепочку сертификатов, извлекает из сертификата отпечаток подписи приложения и сравнивает его с заданным. Звучит круто, но почему тогда это не используется массово? Дело в том, что, во-первых, это работает не на всех версиях Android. Кроме того, устройство должно поддерживать Hardware Attestation, что может отсечь часть устройств и на них приложение просто не будет работать. Если вас заинтересовала тема, вы ещё успеваете залететь на Podlodka Android Crew и послушать доклад про Play Integrity, где разберут как работают эти механизмы. А ещё вы сможете попробовать сами обойти эту защиту в нашей bug bounty активности 💻 Так что присоединяйтесь, будет не только полезно, но и интересно 😉

Розыгрыш билета на Podlodka Android Crew #15 Мы снова подготовили для вас новый сезон конференции Podlodka Android Crew, кото
Розыгрыш билета на Podlodka Android Crew #15 Мы снова подготовили для вас новый сезон конференции Podlodka Android Crew, который пройдет с 30 марта по 3 апреля. В этот раз неделя будет посвящена безопасности в Android-разработке, и, на мой взгляд, нам удалось собрать интересную программу. Мой личный топ докладов, которые хотелось бы послушать: 🔘Про защиту видеоконтента 🔘Про passkeys, так как прямо сейчас мы имплементируем это у себя 🔘Про то, как работает защита Play Integrity 🔘Про reverse engineering на практике от моего коллеги И в связи с этим хочу провести розыгрыш билета. Условия розыгрыша 💬 Вам нужно написать комментарий под этим постом на тему безопасности мобильных приложений. Можно рассказать про самый интересный баг в безопасности, с которым вы сталкивались, или, наоборот, поделиться опытом, как вы реализовали какое-то безопасное решение. Итоги розыгрыша 🗓 Победителя выберу случайным образом уже в эту субботу в 10:00 МСК. Удачи! P.S. Ну а для тех, кто не хочет участвовать в розыгрыше, могу предложить скидку по промокоду adept15

Vibe reverse engineering Раньше, чтобы разобраться в том, как работает тот или иной участок кода без доступа к исходникам было не самой простой задачей и требовало определенных навыков. Сейчас же AI-агенты могут прочитать ваш APK как открытую книгу, и R8 уже не так сильно усложняет злоумышленнику жизнь. По сути, порог входа в reverse engineering значительно снизился. Как вкатиться в reverse engineering? Я рекомендую попробовать APKLab — это плагин для VS Code, который позволяет дизассемблировать APK в байткод (smali-файлы), декомпилировать в Java через утилиту jadx, пересобирать APK с изменением исходного кода и делать ещё много всего крутого. Далее просто открываем APK-файл в этой утилите, при желании декомпилируем исходники в Java и натравливаем на всё это AI-агента с мощной моделью, задавая интересующие вопросы по кодовой базе. В целом это уже очень неплохо работает: агент легко находит различные связи в коде, и Java-код ему даже не обязателен, он спокойно ориентируется и в байткоде. Единственное ограничение — это размер контекста, но в скором времени, думаю, и это перестанет быть проблемой. Как теперь защищать критически важный исходный код? В целом — никак. Стопроцентной защиты никогда и не существовало 👍 По сути, единственный способ, который гарантированно усложнит злоумышленнику жизнь — это использование нативного кода. Однако и для этих целей уже есть готовый MCP-сервер для IDA Pro. Так что сохранить исходный код в тайне в мобильных приложениях становится всё сложнее. А вам приходилось делать коммерческие SDK, в которых нужно по максимуму защитить исходный код? #ReverseEngineering #Security #AI

Устроил себе месячный детокс от программирования и это прекрасно. Всем рекомендую попробовать 🏝 И забавно, что за этот месяц в мобильной разработке почти ничего интересного не произошло, все разговоры только про AI да и только. Отсюда складывается стойкое ощущение, что сфера потихоньку умирает. Или нет? Давайте разберёмся вместе, поэтому призываю вас принять участие в исследовании мобильных разработчиков от DevCrowd. Зачем участвовать? – сверить себя с рынком: стек, грейд, зарплаты – понять, что происходит в мобильной разработке в целом: кроссплатформа победила или натив всё ещё жив – узнать, насколько мобильные разработчики адаптировались к AI-миру – разобраться, куда расти и где сейчас проще или сложнее с работой 📝 Опрос займёт примерно 10 минут 📊 Итоги появятся в апреле на devcrowd.ru 👉 Пройти опрос

Продолжим тему безопасности. Сейчас всё чаще мобильные разработчики начинают писать свои бэкенды, разумеется, с AI-агентами,
Продолжим тему безопасности. Сейчас всё чаще мобильные разработчики начинают писать свои бэкенды, разумеется, с AI-агентами, куда же без них. И в плане безопасности доверять ИИ точно не стоит! Предположим, мы хотим, чтобы для каждого URL, начинающегося с /api/, проверялось, что пользователь предоставил некий ключ доступа, иначе возвращалась ошибка. И для Ktor Server ИИ может написать вам такой интерцептор, который показан на изображении, и это даже как-то будет работать, но, разумеется, есть нюанс. Есть идеи, как это можно обойти? На самом деле всё очень просто: нужно всего лишь заменить букву соответствующим кодом в ASCII. Например, было http://0.0.0.0:4040/api/apps, а стало http://0.0.0.0:4040/%61pi/apps. Таким образом, проверка перестанет работать, а все запросы будут успешно выполняться. Более правильным вариантом было бы использование встроенных механизмов аутентификации, чтобы неявно проверять API-key для каждой ручки. #Security #Ktor #Backend

Хотите заняться своим английским в 2026, чтобы выйти на международный рынок? 🚀💵 С этим помогут в онлайн-школе разговорного английского Authentic Pigeon Ребята соберут кастомную программу с разговорной практикой и органично впишут занятия в ваше расписание, чтобы изучение языка было в удовольствие, а не обязаловку. Абсолютно кайфую от подхода ребят. Занятия тут это не потогонка, а крутой дружеский разговор. Студент школы — Иван ⚡️ Узнать подробнее и записаться на бесплатный демо-урок Реклама. Моисеева Анастасия Андреевна, ИНН 270393875959. Erid: 2VtzqvCfEFU

Pixnapping attack На днях узнал об одной интересной уязвимости, которая, по сути, без каких-либо разрешений и без root-доступ
Pixnapping attack На днях узнал об одной интересной уязвимости, которая, по сути, без каких-либо разрешений и без root-доступа позволяет украсть изображение с любого приложения на устройстве будь то браузер или нативное приложение, например TOTP-код из Google Authenticator 😱 Как это работает? 🔘Атакующее приложение через intent открывает приложение-жертву и тут же возвращает свою Activity в foreground, что делает атаку почти незаметной для пользователя. 🔘Затем поверх атакуемого приложения накладывается стек полупрозрачных Activity, где всё заливается белым цветом за исключением одного прозрачного пикселя, через который просвечивает UI атакуемого приложения. 🔘Используя blur и особенности SurfaceFlinger, можно растянуть этот пиксель и получить либо однородный шаблон, если пиксель белый, либо шумный, если пиксель другого цвета. 🔘Далее нужно определить цвет пикселя. Это делается за счёт особенностей графического сжатия в GPU: однородные изображения рендерятся быстрее, а шумные медленнее. Измерить это время можно с помощью VSync callback. 🔘Таким образом, повторяя этот процесс для разных пикселей, можно полностью восстановить изображение атакуемого приложения 👍 Насколько это опасно? На текущий момент нет гарантированной защиты от этой атаки, хотя Google и предприняла попытку ограничить количество Activity, которые могут использовать blur. Однако, как можно понять, такой сложный pipeline требует времени: полное восстановление изображения может занимать порядка 24 часов 😁 Поэтому для сценариев кражи TOTP-кодов используются более оптимизированные варианты атаки. На мой взгляд, уязвимость очень интересная, но из-за её сложности маловероятно, что она будет массово эксплуатироваться в реальных условиях. А вам в целом откликается тема безопасности? Было бы вам интересно узнать больше про подобного рода уязвимости? #Security #Android