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

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

Регистрация в перечне РКН: https://tprg.ru/oVBP
Download Telegram
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👍6🤔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
Tinder вычистил keep-правила R8 — пользователей с медленным стартом стало на 47% меньше

В Android-приложении Tinder около 70% кода не оптимизировалось: R8 был включён, но keep-правила блокировали его работу, и никто не знал, какие именно. Новый R8 Configuration Analyzer это показал: главным виновником оказалось широкое правило -keep public class * { public protected *; } из внутренней библиотеки — оно накрывало зависимости по всему приложению, и даже в full mode оптимизировалось только 28% кода.

После чистки правил: пользователей, у которых приложение стартует медленно, стало меньше на 47%; размер загрузки упал с 86,6 до 61,5 МБ; доля воспринимаемых пользователем ANR снизилась с 0,35% до 0,28%; dex-файлов вместо 17 стало 11.

Analyzer входит в AGP 9.3: при release-сборке отчёт кладётся в build/outputs/mapping/release/configanalyzer.html, а без полной сборки его генерирует задача ./gradlew :app:analyzeReleaseR8Config (отчёт в build/reports/r8/). На старых AGP нужно сначала подключить свежий R8 и запустить сборку со специальным системным свойством — детали в статье.

Разбор в блоге Android Developers
👍4
Управляйте форм-фактором Android-эмулятора прямо из скрипта

Google напомнила о командах adb emu, которые складывают, поворачивают и меняют экран виртуального устройства из терминала. Они сразу возвращают управление оболочке, поэтому проверки адаптивной вёрстки можно встроить в сценарий или прогон тестов вместо ручной работы с Resizable Emulator и вместо запуска нескольких эмуляторов сразу.

adb emu fold складывает аппарат и включает внешний экран, adb emu unfold раскладывает и включает внутренний, adb emu rotate поворачивает устройство на 90 градусов по часовой стрелке. adb emu posture без параметра печатает доступные положения: 1 — closed, 2 — half-opened, 3 — opened; adb emu posture 2 ставит половинчатое, которое в блоге и называют режимом «столик».

adb emu resize-display печатает доступные пресеты — телефон, раскрытый складной и планшет под номерами 0, 1 и 2, — а adb emu resize-display 1 меняет размер на выбранный. Если эмуляторов несколько, нужный выбирается через adb -s <serial> emu <команда> <параметр>. Оговорка: Pixel Fold и Resizable AVD поддерживают только положения 1–3, на 4 и 5 вернётся KO: Failed to set posture.
Запускайте локальную Gemma 4 в Android Studio без облачных квот и передачи кода

Google выпустила стабильную Android Studio Quail 4 — финальный релиз линейки Quail. В IDE встроена открытая модель Gemma 4: она работает офлайн, не отправляет код наружу, не упирается в квоты по токенам и умеет вызывать инструменты, так что многофайловый рефакторинг можно гонять без сети.

Модель выбирается в селекторе агента или по пути Settings > Tools > AI > Model Providers > Gemma. IDE сама скачает, проверит и обновит веса, движок инференса уже встроен. Самые маленькие модели заводятся на 12 ГБ оперативной памяти, лучше всего работают машины от 32 ГБ.

В Quail 4 также предзагружены 23 готовых навыка Android: агент сам подключает подходящий для обновления Android Gradle Plugin до версии 9, профилирования, перехода на Navigation3 или адаптации интерфейса под разные устройства. Раньше их приходилось докачивать вручную, а вне IDE весь набор ставится командой android skills add --all.
Google блокирует обновления AnkiDroid: внешняя кнопка пожертвований может ударить и по вашему приложению

С 28 августа Google отклоняет обновления AnkiDroid из-за ссылки на пожертвования мимо биллинга Play. Если нарушение не устранят, 11 сентября приложение удалят из Google Play по всему миру, кроме Индии и России: там оно останется опубликованным.

AnkiDroid — бесплатное открытое приложение-карточки с 10 млн установок, которое развивают волонтёры. Внутри ничего не продаётся, деньги на разработку собирают через Open Collective — платформу для пожертвований; фискальным хостом выступает американская некоммерческая Open Source Collective со статусом 501(c)(6), то есть освобождением от налогов без налогового вычета для жертвователя. Решение налоговой службы США мейнтейнеры Google отправили, но в ответ получили, что организация от налогов не освобождена, без объяснения, почему такого статуса мало.

Ссылки на пожертвования из сборки для Play мейнтейнеры убирают в версии 2.24.X и пишут, что делают это под протестом. Альтернативы, которые перечислила Google: собирать пожертвования через биллинг Play, войти в американскую программу альтернативных платежей или в программу внешних ссылок. Если у вас в приложении есть кнопка «поддержать проект», статус некоммерческой организации сам по себе от этой политики не спасает: Google требует подтверждённого освобождения от налогов и приводит в пример 501(c)(3).
Проверьте Kotlin-проект по 224 граблям из реальной разработки

Разработчик maxrave-dev три года в одиночку создавал SimpMusic — открытый музыкальный клиент на Kotlin и Compose Multiplatform для Android, Windows, macOS и Linux. Рядом не было сеньора или ревьюера, поэтому каждую поломку он разбирал и записывал сам.

Теперь эти заметки собраны в kotlin-footguns: 224 markdown-документа под лицензией GPL. В каждом описаны симптом, механизм ошибки и команды для проверки своей кодовой базы; файлы подходят и человеку, и агенту-кодеру.

Среди примеров — два экземпляра из-за путаницы между activityViewModels и activityViewModel, исчезнувший из Windows 11 wmic, файлы ._*, мешающие подписи сборки на macOS, и транзитивный strictly, способный перебить BOM и вызвать NoSuchMethodError. Каталог охватывает JVM, KMP, DI, Compose, CI, упаковку и медиадвижки.
2
Firefox для iOS получил встроенный блокировщик рекламы, потому что полноценных расширений на iOS нет

Mozilla 1 сентября включила в Firefox для iOS блокировку сторонней рекламы и связанных с ней трекеров. На Android Firefox давно ставит uBlock Origin, но на iOS все браузеры обязаны работать поверх WebKit, и такой экосистемы дополнений, как на Android и десктопе, там не построить. Поэтому блокировщик встроен в само приложение и собран на Content Blocker API от Apple со списком EasyList.

По умолчанию функция выключена, включается в Settings, Browsing, Ad Blocker. Реклама, которую сайт отдаёт сам, объявления в поисковой выдаче и спонсорские ярлыки Firefox остаются, работает всё это поверх Enhanced Tracking Protection.

Для разработчиков под iOS это пример того, как ограничение платформы решается внутри приложения: Content Blocker принимает статические правила, а не код, поэтому с сервера можно обновлять только сами правила блокировки, а не логику.

Что ещё вошло в Firefox 155 для разработчиков и какие уязвимости закрыли, разобрали на сайте.
🔥42🤣2
Ушедшие из App Store бренды подхватили чужие приложения: под Max, Rutube и VK Видео нашли подделки

Стоит правообладателю исчезнуть из стора, и его запросы достаются кому угодно. Anti-Malware.ru 2 сентября сообщило о трёх приложениях в российском App Store, которые копируют названия и оформление Max, Rutube и VK Видео. Пресс-службы Max и «Газпром-Медиа» подтвердили, что не имеют к ним отношения.

RUTUBE: Video Player, по данным карточки в магазине, вышел 18 июня, через две недели после удаления официального Max, и к 2 сентября набрал почти 950 оценок со средней 2,6. Идентификатор пакета com.rutube.app, разработчик WARD WILLIAM. MaxMessenger лежит в магазине с ноября 2024 года и просто оказался в нужном месте выдачи.

Для разработчика вывод практический: имя разработчика и описание на карточке остаются тем немногим, что пользователь может проверить сам, а у Apple есть отдельная форма спора о контенте для правообладателей. Разобрали и что известно о каждом из трёх приложений.
3
Нормальный сервис пополнения Steam никогда не спросит пароль или код Steam Guard — только логин. Это правило стоит держать в голове перед тем, как искать способ закинуть деньги на баланс: мошеннических предложений вокруг темы хватает, а разница в комиссии между честными сервисами доходит до нескольких процентов.

Сравнили пять рабочих вариантов для российских аккаунтов. Два сервиса зачисляют деньги напрямую по логину за минуты, у одного из них ниже стартовая комиссия и есть промокоды. Ещё один — крупный маркетплейс с выбором продавцов и разными условиями по каждому. Другой умеет пополнять через продажу игровых предметов — медленнее, но может дать выгоду. Последний формально работает без своей комиссии, но за счёт конвертации можно потерять до 10%.

Для каждого способа расписали реальную комиссию, скорость зачисления и лимиты по сумме.
❤‍🔥2
У Intel-приложений на Mac остался один релиз macOS

Apple 1 сентября напомнила: с macOS 26.4 пользователь может увидеть уведомление при запуске приложения, которому нужна Rosetta, а macOS 27, релиз этой осени, станет последним, где Intel-код вообще запускается на Apple Silicon. Исключение одно, старые неподдерживаемые игры на Intel-фреймворках.

Если ваше macOS-приложение или его helper-процессы собраны только под x86_64, времени ровно один цикл системы. Проверка начинается с lipo -info на бинарнике, а проблемы обычно живут не в своём коде, а в зависимостях: нативные модули Electron, Python-колёса с расширениями, старые фреймворки. Xcode собирает universal binary по умолчанию, но CI и нотаризацию для такой сборки стоит перепроверить.

Тем, у кого ARM-версия давно есть, Apple советует напрямую уведомить пользователей на старой Intel-сборке. Чек-лист по шагам разобрали на сайте.
1
Google Play задерживал RTDN о покупках на два и четыре часа: платёж прошёл, а сервер узнал потом

Если подписку или покупку выдаёт сервер по Real-time Developer Notifications, посмотрите логи за 1–2 сентября. Разработчик показал две транзакции, где eventTimeMillis появился через 3 ч 55 мин и 2 ч 11 мин после оплаты, при том что девять соседних покупок получили событие за доли секунды. Доставка через Pub/Sub была быстрой, очередь пустой: задержка сидела внутри цепочки Google до доставки на сервер, а на каком именно этапе, автор доказать не может, потому что не сохранял publishTime.

Официальный инцидент Play Billing 1 сентября длился с 08:54 до 11:43 UTC, но по отчёту задержки были и после. Документация Google требует после RTDN проверять состояние через Developer API; наш вывод из этих цифр шире: клиент после покупки сам отправляет purchase token на сервер, сервер сразу подтверждает его через Developer API и не ждёт RTDN. Что залогировать, чтобы в следующий раз увидеть, где именно задержка, на сайте.
2👎1
Google собирает альянс вокруг цифровых удостоверений на Android и открывает под них SDK

Android Ready SE, программа сертифицированных защищённых чипов, запущенная в 2021 году, станет Android Digital Credential Alliance: производители чипов и Secure Element, OEM, разработчики кошельков и государственные эмитенты. Google одновременно опубликовала whitepaper о том, как устроена цепочка доверия для удостоверений на базе Android Keystore и StrongBox.

Цепочка из четырёх шагов: аттестация ключа, привязка к устройству, выдача по ключу с аутентификацией пользователя и авторизация действий. StrongBox работает в физически изолированном Secure Element уровня Common Criteria EAL4+ с AVA_VAN.5, а выпуск удостоверения гейтится биометрией или PIN через HAT-токены. Для разработчиков открыт Multipaz SDK с OpenID4VCI и OpenID4VP, форматами ISO 18013-5 mDL и SD-JWT VC и zero-knowledge proofs на Longfellow-ZKP; на нём же построены Google Wallet и референсный кошелёк European Digital Identity.

Для российских разработчиков это пока архитектурный ориентир, а не продукт: о доступности Google Wallet и государственных эмитентах в регионе Google не пишет. Публикация Google и whitepaper с архитектурой.
🤔3🗿1
Compose Multiplatform запустили на Apple TV одним Gradle-плагином, не дожидаясь JetBrains

