TGViewer
Channel Public Channel
Мобильная разработка

Мобильная разработка

@mobi_dev

Актуальное по мобильной разработке — Android, iOS, кроссплатформа

Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/oVBP
Subscribers
13.2K
Photos
949
Videos
237
Links
3.1K

Showing posts older than #4672 · Back to latest

Older Posts 20 shown
Post #4671 2.12K
Агент сам жмёт кнопки в вашем Compose-приложении и проверяет, что вышло

В Compose Multiplatform 1.12.0 внутри Compose Hot Reload появился экспериментальный MCP-сервер. Через него ИИ-агент запускает hot reload, снимает скриншот, читает semantic tree, кликает, вводит текст и смотрит логи. То есть агент проверяет собственную правку в живом окне, а не просто отдаёт Kotlin и надеется.

Из остального в релизе: для Web автоматически подгружаются подмножества шрифтов Noto, а на desktop новые WindowState и DialogState умеют выбирать экран, задавать минимальный и максимальный размер окна и ставить диалог относительно родителя. Плюс правки жестов на iOS, VoiceOver, interop с UIKit и совместимости с SDK из Xcode 16.
  • 🔥 12
  • ❤ 1
  • 😴 1
Post #4670 1.97K
Приложение с открытым кодом выкинули из Google Play по жалобе без единого доказательства

Luanti — движок для воксельных игр с открытым кодом, до 2024 года он назывался Minetest. Игр и игровых ассетов в нём по умолчанию нет: пользователь ставит приложение, а игры докачивает из каталога ContentDB. 27 августа команда сообщила, что Android-приложение недоступно в Google Play.

Жалобу по DMCA подала от имени Microsoft компания Tracer․AI, платформа защиты бренда, ищущая нарушения ИИ-агентами. Всё обоснование — один номер регистрации US Reg. #TX 8-192-097, то есть Minecraft Java Edition 1.9. Какие ассеты и где, в уведомлении не сказано.

Похожее уведомление от той же компании приходило в марте 2023 года: встречное подали 25 марта, приложение вернули 10 мая — через 46 дней вместо 10–14 рабочих, которые отводит § 512 DMCA.

На картинке — все текстуры, которые входят в приложение, из разбора команды. Пока оно остаётся на F-Droid и на сайте проекта.
  • 🤯 6
  • 👎 2
  • ❤ 1
Post #4669 1.94K
Семейная подписка в iOS-приложении без сервера и аккаунтов

Соло-разработчик сканера чеков ReceiptIQ добавил самую просимую фичу: одна подписка на семью и общие чеки. Сервера, аккаунтов и копий данных вне телефонов нет: устройства синхронизируются напрямую по Wi-Fi. Он расписал архитектуру и что сломалось по дороге.

Главный трюк: телефон родственника сам проверяет, что владелец платит. StoreKit 2 отдаёт транзакцию как JWS с подписью Apple (jwsRepresentation; jsonRepresentation подделывается), устройство проверяет цепочку сертификатов, подпись, bundle ID и environment == Production. Следствие: в TestFlight пейринг не потестировать, там Sandbox.

Слияние по last-writer-wins принесло классику: перештамповал modifiedAt при применении, и два телефона гоняли запись по кругу. Ещё один баг прожил два месяца: пир молча пропускал недоступные фото, синк не завершался, хотя данные доходили. Лечит таймаут тишины 30 секунд.

Есть синк между устройствами? Сверьте свои инварианты с его списком.
Post #4668 2K
Google Play начнёт понижать приложения, которые едят слишком много памяти

С февраля 2027 года расход памяти становится обычной метрикой Android Vitals — со своим порогом «плохого поведения», как у крашей и ANR. Google объявила правила: считается Anonymous RSS плюс Swap и отдельно память под bitmap, порог сравнивается с суточным 90-м перцентилем, а качество Play оценивает по последним 28 дням.

Для обычного приложения на устройстве с 8 ГБ оперативной памяти потолок — 2,25 ГБ на переднем плане и 1,5 ГБ в фоне. Играм дают больше: 3,5 ГБ и 2,75 ГБ. Отдельно идёт DEX: если он больше 10 МБ у приложения или 50 МБ у игры, требуется не меньше 25% обфускации, оптимизации и shrinking — три отдельных порога. Кто не уложится, теряет видимость в Play и часть возможностей публикации.

