Обновить

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

Сначала показывать
Порог рейтинга

Блогер с канала tech-it запустил трансляцию на YouTube, где он раскладывает и складывает новейший гибкий флагман Samsung Galaxy Z Fold 7. По его словам, он решил проверить заявление компании об устойчивости смартфона к сгибаниям до 200 тысяч раз. После 6 тысяч повторений смартфон перезагрузился, после 46 тысяч шарнир начал скрипеть, а после 75 тысяч складываний из шарнира начала вытекать «неопознанная жидкость». Эксперимент продолжается.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии4

Apple и Synchron показали, как Марк Джексон с мозговым имплантом может управлять iPad. Он получил мозговой имплант Stentrode, разработанный Synchron в сотрудничестве с Apple, и оптимизированным для работы с iPhone, iPad и Vision Pro. У Джексона боковой амиотрофический склероз, поэтому он не может пользоваться iPad руками. Но с помощью импланта он управляетпланшетом при помощи мыслей. Джексон может открывать приложения и писать сообщения, используя только свои мысли. Для управления используется протокол Switch Control, который воспринимает мозговой имплант за источник ввода. В текущей версии проект позволяет только нажимать на кнопки и писать текст. Имитировать прокрутку и пролистывать содержимое на экране нельзя.

Теги:
Рейтинг0
Комментарии0

Представлен бесплатный аналог Spotify без рекламы, без платных доступов и без подписок под названием SimpMusic, где треки можно слушать фоном, есть гигантская библиотека, персонализированные подборки, чарты и топы и полностью открытый код.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии3

Пользователь запустил Skyrim на Samsung S25+, чтобы охладить гаджет, смартфон пришлось положить в стакан с холодной водой. В комментариях умоляли положить смартфон в полиэтиленовый пакет. Но пользователь оказался непреклонен и твердо верит во влагозащиту IP68.

Процессор 45°C, аккумулятор 24°C. USB-концентратор с HDMI для внешнего монитора и адаптер для моего дешёвого контроллера. И, конечно же, блок питания.
Процессор 45°C, аккумулятор 24°C. USB-концентратор с HDMI для внешнего монитора и адаптер для моего дешёвого контроллера. И, конечно же, блок питания.
Теги:
Всего голосов 7: ↑7 и ↓0+8
Комментарии4

BPN vs MVM

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

В одном файле эта задача реализована в архитектуре BPN (Business Process Notation), о которой рассказывал раньше здесь. А во втором файле тот же код организован по архитектуре MVVM.

Код и в том, и в другом файле написан с помощью Claude Sonnet. В случае с BPN структурировал код вручную, следуя бизнес-процессам. А во втором случае попросил Клода сделать рефакторинг, используя традиционный современный подход и он выбрал MVVM.

Что можно сказать в итоге, сравнивая архитектуру в том, и другом случае. 

Объём кода

В BPN варианте 270 строки кода с комментариями, в MVVM - 524.

Т.е., в MVVM случае кода практически в 2 раза больше.

Количество сущностей, объектов.

BPN - один класс и 3 раширения к нему.

MVM - 6 классов, 1 структура, 3 протокола, каллбэки, фабрика, расширение.

Архитектура

BPN - монолит.

MVVM - вью и модель, анимация и аудио как сервисы, роутер, отдельная структура для хранения значений свойств и т.д.

Что лучше

Как всегда, каждый из подходов имеет свои плюсы и минусы.

В BPN нравится, что можно видеть модель процесса, в данном случае модель одной из задач приложения.

Что такое “Модель”

Наиболее традиционны 2 понимания термина “модель”.

В одном случае, это структура данных, модель объекта.

Например:

struct Person {

let firstName: String

let lastName: String

var age: Int

}

В другом случае, под моделью понимается всё, что не относится к интерфейсу.

Но есть и третье понимание модели - это модель приложения, или модель отдельных процессов внутри приложения. Т.е., составные части приложения (процесса) и их последовательность.

В BPN файле такая модель проступает наглядно:

Модель процесса "Обратный отсчет"
Модель процесса "Обратный отсчет"

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

В файале MVVM блоков кода гораздо больше и нужно несколько раз проскоролить чтобы увидеть их в выпадающем меню. И увидеть целостную модель здесь сложнее.

Conclusion

На относительно небольших проектах архитектура MVVM может быть избыточна. Здесь могут использоваться более простые варианты.

BPN позволяет видеть целостную модель задачи (процесса, приложения).

Теги:
Рейтинг0
Комментарии10

Ozon Tech открыл сразу несколько вакансий для QA mobile

Если хотите тестировать продукт, которым пользуются миллионы, — этот пост для вас. 

