Kotlin Adept Notes
1.98K subscribers
67 photos
10 videos
114 links
Канал о разработке на Kotlin и обо всем, что с ним связано
По всем вопросам и рекламе: @ajiekcx
Download Telegram
Мы на работе не раз сталкивались с проблемой мониторинга и ответов на отзывы в разных магазинах приложений, но теперь появилось удобное решение прямо в Telegram!

С помощью MobileReviewsBot вы сможете мониторить отзывы в Google Play и App Store!

🔘Отслеживать все оценки и комментарии в одном месте
🔘Отвечать прямо из Telegram – без лишних действий
🔘Генерировать идеальные ответы с помощью встроенного ИИ

Сейчас проходит бета-тестирование бота, и вы можете принять участие:

🔘Что нужно сделать?
1. Начните пользоваться ботом прямо сейчас.
2. Через неделю оставьте отзыв командой /feedback.

🔘 Что вы получаете?
😀 Сразу — тариф «Плюс» на 1 месяц (без ограничений!)
😀 После отзыва — ещё 3 месяца бесплатно!

👉 Подключайтесь сейчас
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡15👍91🔥1
Советы по сканированию DataMatrix

Если вам интересно, чем закончился мой вайбкодинг по созданию сканера для распознавания всех видов DataMatrix (DM), то вот к чему я пришёл:

🟡 Google ML Kit оказался производительнее ZXing по нашим замерам. Осталась проблема с тем, что ML Kit не распознаёт белые DM на чёрном фоне.
🟡 Самое простое решение оказалось самым эффективным: для сканирования инвертированных DataMatrix нужно инвертировать Bitmap. Однако всё не так просто.
🟡 Самый эффективный способ инвертировать Bitmap — использовать ColorMatrix и нарисовать Bitmap на Canvas. Пример оставлю в комментариях.
🟡 Другая проблема заключалась в том, что CameraX отдаёт изображение в формате YUV, и стандартный метод конвертации ImageProxy в Bitmap может упасть с ошибкой UnsupportedOperationException. Тут два пути решения: написать свой конвертер или выставить в настройках камеры OutputImageFormat в формат RGBA.
🟡 А чтобы одновременно работать с обычными и инвертированными DM, лучше не использовать один ImageProxy, а сделать разные анализаторы и раскидывать кадры между ними по очереди, объединив их с помощью паттерна «Компоновщик».

#CameraX #GoogleMLKit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🤔31
Как самому зашифровать SharedPreferences

Вы наверняка знаете, что решение от Google в виде EncryptedSharedPreferences уже давно Deprecated, а какой-то адекватной замены им так и не появилось. И что делать, если безопасники отказываются принимать оговорку, что префы может читать только само приложение, если на устройстве нет рута? ☹️

Остается только написать свое решение и, на самом деле, сделать это не сильно сложно. Для этого нам понадобится AndroidKeystore и Tink — open-source решение от Google для работы с криптографией, которое очень удобно в использовании.

Алгоритм получается следующий:
1. В AndroidKeystore создаем новый ключ, если его еще нет
2. В Tink генерируем KeysetHandle
3. На основе этих данных создаем encryptedKeyset средствами Tink и сохраняем его в SharedPreferences
4. Затем из keysetHandle достаем примитив AEAD, с помощью которого уже будем шифровать данные
5. PROFIT

В этой реализации главное учесть два момента:
🔘Обязательно удалять ключ из AndroidKeystore при очистке префов
🔘Разработать стратегию на случай, если encryptedKeyset в префах или ключа в Keystore не оказалось, иначе вы не сможете расшифровать ваши данные!

Ну а дальше уже дело техники, если тема интересна, то я постараюсь собрать сниппет с кодом 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥5😁1👌1
Какие планы на 30 августа? Есть возможность попасть на JVM Day — профильную конференцию для разработчиков.

В планах:
— обсудить кейсы, нестандартные решения и инженерные практики;
— послушать доклады специалистов из Сбера, Т-Банка, Яндекса, 2ГИС, Squad, 01. tech;
— проводить сезон на афтепати в компании единомышленников.

Часть вырученных на мероприятии средств пойдет на поддержку региональных вузов.
Встреча пройдет в штаб-квартире Т-Банка, а узнать подробности и купить билеты можно тут
10🤡1😭1
Зашифрованные префы для MultiplatformSettings

Как и обещал, выкладываю в общий доступ реализацию шифрования SharedPreferences с помощью библиотеки Tink и AndroidKeystore.

В данном случае реализация сделана для библиотеки MultiplatformSettings, но вы легко можете адаптировать ее для обычных SharedPreferences.

⚠️ Специально выкладываю решение как gist, потому что никаких гарантий нет, используйте на свой страх и риск!

🌐 Исходный код здесь

P.S. За реализацию скажем спасибо Евгению Мельцайкину 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24
Просмотр Markdown файлов в Android Studio

Если вы, как и я, не знали, что в студии можно просматривать форматированные .md-файлы, то держите рецепт, как починить отображение:

1. Откройте Help → Find Action
2. Введите "Choose Boot Java Runtime for the IDE"
3. В выпадающем списке в поле New выберите runtime с поддержкой JCEF.
4. Перезагрузите IDE

Это особенно полезно при работе с AI агентом Junie, который генерит ответы в этом формате.

#Markdown #AndroidStudio
354👍2
🛶 Новый сезон Podlodka Android Crew стартует уже через два месяца, а значит, пора выбрать тему сезона и нам нужна ваша помощь выбрать лучшую.

Мы подготовили три потенциальных темы:

🛠 Тулинг: от AI до Я
- Расскажем как грамотно использовать AI-агенты
- Узнаем тайную магию дебаггера
- Поделимся must-have плагинами

🔋 Работа в фоне
- Узнаем как сделать музыкальный плеер
- Разберемся как работать в фоне в KMP
- Поговорим про новые фичи, вроде Live Updates

⚙️ Архитектура: AI, KMP, SDK
- Научимся проектировать SDK
- Посмотрим дебаты про BDUI
- Узнаем, чем занимается мобильный архитектор

📊 Пройдите, пожалуйста, опрос по ссылке.

А среди тех, кто пройдет опрос до 20 июля включительно, мы разыграем проходку на грядущий сезон 🎁
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝15🔥3🫡1
Недавно рассказывал вам про MobileReviews бот, хочу получить от вас фидбек. Интересен ли вам этот сервис?
Anonymous Poll
41%
Не публикую приложения
10%
Я сам такой за день напишу...
31%
Отслеживаю отзывы в сторах самостоятельно
9%
Использую другое решение
19%
Интересный бот, посмотрю
Make Snackbar Great Again

В Compose реализация показа snackbar получилась не самой удобной, на каждом экране приходится:
🔘 Оборачивать контент в Scaffold
🔘 Вызывать suspend-функции для показа snackbar
🔘 Не забывать предусмотреть отмену предыдущего snackbar
🔘 Страдать из-за BottomSheet, так как там не получится использовать Scaffold, иначе он растянется на весь экран

И даже если сделать один глобальный обработчик, snackbar будет залезать на BottomNavigation, что выглядит довольно плохо 🤔

Вот что я предлагаю:
🟢Отказаться от показа snackbar через Scaffold и написать простую логику с декларативным отображением snackbar с анимацией в зависимости от состояния.
🟢Чтобы snackbar не перекрывал лишние элементы интерфейса, можно написать кастомный модификатор в Compose, который будет запоминать верхнюю позицию элемента, к которому он применён, и добавлять неявный отступ к snackbar.

Таким образом, эта реализация не только решает проблемы выше, но и позволяет отображать snackbar как внизу, так и вверху экрана.

🔥 Если тема интересна, ставьте реакции и я попробую собрать пример с такой реализацией.

#Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥121🥴9👍84
📂 Папка с Android-блогерами

Мы решили заколлабиться с крутыми инженерами, которые ведут блоги об Android-разработке и делятся авторским контентом.

Добавляйте папку себе, если вам интересно послушать разные мнения и советы на повседневные темы разработки 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
19😴3
📣 По вашим заявкам сделал небольшую библиотеку для декларативного показа снекбаров.

Преимущества библиотеки:
🟢 Полностью декларативный API, забудьте про one-time события и их обработку в LaunchedEffect.
🟢 Можно сделать как один глобальный обработчик, так и множество вложенных.
🟢 Благодаря встроенным модификаторам важный UI не будет перекрываться снекбаром.
🟢 Можно отображать снекбар как внизу, так и вверху экрана.
🟢 Поддерживаются любые типы сообщений, а не только строки.
🟢 Нет зависимости от Material, отображайте любой UI, какой захотите.
🟢 Настраиваемые анимации появления и скрытия снекбара.
🟢 Поддерживаются Android, iOS и JVM-таргеты.
🟢 Простая интеграция с Decompose.

🌐 Инструкцию по подключению, сэмпл и исходный код смотрите в репозитории.

Звёздочки на репозиторий и репосты приветствуются!

#Compose #Snackbar #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥68👍94🤔1
Как слить кодовую базу из-за Compose Multiplatform

Я уже как-то писал, что никакая кроссплатформа не освобождает от необходимости знать среду выполнения, и это в очередной раз стрельнуло.