Второе требование, с апреля 2027-го, — Zero-Tap Sign-In Restoration. Мобильное или планшетное приложение с авторизацией должно восстанавливать вход, когда пользователь при настройке нового телефона выбрал перенос данных: открылось — и уже залогинен. Делается через Restore Credentials API, доступный с Android 9; игры пока освобождены.

Смотреть у себя стоит уже сейчас: Android Vitals, размеры bitmap-кэшей и то, что реально осталось после R8.
  • 👍 3
  • 😱 2
Post #4667 2.15K
61% того, что KMP-модуль отдаёт в iOS, никто не вызывает

Если у вас Kotlin Multiplatform, ваш shared-модуль приезжает в Xcode как Objective-C-заголовок, и каждая лишняя строка в нём замедляет сборку и раздувает фреймворк. Разработчик приложения Framed открыл свой Shared.h и увидел 23 622 строки: в Kotlin всё public по умолчанию, поэтому в экспорт попали цвета темы, 38 констант отступов, внутренние колбэки экранов и типы Ktor. Компилятор выкинуть их не может: Objective-C диспетчеризует динамически, вдруг Swift позовёт.

Он написал Gradle-плагин kmprofiler: тот сопоставляет заголовок с Swift-кодом и считает экспорты без вызовов. Из 459 деклараций 282 не используются (61,4%).

Правка заняла пять файлов: internal для Dimens, Color, Type и UI-моделей, а для классов, нужных Android-модулям, есть @HiddenFromObjC. Заголовок ужался до 13 327 строк (−43,6%), фреймворк похудел на 5,7 МБ. Плагин лежит в Gradle Plugin Portal, автор показал, как прогнать через него свой модуль.
  • 🔥 7
Post #4666 2.37K
Две функции Android-приложения месяц не работали в релизе, а в debug всё было в порядке

Автор LongShot (склейка длинных скриншотов) месяц получал жалобы: распознавание текста и скрытие персональных данных отвечали «Couldn't read this image». У него самого всё работало, Android Vitals молчал, крашей не было. Пять раундов «починил, проверьте» ушли впустую: он тестировал через installDebug, а debug-сборка не минифицируется.

Виноват R8. Consumer-правило ML Kit -keep class * implements ComponentRegistrar сохраняет класс, но не его члены. Пустой конструктор TextRegistrar в байткоде никто не вызывает, регистраторы создаются рефлексией, и R8 его удалил. Фикс одна строка: то же правило с { <init>(); }, покрывает семь регистраторов.

Главное изменение у автора: isMinifyEnabled = true в debug. Проверьте свой релиз: grep '<init>' по usage.txt и grep Registrar по seeds.txt, каждый регистратор должен быть там дважды. Разбор целиком.
  • 👍 4
  • ❤ 1
Post #4665 2.61K
Встречайте новую мини-игру — «Отпуск».

За несколько шагов нужно подготовить героя к поездке: навести порядок, разобрать вещи, отыскать билет и упаковать чемодан. Отдельный этап — отпускной гардероб, и тут всё непросто.

Простое управление, короткие уровни, юмор. Отличный способ отвлечься на пару минут между задачами и заодно поймать промокоды от партнёров!

Попробовать: https://tprg.ru/DtBr
  • 👎 7
  • 💊 2
  • 🗿 1
Post #4664 4.18K
Ваша память ещё работает или нейронки уже и помнят всё за вас?

Чтобы это проверить мы приготовили для вас «Меморину» — игру, которая поможет проверить вашу память.

Всё просто: нужно запомнить и выбрать одинаковые карточки. Если память плохая, то рано или поздно вы всё равно справитесь. А если хорошая, то сможете увидеть ваш потолок скорости.

Ну что, готовы проверить? Тогда переходите по ссылке: https://tprg.ru/fw4Z
  • 👏 1
Post #4663 4.11K
Почему ваш пет-проект ещё не бизнес, а вы — не предприниматель

У каждого второго разработчика в столе лежит проект, который «вот-вот станет бизнесом». Осталось дописать пару фич — и дальше всё поедет само. Спойлер: не поедет. Разбираемся, где заканчивается код и начинается бизнес: почему всё стартует не с технологии, а с чужой проблемы, чем фаундер отличается от тимлида и почему рабочий сервис с первыми пользователями и MRR — это не бизнес, а промежуточный результат.

