来自 Dolgo.polo Dev | Денис Долгополов (@dolgo_polo_dev) 的最新 Telegram 贴文

Dolgo.polo Dev | Денис Долгополов Telegram 帖子

Dolgo.polo Dev | Денис Долгополов
Разбираемся в мобильной разработке (Android/iOS) и пытаемся выяснить, зачем оно так устроено

Статистика/цены: @dolgo_polo_dev_stats

По вопросам/рекламе: @dolgopolovdenis
2,052 订阅者
43 张照片
91 个视频
最后更新于 11.03.2025 07:44

相似频道

Kotlin Developer
5,929 订阅者
Android Guards
3,588 订阅者

Dolgo.polo Dev | Денис Долгополов 在 Telegram 上分享的最新内容

Dolgo.polo Dev | Денис Долгополов

07 Nov, 18:40

3,138

🪐 WebView в фоне

Интересный небольшой факт — WebView может загружать страницы без отображения самой WebView на экране

Можно вызывать WebView(context).loadUrl(url) не отображая WebView на экране и не добавляя ее в верстку

С помощью этого можно:

🔵настроить prefetch страниц — загрузить страницы заранее в фоне, чтобы не мучать пользователя долгим открытием

🔵закэшировать страницы заранее (если включить кэш WebView и прислать хэдер cache-control)

....

еще по теме:
🔵WebView vs GeckoView vs ChromeTabs vs TWA

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

04 Nov, 12:30

3,068

🧬 Сломанный UX как защита от дурака

Наливал тут кипяток из автомата с водой. Режим "экстра горячая вода для чая" на нем включался только после выполнения сложного ритуала — покрутить колесико, зажать кнопку, пару секунд подумать, и только после этого кипяток начинал литься


Давайте подумаем, где такой же подход стоит использовать в приложении

Если действие потенциально опасно для юзера, нужно его когнитивно нагрузить, чтобы не удалось выполнить это действие на автомате


Как минимум — показать предупреждающий экран и попросить ввести пин-код

Хотя эти действия настолько обыденные, что обычно выполняешь их с той же легкостью, как открытие двери и выключение утюга


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

🔵потрясите телефон, если хотите удалить сообщение только у себя

🔵разгадайте капчу, если действительно хотите репостнуть этот аморальный мем в чат с родственниками, а не друзьями

🔵нажмите кнопки от 1 до 9, если хотите подключиться к звонку с включенной видеокамерой

Хороший пример кстати это флоу отмены подписки в яндексе. Случайно точно не нажмешь

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

04 Oct, 16:00

3,820

🧬 Как правильно тестировать приложение


Вместо флагмана новых поколей стоит взять в руки старенький инфиникс с поцарапанным экраном

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

На часах должно быть около 17:00-19:00 вечера, когда устройство в рандомный момент переключается с темной темы на светлую

Язык системы — персидский или японский, время системы строго не московское

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

В идеале в этот момент батарея должна быть практически разряжена, а в списке запущенных приложений обязан находиться Cyberpank 2077, открытый через эмулятор Windows 10, и десяток свернутых браузеров

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

Гугл сервисы отключаем, хуавей кстати тоже

Версия ОС должна быть либо достаточно старая, либо последняя — работать будут одинаково непредсказуемо

Память устройства при этом должна быть забита на 97%. Оставшиеся 3% нужны, чтобы ПЗУ закончилось в случайный момент


Подготовка на этом завершена, можно начинать тестирование

🤡🤡💩

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

25 Sep, 18:45

3,109

🧬 Фингерпринт

Многие вероятно слышали про фингерпринт браузера:

-> сложив пару десятков открытых данных о браузере/компьютере пользователя, можно с большой вероятностью идентифицировать пользователя

Такой же фингерпринт без труда можно собрать в мобильном приложении


Недавно узнал два интересных факта:

🔵в режиме инкогнито браузер даже не пытается запутать фингерпринт

🔵убедиться в этом можно на крутом сайте amiunique.org/fingerprint — он показывает, насколько ваш фингерпринт уникальный и не такой как все)

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


Например, в него входят настройки WebGL, высота системных UI-панелей, список установленных плагинов и поддерживаемых видеокодеков


мой фингерпринт уникальный 😎

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

21 Sep, 16:20

3,170

кстати напоминаю про эти папочки

список там постепенно пополняется 📝, как натыкаюсь на новые каналы

и хожу агитирую шарить по возможности) 🪐
Dolgo.polo Dev | Денис Долгополов

21 Sep, 16:20

3,349

🔗 Какая Activity открыта

Нашел для себя еще одну крутую комманду adb:

adb shell dumpsys window windows | grep 'mActivityRecord'
// в Windows grep можно заменить на find

Она показывает имя открытой Activity


сделал для нее alias:

adbAStack = "adb shell dumpsys window windows | grep 'mActivityRecord"


Например, с помощью нее вычислил название активити со списком свернутых приложений в системном лаунчере:

com.sec.android.app.launcher/com.android.quickstep.RecentsActivity

Теперь могу открыть это меню прямо через adb (зачем?) или сделать в приложении кнопку "открыть список свернутых приложений" (зачем??)


А если серьезно команда имба, так как по внешнему виду UI не всегда понятно, с какой Activity работаешь

еще про adb:
🔵как тапать хомяка через adb
🔵(habr) прикладное adb для зумеров

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

28 Aug, 16:04

3,368

🧬 Жизнь это сложно

Но еще сложнее следить за жизненным циклом

Одна из самых сложных штук в мобилке, хотя казалось бы

Во-первых, ЖЦ отличается у:
🔵Application
🔵Activity
🔵Fragment
🔵View
🔵не говоря уже о процессах, сервисах и тасках

Добавим влияние диалогов/шторок, частично перекрывающих экран

Дальше умножаем это на сложные экраны современных девайсов — раскладушки, двойные экраны, режимы окна к окне...

Складываем с рекомпозицией от Compose, если используете AndroidView внутри Compose или наоборот

И добавляем кейсы, когда быстро прокручиваешь навигацию вперед-назад, и все методы жизненного цикла от разных экранов-элементов вызываются не друг за другом, а в рандомном порядке

Готово, стало сложно 🧠

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

26 Aug, 16:03

2,752

🧬 Фоновые процессы теперь более заметны

Обратил внимание, что после обновления на Android 14 в списке запущуенных приложений начали отображаться запущенные процессы

"1 активный фоновый элемент"

Подозреваю, что туда попадают запущенные Service и, возможно, воркеры WorkManager-а

так что теперь у юзеров появляется дополнительная более явная возможность остановить фоновую работу

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

25 Aug, 09:11

2,492

🧬 Ваше устройство украли — мы его заблокировали

Гугл в начале мая анонсировал фичу Android Theft Protection


Если вор выхватит у вас телефон из рук и начнет с ним убегать, то экран автоматически заблокируется

Работает это на основе Google AI, который вероятно анализирует датчики акселерометра, gps и, возможно, камеры/микрофона (это уже мои догадки)


Вопросов эта фича вызывает больше чем ответов:

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

🔵начнут ли воры красть телефоны странно и нестандартно двигаясь, чтобы запутать ИИ

🔵сработает ли эта фича, когда девушка выхватывает телефон, чтобы прочитать твои переписки

🔵неужели уже можно дешево в фоне постоянно гонять ИИ, анализирующий датчики, не переживая за CPU/батарею?

@dolgo_polo_dev
Dolgo.polo Dev | Денис Долгополов

20 Aug, 11:02

2,927

🧬 Загадка на логику

Представьте, запускается приложение

В каком порядке будете инициализровать эти 4 библиотеки?

1️⃣ Sentry SDK — логирует ошибки, краши и ANR-ы

2️⃣ Auth SDK — хранит данные о юзере

3️⃣ UserTracker SDK — логирует действия юзера, в том числе события запуска

4️⃣ FeatureFlags SDK — стягивает фича флаги для А/Б

победителю — пятикратное ура 👍

@dolgo_polo_dev