Dolgo.polo Dev | Денис Долгополов (@dolgo_polo_dev)の最新投稿

Dolgo.polo Dev | Денис Долгополов のテレグラム投稿

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

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

По вопросам/рекламе: @dolgopolovdenis
2,052 人の購読者
43 枚の写真
91 本の動画
最終更新日 11.03.2025 07:44

類似チャンネル

Kotlin Developer
5,929 人の購読者
Yandex for Mobile
3,495 人の購読者
The Daily Kotlin
1,607 人の購読者

Dolgo.polo Dev | Денис Долгополов によってTelegramで共有された最新のコンテンツ

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

08 Aug, 19:30

3,771

🧬 Кросс-платформа

Пошла волна 🌊 хейта в сторону кросс-платформы (раз, два), а у меня на эту тему давно черновик лежит)

Давайте так:

Все последнее время топят за кросс-платформу

А какие в ней плюсы для разработчиков?

Вы куда воюете?

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


А для простых работяг:

🔵уменьшение рабочих мест

🔵нужно ботать новые технологии

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

🔵x2 времени на сборку проекта, x3 проблем с кэшами студии, x4 сломанных джоб на CI

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

🤡🤡💩

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

03 Aug, 13:32

4,495

🧬 Все каналы по мобильной разработке

Собрал тут кажется самую большую коллекцию:


🌸Android — авторский контент об Android

🌸iOS — авторский контент об iOS

🌸Компании — bigtech-компании и организации

🌸Подборки/новости/библиотеки


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

29 Jul, 17:04

2,655

Реверс-инжиниринг чужого приложения

Dolgo.polo Dev x Coffee&Code
#cross_post

💎 iOS

во что собирается приложение?

в .ipa-файл, а в нем код в формате unix executable file (бинарь, скомпилированный код)


можно ли декомпилировать чужое приложение?

да, если у вас есть доступ до .ipa файла (как его получить), можно с легкостью дойти до ассемблерного кода (используя Hopper, можно получить даже псевдо код)

приложения из AppStore шифруются и без jailbreak будет сложно достать что-то полезное из обфусцированного бинаря, но добрые (или не очень) люди создают сайты, где выкладывают незашифрованные бинари популярных приложений


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

да, например тулза sideloadly позволяет пересобрать .ipa файл с дополнительным фреймворком (который мы можем написать сами)

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


что защищает от хакнутых приложений?

🔵источник приложений только один — AppStore (уже нет)
🔵подпись .ipa-файла, связанная с аккаунтом разработчика
🔵DeviceCheck — фича, позволяющая сгенерировать токен оригинальность приложения и проверить его на бэкенде


можно ли посмотреть исходники любой библиотеки?

только если она в публичном доступе

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

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

например можно:
🔵запринтить все методы объекта (подробнее)
🔵переопределить любой (да да, любой, даже приватный) метод
🔵подменить класс в рантайме, создать класс в рантайме
🔵вызывать любой метод (даже не объявленный)
🔵подключить любую библиотеку (даже системные фреймворки Apple) и много чего еще




💎 Android

во что собирается приложение?

в .apk-файл, в котором лежит java-байткод (Java/Kotlin-код компилируется в java-байткод на этапе сборки .apk)


можно ли декомпилировать чужое приложение?

да

получить .apk-файл можно из любого приложения, установленного на устройстве

дальше достаточно использовать любую программу, умеющую превращать байткод обратно в Java-код

единственная защита от этого — обфускация кода. но она лишь усложняет читаемость кода, а не защищает от считывания


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

да, поскольку после декомпиляции мы получаем обычный Java-код, который можем изменить его и заново собрать .apk


что защищает от хакнутых приложений?

🔵подпись приложения

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

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

🔵Play integrity API — фича, позволяющая сгенерировать токен оригинальность приложения и проверить его на бэкенде


можно ли посмотреть исходники любой библиотеки?

да, у нас есть доступ к исходникам любой либы, написанной на Java/Kotlin (в том числе системных/гугловских) прямо из Android Studio



💎 Выводы

все секреты, попавшие в .apk/.ipa-файл (токены/алгоритмы шифрования/пароли/протоколы...), могут быть вытащены и подменены с помощью реверс-инжиниринга на обоих платформах

на iOS изучить/подменить чужое приложение сложнее, но тоже реально

так что все что попало в .apk/.ipa-файл — считай open-source


спасибо Coffee&Code и в частности @gronzeisl за экспертизу по iOS
Dolgo.polo Dev | Денис Долгополов

19 Jul, 17:59

2,230

Новая рубрика — #cross_post

в ней мы сравним iOS и Android технологии

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

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

и возможно приблизим кросс-платформу. или точно поймем, что оно нам не надо


p.s. в некоторых темах будут участвовать приглашенные эксперты и просто заслуженные мэтры iOS/Android-разработки
Dolgo.polo Dev | Денис Долгополов

07 Jul, 15:15

3,222

Кастомные операторы

Наткнулся на либу для построения графов

Насколько она хороша не знаю, но меня зацепило, как они грациозно позволяют задать граф:


LabeledGraph { A - "C" - E }


• A и E — объекты вершин, возможно уже с какими-то связями

• "C" — название для новой вершины, для которой автоматически создастся объект

и вместе они соединяются в направленный граф с помощью минуса


примерно так:


operator fun minus(new: Any) = Vertex(incoming = this, current = new)


....

есть еще ситуации, когда кастомный operator реально упрощает жизнь?

operator fun minus(b: Int) = this + b 👍