Если в Android мы переживаем за то, чтобы никто не зареверсил наш код, подключаем R8 и так далее, то как обеспечить такой же уровень защиты в вебе?

Казалось бы, там всё ок из коробки: в релизном билде что-то понять из итогового JS-файла не получится, особенно с Wasm.

Но есть один маленький нюанс: по умолчанию в настройках Webpack исходный код тоже публикуется, и его любой может успешно посмотреть в Developer Tools. А в документации по Compose Multiplatform нет ни одного упоминания о том, как это предотвратить 🤡

Так что обязательно отключайте публикацию сорсов в настройках Webpack на релизе. Как это сделать — смотрите в комментариях 👇

#Security #Compose #WEB
Please open Telegram to view this post
VIEW IN TELEGRAM
28👍18🤬4🔥2
Как AI помогает в мобильной разработке

Да, AI добрался и до этого канала... Знаю, что многих уже тошнит от упоминания этих букв в инфополе, но таков путь. При этом, по моим наблюдениям, далеко не все разработчики поработали с AI-агентами, а зря, ведь многие задачи уже можно не делать самому:

Что уже можно отдать AI
🟢 Любую задачу, которую вы понимаете, как решить, и можете это сформулировать в тексте
🟢 Генерацию вёрстки по макетам в Figma
🟢 Написание документации
🟢 Код-ревью
🟢 Анализ крашей и ошибок
🟢 Объяснение сложных участков в коде и так далее

Что пока не стоит
🔘 Задачи, в которых нужно проявить креативность и нет понятного решения
🔘 Работу с экзотическими технологиями, вроде интеропа с Objective-C в Kotlin Native
🔘 Обновление зависимостей в проекте
🔘 Создание архитектуры приложения

Напоследок порекомендую доклады (раз, два) от наших коллег из сообщества, которые делятся своим опытом применения AI.

#AI #Mobile
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍34👎16🥱8🥴5🤡1
This media is not supported in your browser
VIEW IN TELEGRAM
23 августа пройдет Yandex Mobile Runtime — фест для мобильных разработчиков

Забудьте про скучные лекции с десятками слайдами. Будем прокачиваться здесь и сейчас. Участников ждет AI-хакатон, карьерные консультации с экспертами Яндекса, воркшопы по MCP и ускорению приложений, и не только.

А еще — можно поучаствовать в дискуссии от Городских сервисов по метрикам, тестированию и BDUI, поиграть в настолки в зоне от экспертов Поиска и рекламных технологий и заглянуть в кастомный бар с коктейлями от команды Яндекс 360.

Не пропустите — регистрация уже открыта.
👍5🎃1
Тестирование мобильных приложений

Давайте поговорим о том, как можно организовать процесс тестирования мобильных приложений. За свою практику я познакомился с разными подходами и вот какие плюсы и минусы я вижу:

1. Ручное тестирование
Самый распространённый вариант, когда в команде есть QA, и он тестирует новые фичи и проводит регрессию.
Лучший способ находить самые непредсказуемые баги, о которых разработчик даже не мог подумать.
Дорого: нужно содержать штат QA, покупать девайсы для тестирования. А если регресс занимает пару дней, получаем ещё и выгоревших сотрудников.

2. Автотесты на эмуляторах/симуляторах
Второй по популярности вариант, автоматизируем те же тест-кейсы, что и проходит тестировщик. Так мы можем быть почти уверены, что ничего не сломали.

Позволяет автоматизировать регресс, UI-тесты проходят значительно быстрее ручного тестирования.
Есть множество проблем с поддержкой UI-тестов, и далеко не всё можно проверить на эмуляторе/симуляторе.

3. Мобильная ферма
В этом случае мы используем ферму из реальных устройств, на ней можно проводить как ручное тестирование, так и запускать UI-тесты.

Такой подход используют, например, в Яндексе с более чем 800 устройствами. Я не представляю, сколько это стоит, ведь для каждого iPhone нужен отдельный MacBook ☠️
Из open source-решений есть STF и DeviceHub, у которых тоже есть свои плюсы и минусы.
Другой вариант — аренда фермы девайсов. Например, такие услуги предоставляет компания Selectel.

Самое качественное тестирование: множество разных девайсов позволяет воспроизводить самые специфичные баги.
Очень дорого создавать собственное решение. Позволить себе это могут только крупные компании, но можно воспользоваться арендой устройств, чтобы значительно сэкономить.

🔖 Если тема заинтересовала и хотите узнать подробнее, то есть хорошая статья по теме, рекомендую!

#Testing #MobileFarm
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻14