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

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

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

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

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

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


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

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

🔵убедиться в этом можно на крутом сайте 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
❄️ Плюс еще одна фобия

Мне тут скинули историю с пикабу:

Приложение онлайн-аптеки каждую ночь начало выкачивать по 25 ГБ трафика

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


Точных причин происшествия не нашел, есть только мое предположение:

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔16😱5🍾5👍4
с новым годом! 🎁
желаю хорошо отдохнуть и потом еще раз хорошо отдохнуть ☕️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥288👏3🍾3👍1😁1
🧠 Гайд, как контрить дедлайны

Нашел ветку в гитхабе, где разработчиков библиотеки OkHttp на протяжении 11 лет (с 2014 года!!) просят поддержать http3, а они сопротивляются

Короткий пересказ:
🔵http3 — это новая версия протокола http, которая позволяет сделать сетевые запросы чутка быстрее
🔵сейчас http3 на Android поддерживает только Cronet — либа от гугла

Разработчики OkHttp отказываются поддерживать http3, потому что это сложно:

I could write a basic implementation of HTTP/1 in about a week.
I could write a basic implementation of HTTP/2 in about a month.
I fear HTTP/3 is larger still; maybe 6 months of work?


потому что нет времени и интереса:

We don't have time or interest to have QUIC in trunk at this time


да и в целом потому что:

The only plan is there is no plan


Их стойкости можно позавидовать

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😁44👍18🔥3
🥶 Как сохранить секрет в apk

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

Например, вы решили спрятать свой ключ от биткоин-кошелька в apk

Что можно попробовать и что из этого выйдет:

1️⃣
Просто положить строку в val/var/const string или в strings.xml — строка попадет в apk в неизменном виде

2️⃣
Разбить строку на байты и положить в массив byte[] — строка попадет в apk в неизменном виде (случилась оптимизация при компиляции)

new byte[]{'x','y','z'} -> "xyz"


3️⃣
Положить строку в BuildConfig — строка попадет в apk в неизменном виде

4️⃣
Натравить Proguard/R8 на класс со строкой — строка попадет в apk в неизменном виде, proguard меняет только название переменных, но не их значение

5️⃣
Положить зашифрованную строку (например, в base64/sha254...) и декодить ее динамически — вот это уже сработает, за 1 секунду можно будет найти только зашифрованную строку

"eHl6".decodeBase64() -> "xyz"

Но еще за 3 секунды можно будет раздебажить алгоритм шифрования, найдя его в .dex-файлах

6️⃣
Зашить строку в нативный с++ код и обращаться к нему через JNI — строка попадет в apk в неизменном виде


Выводы:

➡️ спрятать секрет в apk — изначально идея, обреченная на провал
➡️ apk — это open source

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍28🔥14🍓3
🤌 Опытный специалист

Тут надо было 1 строчку кода в 100 файлов добавить

Реально надо, так получилось

Как раньше я бы решил эту задачу:
🔵поискал инструмент в студии, позволяющий это сделать
🔵не нашел бы его и загуглил бы "how insert code line in class constructor automatically"
🔵не нашел бы ответа и решил написать свой скриптик, который бы автоматизировал этот процесс
🔵через какое-то время мучений понял бы, что нужен не просто скриптик, а целый парсер, чтобы оно отработало даже в корнер кейсах
🔵пошел бы в GPT AI Capilot Code Generator, чтобы он помог мне в этой борьбе

Но я опытный разработчик. Поэтому скипнул все предыдущие шаги и за 3 минуты перекопировал строчку в 100 файлов вручную

@doglo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁105😎25👍21🔥11🏆87
#️⃣ Кто виноват в том, что apk весит 300мб?


Чаще всего — нативные библиотеки, то есть c/с++ либы, подключенные к приложению

Обычно их в крыcу транзитивно тянут различные Kotlin/Java SDK

🟣🟣🟣

Особенность NDK либ в том, что они генерируются под 4 архитектуры отдельно (armeabi-v7a, arm64, x86, x86_64). Поэтому в каждом apk по 4 копии одной c/c++ либы. Если либа весит 5 мегабайт, то в apk попадет 20 мегабатайт


Плюс си плюс плюс код довольно жирный, так как тянет вместе с собой кучу стандартного кода, необходимый для его выполнения. Например, если вы напишите 5 строчек c++ кода, то либа все-равно будет весить минимум 500кб

🟣🟣🟣

Нативные либы обычно используют библиотеки по работе с картами, картинками, безопасностью, камерой -> если у вас такое есть, то вероятно в вашем приложении уже есть нативные либы

🟣🟣🟣

Топ-2 виновник размера apk — png картинка для экрана "О приложении" конечно

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33🍌5🤣4👍3
☁️Оффлайн-встречи мобильных разработчиков уже в эти выходные!

😉Привет! На связи Coffee&Code — международное сообщество мобильных разработчиков.

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

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

🤖 Android | 📱 Mobile | 🍏 iOS

📍СПИСОК ГОРОДОВ

💃Также мы выкладываем интересные технические/полезные видосики в наш YouTube канал и записываем Подкаст! Ждем тебя на встречах!
🔥7👍53👏2😍2