Простой тест: уйдите в отпуск на две недели, и если без вас всё встало — поздравляем, у вас пока не бизнес, а вы сами и есть главный «производственный ресурс».

Внутри ещё и про AR-очки на трамвайном заводе, которые зарубили сами рабочие: история о том, как ценность решения определяете не вы.
  • 👎 4
  • ❤ 2
Post #4662 4K

Forwarded from Типичный программист

Android 17 даёт приложениям функции, которые ИИ-агенты могут вызывать сами

Привыкли, что приложение ждёт, пока вы сами нажмёте кнопку? В Android 17 Google меняет правила: разработчик аннотирует функции приложения, и ИИ-агент может дергать их через Jetpack, получая доступ к локальному состоянию.

Приложение перестаёт быть островом и становится частью инфраструктуры для агентов. 16 июня вышел Android 17 с API 37, а 9 июня появился Android CLI 1.0. Теперь проект можно собирать из командной строки.

Вдобавок с 30 сентября разработчиков ждёт обязательная верификация в четырёх странах, а в Play сервисный сбор отделяется от платёжного. Разобрали дайджест июня — кто платит, кто мигрирует и что ломается.
  • 👎 5
Post #4661 3.36K
Kotlin 2.4.0 стабилен: что меняется для Android- и iOS-приложений

Летом Kotlin исполняется 15 лет, но для мобильной разработки важнее релиз 2.4.0. В стабильной ветке появились context parameters и explicit backing fields — то, что упростит шаблонный код в Android-проектах. Kotlin/Native теперь поддерживает Swift packages, что упрощает связку с iOS-зависимостями в Kotlin Multiplatform.

Compose Multiplatform дошёл до 1.12.0-beta01, а Compose Hot Reload — до 1.2.0-beta01. Если собираете shared UI под Android и iOS, это сокращает цикл правка-сборка-проверка. Gradle 9.5.0 тоже на борту. Подробности в обзоре.
  • 👍 2
  • ❤ 1
Post #4660 3.51K
Аутсорс, инхаус или выделенная команда — что реально дешевле?

Спойлер: ставка разработчика вам этого не скажет. Сравнивать модели по ставке довольно бессмысленное занятие, потому что за низкими ставками прячутся найм, налоги, онбординг, простои, переделки и часы техлида. В смете их не видно, а в бюджете — ещё как.

Разбираемся, как считать настоящий TCO (полную стоимость владения) по трём моделям:
🔘Инхаус — почему свой разработчик дороже оффера;
🔘Аутсорс — за что вы платите маржу подрядчику;
🔘Выделенные команды — почему «возьмём человека и ускоримся» работает не всегда.

Внутри — формулы для каждой модели и чек-лист из 3 пунктов, чтобы выбрать формат под свой проект.
  • 👍 1
Post #4653 4.54K

Forwarded from Чашечка Java

Локализация через Enum: избавляемся от рантайм-парсинга

В статье на Tproger разобрали три подхода к локализации: классическое наследование требует дублировать поля вручную, стандартные ARB/JSON парсятся в рантайме и съедают память, а табличные генераторы требуют ручного запуска после каждой строки.

Выход — Enum в одном файле без внешних ресурсов. Это убирает рантайм-парсинг и ручное дублирование. Если ваши сервисы сопрягаются с клиентами, где локализация до сих пор требует JSON или генераторов, стоит переложить её на compile-time решение.
Post #4652 4.43K
Если вы устали от бесконечных тасок и созвонов, то мы приготовили для вас игру, которая поможет отдохнуть

А заодно проверить вашу способность быстро запоминать новую инфу. Переходите по ссылке и играйте в нашу «Меморину». И делитесь результатами в комментариях!

Играть тут: https://tprg.ru/Yldr

@mobi_dev (теперь и в Max)
  • 👍 3
Post #4651 4.21K
Compose Multiplatform 1.11: iOS становится ближе к нативному ощущению

Кроссплатформенный UI часто ломается на мелочах: курсор в text field, selection handles, жесты, системное меню. В Compose Multiplatform 1.11 JetBrains как раз двигает эти детали на iOS, а не только добавляет ещё один общий API.

