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

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

По вопросам/рекламе: @dolgopolovdenis
Download Telegram
говорят, нужно под каждый праздник обновлять иконку приложения, чтобы пользователи чувствовали развитие приложения и понимали, что его еще не забросили

работает?)

p.s. до нового года осталось пару дней. а у меня как раз осталось несколько историй, которые не успел рассказать в течение года
🧊 Как у меня угнали telegram-аккаунт

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

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

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

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


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


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


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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
❄️ Плюс еще одна фобия

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

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

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


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

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

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

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
с новым годом! 🎁
желаю хорошо отдохнуть и потом еще раз хорошо отдохнуть ☕️
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥶 Как сохранить секрет в 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 строчку кода в 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
#️⃣ Кто виноват в том, что 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
☁️Оффлайн-встречи мобильных разработчиков уже в эти выходные!

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

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

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

🤖 Android | 📱 Mobile | 🍏 iOS

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

💃Также мы выкладываем интересные технические/полезные видосики в наш YouTube канал и записываем Подкаст! Ждем тебя на встречах!
🪩 митап

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

поговорю про подводные камни в проектировании API для SDK, о проблемах ABI и мажорных каскадных релизах 😵

также там будут крутые доклады коллег, слайды с картинками и кейтеринг -> подробности и регистрация

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🧬 Запрещенка в хэдерах

У каждого http-запроса и ответа есть заголовки (они же headers, они же мапка ключ-значений)

Но есть нюанс, о котором почему-то не написано красными большими буквами во всех гайдах по Retrofit/OkHttp


⚠️ не все символы можно класть в хэдеры (и cookie)


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


Актуальный список разрешенных символов можно найти в коде:

🔵okhttp3.Headers.checkValue()
🔵okhttp3.Headers.checkName()

сейчас это:

🔵для ключей: c in '\u0021'..'\u007e'
🔵для значений: c == '\t' || c in '\u0020'..'\u007e'

Например, в хэдере нельзя передавать знак рубля ₽ или иконки гендеров ♂♀ 🤬

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
#рекомендация

Есть такой канал про пока еще мобильную разработку – Everlasting Loops

В нём можно встретить как популярные вопросы с собеседований, так и неочевидные инсайты, особенности IDE-шного тулинга, контрибьют в Kotlin (ну… как-нибудь), или же просто фан-факты

А также почему ломается Unity, зачем котлину public и чего можно ожидать от лямбды

И сначала думаешь, что вроде бы шаришь, а потом хоп – и вот ты уже гуглишь, что это за guards

Если crossinline уже выучил
🧬 Стих

Осторожно, кринж 😳

Попросил нейросеть написать стих про Android-разработчика. Она выполнила задание с первого раза:


Fragment-осколки в ViewModel-реке,
LiveData танцует в Lifecycle-ручье.
Jetpack-крылами взлетает за грань,
Где Room хранит секреты, как древний талисман.

Dagger-остротой разрезает тьму,
Coroutines плетут асинхронную мглу.
RecyclerView — его ритмы-маски,
А в Stacktrace — тайный шифр Пизанской башни.

ANR-демоны грызут тишину,
Но Proguard-магия стирает войну.
CI/CD — его алхимия в бойне,
Чтоб APK стал цифровой иконой.

Flutter-соперник? Не страшен мираж —
Compose-канвасом он рисует пейзаж.
API-бездны покоряет в прыжке,
Где Firebase звёзды горят на песне.

Его Git-хроники — вечный полёт,
Где Merge Conflict — лишь тень на восход.
Android-магнат, в его коде — эпоха,
Сквозь NullPointer — к звёздам прорвётся вздох! 🚀

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🐌 Чек-лист замера перфа

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

🐌 Запуск приложения
🔵отдельный вопрос — откуда до куда мерить запуск, тут есть простор для творчества
🔵как минимум надо мерить Application.onCreate() и инициализацию библиотек

🐌 Открытие нового экрана
🔵момент от нажатия пользователем кнопки до отрисовки первого полезного UI-элемента
🔵часто включает в себя сетевой запрос на бэк — довольно рандомная по времени вещь
🔵желательно разбить эту метрику на подэтапы

🐌 Скорость сетевых запросов на бэк
🔵подготовка запроса и обработка респонса
🔵установка соединения (DNS/TCP/TLS)
🔵время отправки/чтения байтов по интернету
🔵время работы бэка (когда запрос уже отправлен, но ответ еще не начал считываться)
🔵загруженность установленных соединений (не пора ли увеличить connectionPool)
🔵процент попадания в кэш
🔵процент успешных запросов к упавшим
🔵размеры запросов

🐌 FPS — количество кадров, которые успевают отрисоваться в секунду
🔵интересны места, где идет просадка FPS

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

🐌 Картинки
🔵всё, как и для обычных сетевых запросов, но с разбиением по cdn-ам и форматам изображений

Еще что-то забыл?

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
✂️ trim()

Функция String.trim() вырезает пробелы в начале и в конце строки:

" а " -> "a"

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


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

И только после микроинсульта понимаешь, что это из-за лишнего пробела в названии " epic/123"


Или ищешь печеньки 🍪 в онлайн-магазине, а " печеньки" там нет, есть только "печеньки"

Или логинишься с помощью логина и пароля, а для аккаунта "терминатор6200 " почему-то логин не найден

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😄 Очепятка в стандарте

referer — стандартный хэдер для http-запросов

он показывает, откуда пользователь попал на страницу/в приложение

например, referer = google.com ознаечает, что пользователь попал на сайт/в приложение из гугла. полезная штука для аналитики


но забавно другое — слова referer не существует, правильное написание — referrer (с двумя rr)

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


например, Cronet (сетевой клиент от гугла для Android, iOS и не только) тупо вырезает хэдер referer 🧠 из запроса. При этом referrer спокойно дает отправить

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔓 Почему нельзя подключаться к публичным Wi-Fi в Макдональдсе?


С дества слышал, что подключаться к общественным Wi-Fi небезопасно. И это утверждение у меня никогда не билось с фактом "https трафик зашифрован, ведь s — это security" (ну или TLS/SSL)

Если весь трафик зашифрован умными алгоритмами, то какая-разница, через какие радиоволны подключаюсь к бэку? 🤯


Разгадка нашлась простая — проблема в атаке man in the middle (мужик в середине)


Это не какая-то конкретная уязвимость, а весь спрект потенциальных проблем

Имея доступ к роутеру, то есть находясь посередине между приложением и бэком, злоумышленник может попытаться:

🔵подменить DNS -> подменить итоговый IP сайта
🔵понизить соединение с https до http
🔵средиректить на произвольный url
🔵подменить публичный ключ шифрования (сертификат)


Естественно, все не так просто, и на произвольном сайте такое злодей не провернет. Нужно целое стечение обстоятельств, несколько допущенных дыр, чтобы любая из атак стала возможной. Но доступ к Wi-Fi, через который устанавливается соединение, повышает шанс этой атакой воспользоваться, ведь трафик льется через роутер как через прокси


А дальше начинается самое интересное — центры сертификации, разные версии SSL, шифрование трафика через VPN, дополнильные проверки IP браузером — огромный мир борьбы с мужиком в центре


Кстати проблема man in the middle справедлива и для мобильных приложений — существует не так уж много способов безопасно передать информацию между двумя приложеними, не дав кому-то посередине ее перехватить

@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM