Мобильная разработка
13.2K subscribers
951 photos
237 videos
3.07K links
Актуальное по мобильной разработке — Android, iOS, кроссплатформа

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

Регистрация в перечне РКН: https://tprg.ru/oVBP
Download Telegram
Forwarded from Чашечка Java
Локализация через Enum: избавляемся от рантайм-парсинга

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

Выход — Enum в одном файле без внешних ресурсов. Это убирает рантайм-парсинг и ручное дублирование. Если ваши сервисы сопрягаются с клиентами, где локализация до сих пор требует JSON или генераторов, стоит переложить её на compile-time решение.
Forwarded from IT Юмор
💯12😁6🗿2
Аутсорс, инхаус или выделенная команда — что реально дешевле?

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

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

Внутри — формулы для каждой модели и чек-лист из 3 пунктов, чтобы выбрать формат под свой проект.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
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 тоже на борту. Подробности в обзоре.
👍21
Forwarded from Типичный программист
Android 17 даёт приложениям функции, которые ИИ-агенты могут вызывать сами

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

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

Вдобавок с 30 сентября разработчиков ждёт обязательная верификация в четырёх странах, а в Play сервисный сбор отделяется от платёжного. Разобрали дайджест июня — кто платит, кто мигрирует и что ломается.
👎5
Почему ваш пет-проект ещё не бизнес, а вы — не предприниматель

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

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

Внутри ещё и про AR-очки на трамвайном заводе, которые зарубили сами рабочие: история о том, как ценность решения определяете не вы.
👎42
Ваша память ещё работает или нейронки уже и помнят всё за вас?

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

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

Ну что, готовы проверить? Тогда переходите по ссылке: https://tprg.ru/fw4Z
👏1
Встречайте новую мини-игру — «Отпуск».

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

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

Попробовать: https://tprg.ru/DtBr
👎7💊2🗿1
Две функции 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, каждый регистратор должен быть там дважды. Разбор целиком.
👍41
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
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
Семейная подписка в iOS-приложении без сервера и аккаунтов

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

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

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

Есть синк между устройствами? Сверьте свои инварианты с его списком.
Приложение с открытым кодом выкинули из 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👎21
Агент сам жмёт кнопки в вашем 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.
🔥121😴1
Android 17 прячет имена сайтов от оператора и требует разрешения на сканирование локальной сети

27 августа Google описала сетевые изменения Android 17, и два из них меняют поведение приложений.

Первое — Encrypted Client Hello. Даже под HTTPS имя домена уходит в TLS-рукопожатии открытым текстом, и оператор видит, куда вы ходите. ECH вместе с приватным DNS его закрывает; Android 17 стал первой крупной мобильной ОС с широкой поддержкой. Чтобы приложение это получило, Google рекомендует перейти на OkHttp 5.5.0 и включить ECH явно.

Второе — Local Network Protection. Раньше приложение могло без спроса просканировать домашнюю сеть и увидеть телевизор, камеры, консоль. С Android 17 на сканирование и подключение к устройствам локальной сети нужно разрешение пользователя. Для трансляции видео на телевизор рекомендуют системный выбор устройства: пользователь указывает телевизор сам, приложение доступа к остальной сети не получает.

Если у вас есть обнаружение устройств по mDNS или прямые подключения по IP в локалке, это ваш ближайший приоритет.
🎉4👍1
Из Pixel 11 пропала аппаратная разметка памяти, и GrapheneOS не смогла доделать порт

MTE — расширение ARM, которое приписывает выделениям памяти короткий тег с гранулярностью 16 байт и сверяет его при обращении. Несовпадение выдаёт use-after-free или выход за границы, и в синхронном режиме процесс падает прямо на месте ошибки. Проверка вероятностная, зато накладные расходы куда ниже, чем у программных санитайзеров.

Аппаратный MTE появился в Pixel 8 в октябре 2023 года. GrapheneOS включила его для своего пользовательского пространства 30 октября того же года, по умолчанию — с релиза 7 ноября, а до основных аллокаторов ядра добралась только летом 2025-го. Stock Android глобально разметку так и не включил: её получают отдельные системные компоненты вроде NFC, Bluetooth и SecureElement, а Advanced Protection в Android 16 добавляет к ним совместимые процессы и приложения, которые подключились сами.

Теперь команда сообщила, что после недели работы порт на Pixel 11 остался частичным: поддержки MTE нет ни в софте, ни в прошивке, ни, по оценке проекта, в самом кремнии. Вывод там же — Google вырезал функцию ради экономии. Покупать Pixel 11 в GrapheneOS не советуют и думают пропустить серию целиком.

В остальной индустрии направление обратное. Apple в iPhone 17 и iPhone Air включила Memory Integrity Enforcement — постоянно работающую защиту ядра и более семидесяти процессов пользовательского пространства поверх Enhanced MTE. Snapdragon 8 Elite Gen 5 стал единственным пока чипом Qualcomm с аппаратной разметкой. Разработчику приложения включать её всё равно нужно руками, и охотников немного: Apple предупреждает о влиянии на производительность и стабильность, а Signal для Android в манифесте MTE не запрашивает.
😐4
Android блокирует скрытую отправку кодов переадресации

Приложения могли использовать разрешение CALL_PHONE, чтобы в фоне отправить USSD-код переадресации через TelephonyManager.sendUssdRequest(). Так входящие звонки жертвы перенаправлялись на чужой номер без явного подтверждения. В Android 17 QPR2 Google закрыла этот сценарий.

Начиная с Beta 4 фоновый запрос с кодом вроде *21# отклоняется с ошибкой USSD_ERROR_NOT_ALLOWED. При ручном наборе кода переадресации система показывает подтверждение. Обычные USSD-запросы, включая проверку баланса, продолжают работать.

Разработчикам приложений, которые отправляют сервисные коды, нужно корректно обработать отказ или перейти на ACTION_DIAL, где действие выполняет пользователь. Google выпустила Beta 4 со сборками CP41.260814.003.A2 и CP41.260814.003.B1. Уровень патча безопасности — 2026-08-05, версия Google Play services — 26.28.33.
Настоящая iOS в виртуалке на Mac: не симулятор, с root-шеллом внутри

Симулятор Xcode не запускает настоящую систему: там нет ядра iOS, нет App Store, нет полноценной файловой системы устройства. Проверить поведение приложения при странной конфигурации ОС или посмотреть, что происходит ниже уровня фреймворков, на нём нельзя.

Проект vphone-cli поднимает виртуальный iPhone через штатный Virtualization.framework Apple, опираясь на инфраструктуру исследовательских виртуалок Private Cloud Compute. На скриншоте — загруженная iOS 27.0 рядом с терминалом, где neofetch показывает ядро 25.4.0 и 235 установленных пакетов.

Требования жёсткие: Apple Silicon, macOS 15 и новее, Xcode с iOS SDK, ослабленные SIP и AMFI. Одна команда vphone-cli vm create myphone -V jb проходит весь путь — скачивание прошивки, патч цепочки загрузки, восстановление через DFU и первую загрузку. Дальше vm clone делает быструю APFS-копию с новой идентичностью устройства, vm export пакует машину в архив.

На 29 августа у репозитория 8706 звёзд и лицензия MIT.

Практическая польза для мобильной команды: воспроизводимый стенд под баги, которые видны только на реальной ОС, и возможность отдать одинаковую машину каждому в команде вместо парка физических устройств.
❤‍🔥7👍7🤔1😱1
«ARM переставляет обращения к памяти, а x86 нет» — формула, которая неверна с обеих сторон

Если вы пишете многопоточный код под Android или iOS, то наверняка слышали объяснение: у ARM слабая модель памяти, процессор переставляет чтения и записи как хочет, поэтому нужны барьеры. У x86 модель сильная, порядок соблюдается, барьеры почти не нужны.

Фабиан Гизен показывает, что обе половины формулы неточны. За исключением совсем маленьких ядер без кэша, процессоры вообще не соблюдают собственную модель памяти на каждом обращении. Они обещают вести себя так, как если бы соблюдали. Реализуется это оптимистично: процессор считает, что данные никто параллельно не менял, выполняет обращения в удобном порядке и держит рядом ровно столько метаданных, чтобы задним числом заметить нарушение. Заметил — инструкция не фиксируется, состояние откатывается, дальше повтор.

Так устроены все архитектуры. Разница в том, сколько метаданных нужно на каждую инструкцию в полёте и какие порядки разрешено фиксировать при конфликте. Часто цитируемые 7% платы за аппаратный TSO на Apple Silicon Гизен отдельно оговаривает: это цена конкретной реализации, где TSO включается ради Rosetta.

В нашем канале «Сохранёнки программиста» разобрали подробнее.
👍2👎1
App Store 14 сентября сам изменит цены приложений — проверьте базовый регион

Apple обновила налоговые параметры App Store, поэтому часть разработчиков увидит другие выплаты и цены на региональных витринах. Изменения проходят в два этапа: сначала меняются суммы, которые получает разработчик, затем магазин автоматически корректирует цены.

С 27 августа выплаты пересчитаны для Марокко, Республики Конго и Танзании. В Марокко учитывается НДС 20%, в Республике Конго — НДС 18%, а налог на цифровые услуги в Танзании вырос с 2% до 3%.

С 14 сентября 2026 года App Store автоматически изменит цены приложений и встроенных покупок в Израиле, Индонезии, Марокко и Республике Конго. Исключение действует для региона, который разработчик выбрал базовым для своих цен. Автообновляемые подписки и цены, заданные вручную, пересчёт не затронет.

Перед 14 сентября разработчикам нужно проверить базовый регион и вручную заданные цены: от них зависит применение автоматической корректировки.
Эмулятор Android на Windows теряет свой гипервизор 31 декабря — проверьте, на чём он у вас крутится

У эмулятора Android на Windows два способа получить аппаратное ускорение. Первый — Windows Hypervisor Platform, встроенный в саму систему. Второй — Android Emulator hypervisor driver, отдельный драйвер от Google, который раньше назывался GVM и до сих пор стоит на многих машинах со стажем.

Второй уходит на покой 31 декабря 2026 года. До конца года на Windows нужно перейти на Windows Hypervisor Platform; пока срок не вышел, старый драйвер продолжает работать.

Переход попутно снимает старую боль: собственный драйвер Google конфликтовал с Hyper-V, а через него — с WSL2 и Docker Desktop. Windows Hypervisor Platform живёт с ними в одной системе.

Проверить, что у вас сейчас, можно одной командой. При стандартной установке SDK эмулятор лежит здесь:

%LOCALAPPDATA%\Android\Sdk\emulator\emulator.exe -accel-check

В ответе должно быть WHPX ... is installed and usable. Если вместо этого написано AEHD или GVM, включите Windows Hypervisor Platform в компонентах Windows и перезагрузитесь.

#android
👌2🎉1