В релизе есть experimental native text input поверх UIView, concurrent rendering по умолчанию, обновлённые Compose UI test APIs v2 и переработанная обработка touch для web targets. Для мобильных команд это хороший набор сигналов: где shared UI уже зрелый, а где нужна проверка на устройстве.

Можно изучить релиз и выбрать, что тестировать в своём KMP-приложении. В деталях особенно полезны ограничения новых text input API и изменения в тестах.

@mobi_dev (теперь и в Max)
  • 🔥 4
  • 🍌 3
  • ❤ 1
  • 👌 1
Post #4650 4.25K
Пять багов, которые видно только на живом железе

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

— Android RatingBar наследует ProgressBar и считает рейтинг через округление по stepSize. На реальных Samsung округление уходило вверх: касание четвёртой звезды давало 5. Фикс — stepSize 0,01 и ручное округление в листенере.

— iPad слал в JSON OSName «iPadOS», бэкенд знал только «iOS» и возвращал 400 «Provider UUID not found». Все планшеты остались без пушей из-за одной строки.

— WebSocket чата не отправлял код 1000 при выходе, сокеты копились на каждом входе, приложение падало. Корень — переиспользованная библиотека основного банковского продукта.

— Чипсы специальностей и кнопка выбора счёта без скролла: на эмуляторе и тестовых данных всё ок, на восьми тегах и длинном списке UI ломался.

Внутри ещё промокоды и валидация на стыке веба и мобилки.

@mobi_dev (теперь и в Max)

@mobi_dev (теперь и в Max)
  • 👍 3
  • 👎 3
Post #4649 3.96K
Android Skills — модульные AI-инструкции для разработки

Google выложила Android Skills — набор готовых markdown-инструкций для любой LLM (Claude, Gemini, GPT), которые проводят агента через рутинные архитектурные задачи в Android-проекте.

В наборе:
— View → Compose миграция с сохранением ViewModel-логики.
— Реализация adaptive-лейаутов под Android 17 (sw > 600 dp).
— Navigation 2 → Navigation 3 transformation.
— Миграция со старых camera-библиотек на CameraX.

Технически Skills — структурированные `.md` файлы с шагами, проверками и code patterns. LLM подключает их как контекст и идёт по чеклисту, не «вспоминая» Compose из памяти. Запуск — через новый Android CLI 1.0. Репо открытый, форкается под свой стек.

@mobi_dev (теперь и в Max)
  • 👍 4
  • ❤ 1
Post #4648 3.79K
Android 17 убирает opt-out для адаптивности

На Google I/O 2026 анонсировали: Android 17 (API level 37) удаляет временный opt-out от ограничений на ориентацию и resizability. При target API 37 приложение обязано адаптироваться к экранам sw > 600 dp — планшетам, foldables и ChromeOS.

В Android 16 эти изменения уже ввели, но дали opt-out — можно было оставить app фиксированным под телефон. В Android 17 опции больше нет.

Что делать:
- Тестировать через флаг UNIVERSAL_RESIZABLE_BY_DEFAULT в App Compatibility Changes под SDK 36.
- Готовить UI на Compose 1.11 — Grid/FlexBox-лейауты и MediaQuery API.

Мотивация от Google Play — бейдж «Optimized for large screens» для приложений, прошедших новый quality bar.
Android Developers Blog Adaptive development for the expanding Android ecosystem News and insights on the Android platform, developer tools, and events.
  • 👎 6
  • ❤‍🔥 1
  • 👍 1
Post #4643 5.74K
Локальный ИИ на iPhone — без облака и без зависимости от API

Google выпустил AI Edge Gallery для iOS: приложение запускает Gemma 4 прямо на устройстве. Ответы на вопросы, распознавание фото, расшифровка голоса — всё работает локально, без интернета. Для разработчиков это референсная реализация on-device ML с открытым исходником на GitHub — можно разобрать, как интегрировать модель в своё приложение.

На iPhone запускаются облегчённые версии на 2 и 4 миллиарда параметров. Вместе с iOS-версией добавили Thinking Mode (chain-of-thought с видимыми шагами рассуждений) и Agent Skills — плагины-инструменты, которые модель вызывает сама. Tool use на телефоне — теперь не только в слайдах, а в коде на GitHub под Apache 2.0.

@mobi_dev (теперь и в Max)
  • 👏 7
  • ❤ 2
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →