Kotlin Adept Notes
الذهاب إلى القناة على Telegram
Канал о разработке на Kotlin и обо всем, что с ним связано По всем вопросам и рекламе: @ajiekcx
إظهار المزيد2 347
المشتركون
-124 ساعات
-67 أيام
-1430 أيام
أرشيف المشاركات
2 347
Тестировщики, общий сбор! Что успеете сделать за 100 минут работы?
Делимся идеей: можно запустить параллельные тесты приложения на разных устройствах, проверить производительность, нажатия и UI. И все это — бесплатно в Мобильной ферме от Selectel, потому что при регистрации вы получаете 100 бонусных минут в сервисе.
Что дает Мобильная ферма Selectel:
● Парк из 50+ моделей от популярных до редких смартфонов на Android и iOS.
● Удобство — настройки сохраняются, пока устройство закреплено за вами вне зависимости от количества тестов и длины сессии.
● Безопасность — информация о ваших сессиях автоматически удаляется после завершения аренды.
Регистрируйтесь и получите промокод на 100 минут при первом заказе: https://slc.tl/z6ujt
Реклама. АО "Селектел". erid:2W5zFHq1xQH
2 347
Насколько AI ускоряет TTM в большой компании
🧠 Мы запустили первое приложение, которое целиком написано с помощью AI: от прототипов и бэкенда до мобильных приложений. И хочется обсудить, насколько это реально ускорило общий TTM.
Можно услышать сотни историй о том, как вайбкодеры одновременно работают над десятком проектов и пишут по 30 тысяч строк кода в день. Это всё работает, пока ты делаешь это один. Но в большой компании, где куча команд, ещё больше микросервисов, своя инфраструктура, дизайн-система, правила безопасности и многое другое, тогда без полноценной перестройки процессов на уровне всей компании такой подход просто не получится внедрить.
Поэтому сейчас речь идёт именно о применении AI-агентов для написания кода, без глобального изменения процессов и с тем же уровнем качества кода, что и раньше.
Итак, я замерил показатели предыдущих MVP наших проектов и получил интересные цифры.
🟡Разработка действительно ускорилась, но не драматически — примерно на 50%. Всё потому, что раньше мы тратили большую часть времени на написание кода, попутно уточняя требования и валидируя результат. Теперь это время, по сути, переместилось в фазу планирования и валидации.
🟢А вот ускорение time to market получилось действительно разительным: от идеи до релиза приложения стало проходить в три раза меньше времени, чем обычно. Но, по сути, AI здесь ни при чём. Это произошло потому, что значительно сократилось количество людей в цепочке.
Разумеется, это всего лишь один пример, который проще всего было измерить. На большом масштабе цифры могут сильно отличаться.
📊 А какие цифры получаются у вас?
2 347
Как устроены продукты, которые задают тренды?
Т-Банк готовит летний фест для тех, кому важно не просто слушать, а разбираться, как реально устроены продукты
20 июня «Сезон кода» собирает разработчиков, аналитиков и продактов в Санкт-Петербурге, чтобы показать, как создаются продукты — от первых гипотез до продакшена.
Вас ждут:
— прикладные доклады команд Т-Банка и других компаний про архитектуру, бэкенд и интеграции;
— демо-зоны с ключевыми платформенными и коммуникационными сервисами и графовой аналитикой;
— продуктовый стрим «Продуктовая кухня»: разберем, как данные превращаются в решения, а гипотезы — в рост продукта и ценность для пользователя;
— формат, где знакомства происходят прямо по ходу программы.
А еще — баскетбольная площадка, пинг-понг и большое афтепати с диджеем.
Фест пройдет в ИТ-хабе Группы компаний «Т-Технологии».
Количество мест ограничено — успейте зарегистрироваться
2 347
Как сделать аналог 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").2 347
✅ 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!
2 347
Недушное изучение и практика разговорного английского в онлайн-школе Authentic Pigeon, чтобы привести язык в порядок и дотянуться до офферов за рубежом. Узнать подробнее и записать на бесплатное демо-занятие можно в телеграм-боте.
Абсолютно кайфую от подхода … Занятия тут это не потогонка, а крутой дружеский разговор.Студент школы — Иван Реклама. ИП Моисеева А.А. ИНН 270393875959
2 347
Решили тут перейти в дизайн-системе на state-based TextField, чтобы порешать разные проблемы предыдущей версии. И, как говорится, что же могло пойти не так 😐
Какие плюсы получили:
🟢Упростилась работа с курсором — страшные хаки больше не нужны
🟢Перестали лагать быстрые изменения текста на старых устройствах
🟢VisualTransformation теперь разделился на InputTransformation и OutputTransformation, что позволяет гибче работать с изменением текста
Какие минусы:
🔘Пришлось костылить обёртку с двумя LaunchedEffect, чтобы сохранить перегрузку с предыдущим API
🔘Ну и самое бесячее: в новом TextField почему-то решили поменять отступ от клавиатуры. Теперь экран подскролливается к каретке ввода, и выглядит это как на изображении выше. А фиксится всё ужасно костыльным образом.
💬 Так что вопрос к знатокам: кто-нибудь уже сталкивался с подобной проблемой? И если да, то как её решили?
2 347
Особенности работы с 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
2 347
Твой код — в сердце мощного ИИ! 💚
Команда GigaChat зовёт на One Day Offer амбициозных Java-разработчиков, которые готовы создавать AI‑продукты уровня BigTech и стать частью крупнейшего AI-комьюнити.
Если ты дружишь с Java (версии 8–25), ладишь со Spring и Hibernate, а PostgreSQL и ClickHouse для тебя — не просто слова, переходи по ссылке и занимай слот на One Day Offer.
Встречаемся 23 мая — очень ждём именно тебя!
2 347
Переход на 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?
2 347
Особенности работы с 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
2 347
+4
Mobius 2026 Spring: конференция для мобильных разработчиков
Почему мобильные приложения тормозят на проде? Как строить архитектуру, которая масштабируется с ростом пользователей? Где AI уже помогает решать инженерные задачи?
Эти и многие другие вопросы разберем на Mobius этой весной.
📅 12–13 мая, Москва + онлайн
Два дня докладов, воркшопов и живого общения мобильного сообщества. В программе — интеграции с бэкендом, управление состоянием, CI/CD, инструменты, оптимизация перфоманса и поддержка крупных проектов.
Листайте карточки — собрали топовые доклады из программы.
Используйте промокод, чтобы купить персональный билет со скидкой — KOTLINADEPT
Купить билет
Реклама. ООО «Джуг Ру Груп». ИНН 7801341446
2 347
Генерация макетов через 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
2 347
Как защитить API от нежданных клиентов
На днях я делал приложение для bug bounty активности на конференции, в котором нужно будет найти секретную ссылку. Мне не хотелось, чтобы всё решилось простым запросом в AI или пересборкой приложения с отключением SSL-пиннинга, поэтому я задумался о том, как защититься от пересборки приложения, чтобы только версия с моей подписью могла делать запросы к серверу.
Я решил попробовать Play Integrity. Всё бы ничего, но приложение должно быть обязательно опубликовано в Google Play, хотя бы во внутреннем тестировании, иначе аттестация устройства не будет проходить. Поэтому этот вариант мне не подошёл, и я решил реализовать собственный сервер аттестации, который проверяет цепочку сертификатов, извлекает из сертификата отпечаток подписи приложения и сравнивает его с заданным.
Звучит круто, но почему тогда это не используется массово? Дело в том, что, во-первых, это работает не на всех версиях Android. Кроме того, устройство должно поддерживать Hardware Attestation, что может отсечь часть устройств и на них приложение просто не будет работать.
Если вас заинтересовала тема, вы ещё успеваете залететь на Podlodka Android Crew и послушать доклад про Play Integrity, где разберут как работают эти механизмы. А ещё вы сможете попробовать сами обойти эту защиту в нашей bug bounty активности 💻
Так что присоединяйтесь, будет не только полезно, но и интересно 😉
2 347
Розыгрыш билета на Podlodka Android Crew #15
Мы снова подготовили для вас новый сезон конференции Podlodka Android Crew, который пройдет с 30 марта по 3 апреля.
В этот раз неделя будет посвящена безопасности в Android-разработке, и, на мой взгляд, нам удалось собрать интересную программу.
Мой личный топ докладов, которые хотелось бы послушать:
🔘Про защиту видеоконтента
🔘Про passkeys, так как прямо сейчас мы имплементируем это у себя
🔘Про то, как работает защита Play Integrity
🔘Про reverse engineering на практике от моего коллеги
И в связи с этим хочу провести розыгрыш билета.
Условия розыгрыша
💬 Вам нужно написать комментарий под этим постом на тему безопасности мобильных приложений. Можно рассказать про самый интересный баг в безопасности, с которым вы сталкивались, или, наоборот, поделиться опытом, как вы реализовали какое-то безопасное решение.
Итоги розыгрыша
🗓 Победителя выберу случайным образом уже в эту субботу в 10:00 МСК. Удачи!
P.S. Ну а для тех, кто не хочет участвовать в розыгрыше, могу предложить скидку по промокоду adept15
2 347
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
2 347
Устроил себе месячный детокс от программирования и это прекрасно. Всем рекомендую попробовать 🏝
И забавно, что за этот месяц в мобильной разработке почти ничего интересного не произошло, все разговоры только про AI да и только. Отсюда складывается стойкое ощущение, что сфера потихоньку умирает. Или нет?
Давайте разберёмся вместе, поэтому призываю вас принять участие в исследовании мобильных разработчиков от DevCrowd.
Зачем участвовать?
– сверить себя с рынком: стек, грейд, зарплаты
– понять, что происходит в мобильной разработке в целом: кроссплатформа победила или натив всё ещё жив
– узнать, насколько мобильные разработчики адаптировались к AI-миру
– разобраться, куда расти и где сейчас проще или сложнее с работой
📝 Опрос займёт примерно 10 минут
📊 Итоги появятся в апреле на devcrowd.ru
👉 Пройти опрос
2 347
Продолжим тему безопасности. Сейчас всё чаще мобильные разработчики начинают писать свои бэкенды, разумеется, с 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
2 347
Хотите заняться своим английским в 2026, чтобы выйти на международный рынок? 🚀💵
С этим помогут в онлайн-школе разговорного английского Authentic Pigeon
Ребята соберут кастомную программу с разговорной практикой и органично впишут занятия в ваше расписание, чтобы изучение языка было в удовольствие, а не обязаловку.
Абсолютно кайфую от подхода ребят. Занятия тут это не потогонка, а крутой дружеский разговор.
Студент школы — Иван
⚡️ Узнать подробнее и записаться на бесплатный демо-урок
Реклама. Моисеева Анастасия Андреевна, ИНН 270393875959. Erid: 2VtzqvCfEFU
2 347
Pixnapping attack
На днях узнал об одной интересной уязвимости, которая, по сути, без каких-либо разрешений и без root-доступа позволяет украсть изображение с любого приложения на устройстве будь то браузер или нативное приложение, например TOTP-код из Google Authenticator 😱
Как это работает?
🔘Атакующее приложение через intent открывает приложение-жертву и тут же возвращает свою Activity в foreground, что делает атаку почти незаметной для пользователя.
🔘Затем поверх атакуемого приложения накладывается стек полупрозрачных Activity, где всё заливается белым цветом за исключением одного прозрачного пикселя, через который просвечивает UI атакуемого приложения.
🔘Используя blur и особенности SurfaceFlinger, можно растянуть этот пиксель и получить либо однородный шаблон, если пиксель белый, либо шумный, если пиксель другого цвета.
🔘Далее нужно определить цвет пикселя. Это делается за счёт особенностей графического сжатия в GPU: однородные изображения рендерятся быстрее, а шумные медленнее. Измерить это время можно с помощью VSync callback.
🔘Таким образом, повторяя этот процесс для разных пикселей, можно полностью восстановить изображение атакуемого приложения 👍
Насколько это опасно?
На текущий момент нет гарантированной защиты от этой атаки, хотя Google и предприняла попытку ограничить количество Activity, которые могут использовать blur. Однако, как можно понять, такой сложный pipeline требует времени: полное восстановление изображения может занимать порядка 24 часов 😁
Поэтому для сценариев кражи TOTP-кодов используются более оптимизированные варианты атаки.
На мой взгляд, уязвимость очень интересная, но из-за её сложности маловероятно, что она будет массово эксплуатироваться в реальных условиях.
А вам в целом откликается тема безопасности? Было бы вам интересно узнать больше про подобного рода уязвимости?
#Security #Android
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
