говорят, нужно под каждый праздник обновлять иконку приложения, чтобы пользователи чувствовали развитие приложения и понимали, что его еще не забросили
работает?)
p.s. до нового года осталось пару дней. а у меня как раз осталось несколько историй, которые не успел рассказать в течение года
работает?)
p.s. до нового года осталось пару дней. а у меня как раз осталось несколько историй, которые не успел рассказать в течение года
🧊 Как у меня угнали telegram-аккаунт
У меня был запасной аккаунт, склад мусора
В какой-то из вечеров, сидя на концерте, увидел сообщение: "Ваш код для входа в telegram: 12345. Никому не сообщайте его"
Ну, сказано-сделано, решил никому не сообщать. Как можно обмануть того, кто ничего не делает?
Тем более такие сообщения иногда приходят в любых соцсетях — может кто-то ошибся номером, может кто-то в тупую перебирает код-пароли на случайных номерах...
После концерта достаю телефон, а имя аккаунта уже сменилось + появился чат со службой доставки, куда активно отправляются сообщения с целью зарегистрировать курьера на этот аккаунт
Поскольку доступ к аккаунту у меня остался, зашел в активные сессии и деактивировал все лишние. Пока думал, как такое могло произойти, и проверял, какие еще методы авторизации включены, кто-то снова запросил пароль и снова вошел в аккаунт
Это повторилось пару раз, пока не перевязал аккаунт к другому номеру
🤡 А теперь разгадка:
Аккаунт был привязан к номеру, симку с которым я кинул в шкаф около года назад, и благополучно про это забыл
Оператор вполне законно расторг со мной договор в одностороннем порядке (возможно даже уведомил меня об этом на тот номер) и продал этот номер кому-то следующему
Мораль — соцсети зло, надо их запретить
@dolgo_polo_dev
У меня был запасной аккаунт, склад мусора
В какой-то из вечеров, сидя на концерте, увидел сообщение: "Ваш код для входа в telegram: 12345. Никому не сообщайте его"
Ну, сказано-сделано, решил никому не сообщать. Как можно обмануть того, кто ничего не делает?
Тем более такие сообщения иногда приходят в любых соцсетях — может кто-то ошибся номером, может кто-то в тупую перебирает код-пароли на случайных номерах...
После концерта достаю телефон, а имя аккаунта уже сменилось + появился чат со службой доставки, куда активно отправляются сообщения с целью зарегистрировать курьера на этот аккаунт
Поскольку доступ к аккаунту у меня остался, зашел в активные сессии и деактивировал все лишние. Пока думал, как такое могло произойти, и проверял, какие еще методы авторизации включены, кто-то снова запросил пароль и снова вошел в аккаунт
Это повторилось пару раз, пока не перевязал аккаунт к другому номеру
Аккаунт был привязан к номеру, симку с которым я кинул в шкаф около года назад, и благополучно про это забыл
Оператор вполне законно расторг со мной договор в одностороннем порядке (возможно даже уведомил меня об этом на тот номер) и продал этот номер кому-то следующему
Мораль — соцсети зло, надо их запретить
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Это история уже про основной аккаунт. И она будет больше интересна владельцам каналов из-за специфичного вектора атаки
Как работает взлом:
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
Очень интересная паста о том, как зашить секретную строку в приложение так, чтобы ее нельзя было вытащить за 1 секунду, используя обычный поиск внутри файлов
Например, вы решили спрятать свой ключ от биткоин-кошелька в apk
Что можно попробовать и что из этого выйдет:
Просто положить строку в val/var/const string или в strings.xml — строка попадет в apk в неизменном виде
Разбить строку на байты и положить в массив byte[] — строка попадет в apk в неизменном виде (случилась оптимизация при компиляции)
new byte[]{'x','y','z'} -> "xyz"
Положить строку в BuildConfig — строка попадет в apk в неизменном виде
Натравить Proguard/R8 на класс со строкой — строка попадет в apk в неизменном виде, proguard меняет только название переменных, но не их значение
Положить зашифрованную строку (например, в base64/sha254...) и декодить ее динамически — вот это уже сработает, за 1 секунду можно будет найти только зашифрованную строку
"eHl6".decodeBase64() -> "xyz"
Но еще за 3 секунды можно будет раздебажить алгоритм шифрования, найдя его в .dex-файлах
Зашить строку в нативный с++ код и обращаться к нему через JNI — строка попадет в apk в неизменном виде
Выводы:
@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
Тут надо было 1 строчку кода в 100 файлов добавить
Реально надо, так получилось
Как раньше я бы решил эту задачу:
Но я опытный разработчик. Поэтому скипнул все предыдущие шаги и за 3 минуты перекопировал строчку в 100 файлов вручную
@doglo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Чаще всего — нативные библиотеки, то есть 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 канал и записываем Подкаст! Ждем тебя на встречах!
😉Привет! На связи 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
Dolgo.polo Dev | Денис Долгополов
запись докладов
📱 в VK Видео
📱 на YouTube
всем, кто дошел оффлайн и смотрел онлайн, привет 😉
@dolgo_polo_dev
всем, кто дошел оффлайн и смотрел онлайн, привет 😉
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
У каждого http-запроса и ответа есть заголовки (они же headers, они же мапка ключ-значений)
Но есть нюанс, о котором почему-то не написано красными большими буквами во всех гайдах по Retrofit/OkHttp
Если на мобилке добавить в хэдер запрещенный символ или бэк пришлет такой символ, то сетевой запрос крашнется, выкинув исключение
Актуальный список разрешенных символов можно найти в коде:
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 уже выучил
Есть такой канал про
В нём можно встретить как популярные вопросы с собеседований, так и неочевидные инсайты, особенности IDE-шного тулинга,
А также почему ломается 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
Если хочется бороться за миллисекунды, то можно померить с помощью готовых или самописных решений следующие этапы работы приложения:
Еще что-то забыл?
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Функция 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
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
С дества слышал, что подключаться к общественным Wi-Fi небезопасно. И это утверждение у меня никогда не билось с фактом "https трафик зашифрован, ведь s — это security" (ну или TLS/SSL)
Если весь трафик зашифрован умными алгоритмами, то какая-разница, через какие радиоволны подключаюсь к бэку?
Разгадка нашлась простая — проблема в атаке man in the middle (мужик в середине)
Это не какая-то конкретная уязвимость, а весь спрект потенциальных проблем
Имея доступ к роутеру, то есть находясь посередине между приложением и бэком, злоумышленник может попытаться:
Естественно, все не так просто, и на произвольном сайте такое злодей не провернет. Нужно целое стечение обстоятельств, несколько допущенных дыр, чтобы любая из атак стала возможной. Но доступ к Wi-Fi, через который устанавливается соединение, повышает шанс этой атакой воспользоваться, ведь трафик льется через роутер как через прокси
А дальше начинается самое интересное — центры сертификации, разные версии SSL, шифрование трафика через VPN, дополнильные проверки IP браузером — огромный мир борьбы с мужиком в центре
Кстати проблема man in the middle справедлива и для мобильных приложений — существует не так уж много способов безопасно передать информацию между двумя приложеними, не дав кому-то посередине ее перехватить
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM