Dolgo.polo Dev | Денис Долгополов – Telegram
Dolgo.polo Dev | Денис Долгополов
2.28K subscribers
87 photos
2 videos
120 links
Разбираемся в мобильной разработке (Android/iOS) и пытаемся выяснить, зачем оно так устроено

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

По вопросам/рекламе: @dolgopolovdenis
Download Telegram
🧬 Загадка на логику

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

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

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

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

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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
110🦄4🤯2
🧬 Ваше устройство украли — мы его заблокировали

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


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

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


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

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

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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
9🤯14😁12👍54
🧬 Фоновые процессы теперь более заметны

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

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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍14🦄64🤔1
This media is not supported in the widget
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3216👍3🦄2👎1🔥1👏1
🧬 Жизнь это сложно

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

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

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

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

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

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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
22🗿8😁6🌭6🤣2💔2🦄2
🧬 Как OkHttp-клиент выполняет сетевой запрос

Выступал тут на DevFest, у меня оттуда остался один полезный слайд про OkHttp-клиент

Коротко:

OkHttp-клиент — самый популярный сетевой клиент на Android, поверх которого часто используют Retrofit

Главное — он умеет много всего из коробки


🔵записывать/читать кэш, управлять им с помощью хэдера cache-control
🔵управлять cookie и разруливать их атрибуты
🔵устанавливать соединение по http1 и http2 (а по http3 нет, завидуем iOS-разработчикам)
🔵выбирать сеть, по которой будет выполнен запрос
🔵работать с DNS и направлять трафик через Proxy
🔵выполнять сам запрос, то есть как раз передавать байты по интернету. при этом "движок", выполняющий запрос, можно подменить

А возможно это все благодаря Interceptor-ам — цепочке колбеков, позволяющих прочитать/изменить запрос и ответ

Вы можете написать кастомные Interceptor-ы и добавить их в список appInterceptor-ов или networkInterceptor-ов

Или можете залезть в исходники OkHttp и посмотреть на его стандартные Interceptor-ы, в которых как раз и реализована вся вышеперечисленная магия

На картинке:
🔵отличия между appInterceptor-ами или networkInterceptor-ами
🔵стандартные OkHttp Interceptor-ы и их роль

full hd картинка в комментариях

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍31🔥1533
🔗 Какая 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
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍328
🧬 Фингерпринт

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

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

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


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

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

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

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


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


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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥94
🧬 Как правильно тестировать приложение


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

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

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

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

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

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

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

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

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

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


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

🤡🤡💩

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁78👍14🍾97🏆4👏1🦄1
🧬 Сломанный UX как защита от дурака

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


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

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


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

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


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

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

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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27🦄96👍3
🪐 WebView в фоне

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

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

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

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

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

....

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥32❤‍🔥6👍41
🧬 Глобальный откат WebView в 2021 году

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


Немного контекста:

android.webkit.* (WebView) — это java-классы, которые мы используем для взаимодействия с WebView. Являются частью Android SDK

Chromium — это нативный движок, к которому обращаются java-классы WebView через JNI (Java Native Interface) и который выполняет всю основную работу

главное — Chromium обновляется отдельно от AndroidSDK (вендором или через Play Market в рандомный момент)


Дело было в 2021 году:

Google выпустил обновление движка Chromium на пользователей. А он сломанный

И у всех гигантов (Gmail, Amazon...) стала крашится WebView в приложении

Помогало одно — откатить WebView через Play Market (или ждать обновления от гугла)

Конец


Кстати, если вам мало боли с WebView в жизни, то в Play Market можно скачать Canary и Beta сборки WebView (Chromium) и переключиться на них. На картинке отзыв на Сanary сборку. Она обновляется, внимание, ежедневно

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😎8🔥6🤣5👍1
💎 Приложение просыпается чаще, чем вы думаете

Возможно я проспал этот момент на начальных уроках по Android, но

🔵Application.onCreate() вызывается чаще, чем пользователь запускает приложение

То есть прям гораздо чаще

Например, если приходит пуш, приложение запускает фоновую работу или система решает прогреть приложение для быстрого запуска — вызовется Application.onCreate()


Вывод:

🔵тригером для части логики может служить не Application.onCreate(), а первый вызов Activity.onCreate() (если эта логика нужно только для кейсов, когда юзер действительно открыл приложение)

Например, возможно ваше приложение логирует открытие приложения в Application.onCreate(), а по факту пользователь его не открывал, и у вас совершенно фейковые представления о DAU 💵

Или, возможно, из Application.onCreate() можно выкинуть инициализацию части библиотек, который не нужны без фактического открытия приложения пользователем

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥14😎5❤‍🔥1🦄1
🧬 Лизенции на опенсурс

Судьба заставила поразбираться в лицензиях на опенсурс, сейчас расскажу, что узнал

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


🔵можно ли использовать код для коммерции
- да | нет | в каких случаях да, в каких нет


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


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


🔵совместимость лицензий
- например, ваш опенсурс проект распространяется по лицензии "А". и вы хотите в нем использовать другой опенсурс проект, распространяемый по лизенции "Б". нужно проверить, совместимы ли лицензии "А" и "Б". если нет, то нужно связываться с автором и решать вопросики


🔵в своем опенсурс проекте лицензию нельзя тежяло менять после релиза
- тут как с правилами использования сайта — для внесения изменений нужно согласие от всех, кто уже успел на них посмотреть


Бонусный факт:

все мы слышали про copyright (копирайт, авторское право) ©

но сущесвуте еще и copyleft (копилефт, авторское лево) — он изображен на картинке поста. если коротко, копилефт лицензиями называют те, которые "заражают" ваш проект и накладывают на него некоторые обязательства (например, выложить все внесенные изменения в опенсурс)


@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍41❤‍🔥1
#рекомендация

@rutheniumos частный канал об андроид-разработке с упором в безопасность

там выходят лонгриды о дырах в системе и посты о внутреннем устройстве андроида

С чего можно начать:
🔵Webview в Android 15 взгляд в будущее
🔵Как Android могут угрожать вашей конфиденциальности как использовать обои Android для слежки за пользователями
🔵Бесшовные обновления в OS Android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8🥰2❤‍🔥1🤡1
🧬 Буфер обмена

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

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


val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

clipboard.primaryClip.getItemAt(0)


Конечно, гугл предпринимает попытки повысить безопасность:

Начиная с Android 10, доступ к клипбоарду есть только в фореграунде

Начиная с Android 12, система покажет юзеру всплывашку, когда приложение что-то скопирует. Но только один-два раза, потом уведомление перестанет отображаться, чтобы не спамить


А вот рекомендации гугла по повышению секьюрности:

🤡 запретите установку вашего приложения на андроидах ниже 10 версии

🤡🤡 удаляйте скопированные данные из буфера по таймеру (вот куда пропадает инфа из буфера, у меня не шиза)

🤡🤡🤡 помечайте флагом ClipDenoscription.EXTRA_IS_SENSITIVE сенситив информацию (пароли, данные банковских карт....) это никак не повлияет на доступность этих данных, просто у злоумышленников появится удобный фильтр для поиска

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡73😁16👍7🔥31
говорят, нужно под каждый праздник обновлять иконку приложения, чтобы пользователи чувствовали развитие приложения и понимали, что его еще не забросили

работает?)

p.s. до нового года осталось пару дней. а у меня как раз осталось несколько историй, которые не успел рассказать в течение года
🔥11🏆7👍3❤‍🔥1🎉1
🧊 Как у меня угнали telegram-аккаунт

У меня был запасной аккаунт, склад мусора

В какой-то из вечеров, сидя на концерте, увидел сообщение: "Ваш код для входа в telegram: 12345. Никому не сообщайте его"

Ну, сказано-сделано, решил никому не сообщать. Как можно обмануть того, кто ничего не делает?

Тем более такие сообщения иногда приходят в любых соцсетях — может кто-то ошибся номером, может кто-то в тупую перебирает код-пароли на случайных номерах...


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


Поскольку доступ к аккаунту у меня остался, зашел в активные сессии и деактивировал все лишние. Пока думал, как такое могло произойти, и проверял, какие еще методы авторизации включены, кто-то снова запросил пароль и снова вошел в аккаунт


Это повторилось пару раз, пока не перевязал аккаунт к другому номеру


🤡 А теперь разгадка:

Аккаунт был привязан к номеру, симку с которым я кинул в шкаф около года назад, и благополучно про это забыл

Оператор вполне законно расторг со мной договор в одностороннем порядке (возможно даже уведомил меня об этом на тот номер) и продал этот номер кому-то следующему

Мораль — соцсети зло, надо их запретить

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😁35🤡114👎1🍌1🍓1
❄️ Как у меня (почти) угнали telegram-аккаунт №2

Это история уже про основной аккаунт. И она будет больше интересна владельцам каналов из-за специфичного вектора атаки


Как работает взлом:

1. В личку пишет рекламный менеджер бигтеха и предлагает прорекломировать их событие — обычная история

2. Общаетесь, обсуждаете дату и цену, торгуетесь — обычная история

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

3. Когда все обговоренно, просят банковские реквизиты — обычная история

4. Просят подтвердить факт владения каналом, пройти авторизацию в боте/на сайте — вот тут-то и вы и попались, молодой человек

В процессе авторизации через телегу вы случайно и крайне неявно предоставите не публичные данные об аккаунте (номер телефона, имя/ник), а полный или частичный доступ к аккаунту. Например, передадите права на публикацию постов, изменение списка администраторов канала, чтение переписок через telegram api...

Берегите себя и аккаунты своих близких

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯18😎5👍4🤝2🤡1