У нас несколько сильных команд, и вы можете выбрать ту, где ваш опыт даст максимум результата:

1. Приложение Курьер и Работа

Будете тестировать сразу два приложения:

  • Ozon Курьер Express помогает курьерам и водителям принимать экспресс-заказы и зарабатывать.

  • Ozon Job — приложение для соискателей, где можно найти склад, записаться на смену, посмотреть выплаты и тарифы.

Проекты молодые, без легаси — можно внедрять лучшие практики и выстраивать процессы с нуля.

2. Приложение Ozon

То самое, которым пользуетесь вы, ваши друзья и соседи. Через него проходит >90% заказов. Вы будете тестировать UI, логику, аналитику и пуши, следить за стабильностью релизов и качеством пользовательских сценариев. У нас отлаженная инфраструктура: автоматизация, фермы с эмуляторами, симуляторами и реальными девайсами.

3. Мобильная платформа

Фундамент всех приложений Ozon: библиотеки авторизации, аналитики, performance-метрики.  Вы будете проверять их стабильность, писать автотесты и автоматизировать процессы. Команды Ozon используют эти библиотеки каждый день — и от их качества зависит работа всей мобильной разработки.

Что общего во всех командах:

— Кроссплатформенная автоматизация на Python и Appium. 

— Сложные, нетривиальные задачи — как в ручном тестировании, так и в автоматизации. 

— Фичи, которые вы тестируете, видят миллионы пользователей — включая ваших друзей и родных. 

Выбирайте продукт и откликайтесь на сайте. 

🔗 Другие вакансии в Ozon Tech

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Tesla добавила окошко с чаевыми в мобильное приложение своего роботакси. Предложение оставить «на чай» появляется на экране во время оценки беспилотной поездки. Если пользователь захочет перевести деньги, то приложение запустит картинку с дикобразом в солнцезащитных очках и кожаном костюме с подписью, что это шутка.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии3

Бывший генеральный директор Google призывает сотрудников компаний выключать смартфоны, чтобы сосредоточиться на работе или расслабиться.

Шмидт рассказал, что исследователи и разработчики «не могут глубоко мыслить», когда их смартфоны постоянно вибрируют от уведомлений. Ветеран технологий, который 10 лет руководил Google и участвовал в разработке системы уведомлений Android, признал, что индустрия пытается «монетизировать внимание клиентов» с помощью постоянной рекламы и оповещений.

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии1

🎲 Retrofit 3.0 — что изменилось?

При поддержке блога @dolgo_polo_dev

Вышел Retrofit 3.0. А точнее в один день вышло 2 версии — Retrofit 3.0 и 2.12

Библиотека важная, поэтому попробовал разобраться, что изменилось

Самое интересное случилось в 2.12 — добавили стриминговую сериализацию из Kotlin/Java-классов в Json/Protobuf

Зачем это нужно было?

➡ чтобы большие классы не сериализовывались целиком перед отправкой запроса, а начинали это делать во время передачи данных на бэк

Это позволит чутка снизить нагрузку на процессор и оперативку, если

  • передаете объемные данные в теле запроса (1 мегабайт+)

  • где-то вызываете Retrofit.Call.enqueue() с главного потока — стриминг перенесет сериализацию с главного UI-потока в бэкграунд

Чтобы изменения заработали, нужно создавать конвертер с помощью функции withStreaming()

MoshiConverterFactory.create(moshi).withStreaming() // пример

В Retrofit 3.0 просто апнули версию OkHttp (3.14.9 -> 4.12.0). И немного поправили внутреннего кода, пару строк для совместимости с 4.12.0

Так что если обновите версию Retrofit, у вас транзитивно апнется OkHttp — будьте внимательны, берегите себя и своих тестировщиков

Из хороших новостей — Retrofit 3.0 формальный мажор, то есть бинарно совместим с предыдущими версиями (по словам разработчиков). Мажорное версию апнули для хайпа, чтобы подчеркнуть обновление OkHttp

Пруфы:

остальные посты про Android публикую в https://t.me/dolgo_polo_dev

Теги:
Рейтинг0
Комментарии0

За создание аниме-аватаров для чат-бота Grok в xAI платят до $440 тыс. в год. Разработчику нужно создавать реалистичных ИИ-аватаров, вовсю тестировать геймплей во всех ситуациях и работать с голосовыми командами. Требования — Python, Rust, WebSocket, WebRTC и опыт работы iOS.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Основа Kotlin K2 компилятора — это FIR‑дерево (Frontend Intermediate Representation).

Вкратце: FIR — это AST (абстрактное синтаксическое дерево), обогащённое семантической (смысловой) информацией. Оказывается, что у этой основополагающей технологии есть своя небольшая документация: fir‑basics.md и в той части, где написано про контракты указано (в моём вольном переводе), что:

Компилятор разрешает использовать контракты в свойствах, функциях и конструкторах классов

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

А где находится то самое ограничение на использование контрактов вне функций описал Android‑разработчик Виталий Перятин в новой статье о Kotlin Contracts, где он поделился любопытными моментами, которые удалось накопать самостоятельно, потому что как парсится список эффектов, как работает новый Contracts API изнутри, и почему, чёрт возьми, на уровне компилятора можно использовать контракты не только на уровне функций, в доках не пишут.

Теги:
Рейтинг0
Комментарии0

Как я случайно сделал ферму в Telegram с помощью ИИ

— История одного бота, картошки и чёртовой тыквы

Всем привет. Я — человек, который однажды хотел просто сделать прикольного бота в Телеграме, а в итоге... выращивает капусту, торгует молоком и организует тыквенные войны.

Но началось всё, как ни странно, с Таро. Да-да, карт Таро. Тех самых.

Первая попытка: гадать и страдать

Где-то в начале года я решил сделать Telegram-бота, который бы умел раскладывать карты Таро, делать натальные карты и выдавать предсказания на день. Казалось бы, звучит просто. Особенно если рядом есть ChatGPT, который может на ходу генерировать описания карт и писать код на Node.js.

Зарядка с утра: — GPT, напиши функцию для расчёта Луны в Скорпионе. — GPT, как сделать inline-кнопки в grammY? — GPT, почему Heroku опять всё уронил?

И вот бот заработал. Люди заходят, тянут карту дня, шлют благодарности… и уходят. На следующий день — снова тяни карту. Через неделю — всё. Надоело.

Я понял: бот с Таро работает, но удержать людей в нём сложно. Там нет жизни. Там нет... морковки.

А потом я вспомнил старую ферму

Когда-то, ещё во времена динозавров и ВКонтакте, у меня была ферма. Та самая, где каждый день надо было заходить, собирать урожай, сажать заново, а если не успеешь — тебя вытопчут друзья с соседнего класса.

И вот я подумал: а что, если скрестить эту старую добрую механику с Telegram-ботом?

Чтобы всё было просто:

  • Никаких установок

  • Играть можно прямо в чате

  • И чтобы всегда был шанс насадить кукурузу, а не просто наслаждаться жизнью

Начало новой жизни

Запустил первого бота. Добавил регистрацию, посадку капусты и сбор. Подключил базу PostgreSQL. Всё это — руками и с подсказками ИИ (да здравствует Cursor AI, GPT и граммY).

Первый баг — бот забывал, что ты уже посадил картошку. Второй баг — тыква, которую почему-то можно было доить. Третий баг — не баг, а фича: игроки начали просить рынок, коров и возможность топтать грядки друг другу.

Так появилась Веселая Ферма — ферма прямо в Telegram, которая сейчас уже живёт своей жизнью, где игроки сажают растения, разводят скот, воруют другу у друга лимоны и спорят в чате, почему мед дешевле мотыги.

Что дальше?

Это только начало. Я хочу рассказать:

  • Как ИИ помогает не сойти с ума, когда у тебя 500+ игроков и баг в 3 ночи

  • Как запускались тыквенные фестивали и почему это был трэш

  • Как устроен баланс в экономике фермы

  • И как создать клановую систему, когда никто не читает туториал

Если интересно — подписывайся на продолжение. А если хочешь сам потыкать бот — вот: 👉 Веселая Ферма

Следующая часть будет про то, как я балансировал экономику в игре, используя google sheet, интуицию и крик в подушку, почему Доярка Жанна названа в честь жадной хозяйки квартиры, и откуда взялся Председатель СНТ в образе Якубовича.

Теги:
Всего голосов 7: ↑3 и ↓4+1
Комментарии5

Как ускорить Android-разработку и избавиться от мучительно долгих запусков эмуляторов ради простого теста? 

Ответ — Robolectric — мощный инструмент для UI‑тестирования Android‑кода без эмулятора. 

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

В Android‑комьюнити у Robolectric неоднозначная репутация из‑за трудностей совместимости с другими библиотеками. Но…его почти бесценные возможности пробудили любопытство и желание копнуть глубже и осмыслить этот инструмент. 

Так и родилась статья «Мечтают ли андроиды о Robolectric? Разбираем фреймворк по косточкам» от Павла Нестеренко, нашего Android-разработчика.

Если вы устали ждать, пока эмулятор запустится, и хотите гонять юнит-тесты за секунды прямо в JVM, то рекомендуем статью к прочтению!

Теги:
Рейтинг0
Комментарии0

Ближайшие события

⚡️Вести с полей - Duit

Новый релиз - flutter_duit v3.6.0!

Что внутри:

⚙️ Новые виджеты: Offstage, AbsorbPointer, AnimatedCrossFade, AnimatedSlide, PhysicalModel, AnimatedPhysicalModel, CustomScrollView, SliverPadding, SliverFillRemaining, SliverToBoxAdapter, SliverFillViewport, SliverOpacity, SliverVisibility, SliverAnimatedOpacity, SliverSafeArea, SliverOffstage, SliverIgnorePointer, SliverList, SliverAppBar, FlexibleSpaceBar and SliverGrid (+21)

⚙️ Улучшен механизм передачи текущих значений анимации дочерним виджетам AnimatedBuilder

⚙️ Исправлен баг сепаратора в виджете ListView.separated, который не уничтожался правильно

⚙️ Значительно улучшено покрытие юнит-тестами критических участков кода (с 27% до 64%)

📖 Обновленная документация

Подробности о самом интересном:

⚡️Самое большое обновление виджетов! В этом важном релизе были добавлены сливеры - важная часть Flutter, без которой зачастую сложно реализовать высокоэффективные эффекты скролла.

🚀 Duit v4: производительность и простота. Анонсирую начало масштабных работ над мажорным обновлением проекта. Упрощение кодовой базы, решение проблем производительности, переосмысление дизайна DSL и надежная валидация входящих параметров - это лишь малая часть грядущего большого обновления!

Поддержать проект:
Кодом
Денежкой
TG канал DUIT

Теги:
Рейтинг0
Комментарии0

Save the date: 4 июля встречаемся на Android Meetup!

В программе доклады от спикеров Wildberries & Russ и Альфа-Банка, Q&A-сессия с розыгрышем мерча, нетворкинг и фуршет для классного завершения вечера.

Поговорим о том, как оживить виджеты, подружить Compose с Koin и навигацией, а заодно встроить одно Android-приложение в другое без боли...или с болью:

«Виджеты на Android: это просто?»
Александр Гирев, Android Team Lead продуктовой команды WB Partners

«Compose+Koin+JetpackNavigation: что мы поняли за 2 года»
Арсений Шпилевой, Android-разработчик кор-команды WB Partners

«Интеграция Android-приложений: подходы и лучшие практики»
Абакар Магомедов, главный техлид разработки в Альфа-Банке

Когда: 4 июля 18:00 (сбор гостей с 17:00)
Где: Москва, пространство Весна + онлайн-трансляция

Регистрация уже открыта — присоединяйтесь онлайн или офлайн!

Теги:
Рейтинг0
Комментарии0

релизнул версию 2.3.0 mcp для flutter - добавил многомелкихфиксов + возможность сохранять скриншоты как файлы как workaround для RooCode issue

Ещё добавил setup для RooCode - оказалось что похоже что RooCode не поддерживает анализ images в responses от mcp сервера.

А ещё - впервые коммьюнити отметили 100 звездочками репозиторий🎆 надеюсь что кто-то действительно пользуется:)

Теги:
Рейтинг0
Комментарии0

Telegram запустил конкурс для разработчиков под Android. Призовой фонд: $50 000. Срок сдачи работ: 11 июля, 23:59 по дубайскому времени (UTC+4). Объявление итогов: июль 2025.

В дополнение к призовым, победитель конкурса сможет присоединиться к команде Telegram в Дубае и зарабатывать 1 миллион долларов в год после вычета налогов.

Задача: Внедрить обновлённый интерфейс профилей в приложение Telegram для Android в строгом соответствии с предоставленным дизайном.

Полные условия конкурсного задания, технические подробности и макеты представлены в отдельном канале платформы.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Вы - начинающий разработчик под Андроид или просто пишете "для себя" и решили отображать динамическую анимацию через SurfaceView. Например, взяв за основу вот этот код или похожий. Вы разместили SurfaceView или его наследника (у меня MySurfaceView) в activity layout:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activityMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <agalilov.doppler.MySurfaceView
        android:id="@+id/dopplerView"
        android:background="#040947"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="15dp"
        app:layout_constraintBottom_toTopOf="@+id/btnStartStop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnStartStop"
        android:layout_width="118dp"
        android:layout_height="56dp"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="16dp"
        android:text="@string/start"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/dopplerView" />

</androidx.constraintlayout.widget.ConstraintLayout>

Запускаете приложение и... ничего не работает: SurfaceView не меняется, картинки нет! Ошибок тоже нет, код рисования выполняется впустую.

Я провёл почти всю ночь, разбираясь в причине. Оказалось, для SurfaceView, который размещён внутри другого View, по-умолчанию используется z-order "позади" родительского View. Это поведение, документированное в разных источниках, оказалось для меня неожиданным.

Лечится просто: при инициализации (в конструкторе класса-наследника) SurfaceView устанавливаем setZOrderOnTop(true):

public MySurfaceView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
    setZOrderOnTop(true);
    . . .
}

Вот такая история :)

Теги:
Всего голосов 5: ↑5 и ↓0+7
Комментарии0

Часть 2: итоги недели разработки вайбкодинга с агентами

Прошлый пост тут

1️⃣ Текущий прогресс по xsoulspace.dev привел к тому, что обнаружил что есть закономерность какие именно модели хороши для использования в проектировании layout страницы (спойлер - не записал какие 🤦‍♂️ кажется использовал Claude 4.0 thinking + Gemini 2.5 Pro).

Что попробовал сделать : нарисовал простой wireframe image -> сконвертировал в ACSII art, и затем скормил LLM для более корректного восприятия layout.

Оказалось что так проще, но относительно (за счет убирания лишних элементов проще понять что где расположено), но с другой стороны LLM все так же тяжело воспринимать layout (если он чересчур кастомный).

2️⃣обновил все flutter библиотеки, last answer, word by word, budget app до flutter 3.8 - пользовался агентами в окошках. В некоторых случаях правил руками, но в большей части работал по принципу PDSA (Plan Do Study Act), где я разрабатывал план, а агент по нему шел, потому изучал результаты и т.д.
Вывод - нужно сильнее нарабатывать промпты.

3️⃣внезапно получил спам-рассылку-письмо с возможностью потестить on device API для того чтобы запускать модели. Чтобы потетстить решил запилить новое приложение для работы с промптами - действовал по принципу:

  1. Идея и этические принципы

  2. Палитра и дизайн система на основе идеи и принципов

  3. План работы

  4. Имплементация через агентов + доп ресерчи чтобы агенты понимали какую информацию брать.

Удалось собрать прототип за 12 часов (рабочую, включая все экраны и дизайн систему). Следующий этап - буду модифицировать чтобы можно было тестировать на реальных промптах в проектах.

Опыт: понял как создавать и работать с ролями (опишу в следующем посте про MVP), разобрался как запускать LLM на устройстве.
Недостатки: нужно более точно прописывать тех стак, особенно ключевые места, такие как - синхронизация данных, тип хранилища и т.д. И хорошо если изначально можно давать wireframes, или подгенеривать на основании дизайн системы.

Хотелось сделать нечто среднее между игрой и обычным интерфейсом, но пока не получилось.

4️⃣Создал детальный план и начал прорабатывать новую систему сохранения данных. Для меня это оказалось большой проблемой - потому что Hive, Isar на flutter перестали поддерживаться, а другие библиотеки неудобно использовать (где-то перешел на Sembast).

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

Поэтому решил объединить все идеи и написать одну библиотеку которая будет из коробки давать синхронизацию с гитом, github и папками. Так надеюсь удастся побороть проблему долговечности и надежности хранения данных.
Пока агенты имплементировали 4 этапа из 5 (основную логику провайдеров данных), и как итог - собрал отдельное тестовое приложение (todo), чтобы протестировать работу (отдельный скриншот), понять недостатки и как можно быстрее завершить библиотеку чтобы начать интеграцию во все проекты. Это важно, потому что при одновременной интеграции сразу будет понятно что работает, а что нет, и таким образом будет проще получать feedback и развивать библиотеку качественно.

Спасибо за ваше время и хорошего дня!

p.s.:

Бумаги которые claude нашел по теме и одновременно не по теме)

Теги:
Всего голосов 4: ↑2 и ↓20
Комментарии0

Google опубликовала ролик в рамках своей юмористической рекламной кампании Best Phones Forever с «диалогом» между персонифицированными смартфонами Pixel и iPhone. Повествование разворачивается вокруг анонсированных Apple «прорывных» функций iOS 26, которые, по задумке Google, на самом деле уже давно доступны пользователям Pixel.

В видео iPhone перечисляет «новые» возможности операционной системы Apple: перевод сообщений и звонков в режиме реального времени, интеллектуальный отбор вызовов и умное удержание. Выясняется, что аналогичный функционал появился на устройствах Pixel еще пять лет назад, что ставит под сомнение новизну представленных Apple решений.

Теги:
Рейтинг0
Комментарии1