Официальных tvOS-артефактов для большинства модулей Compose пока нет (задача CMP-5686). Саджид Али обошёл это плагином dev.sajidali.compose-tvos 1.3.0: через ComponentMetadataRule он подменяет варианты зависимостей 15 групп org.jetbrains.* (compose ui, foundation, runtime, material3, animation и другие) на свои tvOS-сборки, координаты в проекте не меняются, а iOS, Android и Desktop продолжают получать официальные артефакты.

Требования: Kotlin 2.3.20, Gradle 8.0, Compose Multiplatform 1.6 или новее; таргеты tvosArm64 и tvosSimulatorArm64, tvosX64 не собирается. Если официальный tvOS klib появится, плагин его не трогает. Автор говорит, что тем же тулчейном собирает свой production TV app без правок исходников; демо на JetStream TV с D-pad-фокусом есть в посте. Автотестов под tvOS у проекта пока нет, так что в прод только после своих.
👍2
Swiggy перевела гибридные экраны на Swift и SwiftUI, не останавливая выпуск фич

Индийский сервис доставки с аудиторией в миллионы пользователей начинал Instamart и Dineout как гибридные продукты, и при росте они упёрлись в знакомое: долгие загрузки, зависания на больших списках товаров, memory pressure и рваные анимации. Ограничения гибридной архитектуры не давали Dineout показывать качественные фото и видео.

Решение о миграции приняли в начале 2024 года, и главное в рассказе команды не «переписали всё», а порядок. Сначала нашли сценарии с наибольшим влиянием, домашние экраны и поиск, и выпустили их нативно за несколько недель. Дальше переводили по одному, параллельно продолжая выпускать функции. После миграции появились OCR для поиска по меню, сканирование списков продуктов и суммаризация с Apple Intelligence.

Цифр по конверсии и crash rate Apple не приводит, только слова команды об «самом большом сюрпризе» от эффекта. Разбор на Apple Developer.
Когда твой код идеален, но пользователи всегда найдут способ сломать его.
😁17💯3
AGP 9.4 поднял потолок до API 37 и предупредил: в AGP 10 новый Variant API станет обязательным

Android Gradle Plugin 9.4 минорный релиз, но с чек-листом на обновление. Требуется Gradle 9.6.0, JDK 17, Build Tools 36.0.0, NDK по умолчанию 28.2.13676358; совместим с Android Studio Quail 4, которая тоже стала стабильной 1 сентября.

Новое поведение: плагин проверяет строгое соответствие variant dimensions у dynamic feature модулей и базового. По умолчанию несовпадение даёт предупреждение, флаг android.enforceDynamicFeatureVariantMatching=true превращает его в ошибку. Главное на будущее: начиная с AGP 10 новый Variant API обязателен для всех проектов, до этого модули можно временно исключать через android.newDsl.optOut. Из исправлений: пропавший L8 obfuscation mapping в mapping.txt, ошибка «SigningConfig is too eager» и ClassNotFoundException в connectedDebugAndroidTest с provider в dynamic feature. Google просит не писать зависимость как 9.4.+.
Flutter-пакет выбирает интерфейс не по платформе, а по версии ОС: Liquid Glass на iOS 26, Material 3 Expressive на Android 16

Обычно адаптивные виджеты во Flutter спрашивают «iOS или Android». native_adaptive_ui добавляет второе измерение, DesignEra: платформа, версия ОС и форм-фактор. Один код на iOS 26 встраивает настоящие UITabBar, UISegmentedControl, UISwitch и UISlider, потому что честный Liquid Glass рисуется только нативным контролом, а на Android 16 переключается на Material 3 Expressive. iOS 18 получает классический Cupertino, web и десктоп fallback на Material 3.

Требования: Flutter 3.27 и новее, iOS 13+, Android API 21+, macOS 10.15+; инициализация через await NativeAdaptiveUi.ensureInitialized(), есть SPM и CocoaPods. Для тестов предусмотрены NativePolicy.dartOnly и debugSetPlatform. Версия 0.1.2, MIT, 125 загрузок и 3 лайка на pub.dev, то есть проект одного человека на ранней стадии.

Контекст важнее цифр: Flutter заморозил Material и Cupertino в SDK в апреле, а с ноября их SDK-копии объявлены устаревающими. Кто-то должен закрыть этот разрыв. Страница на pub.dev.