Разработка
Анализ приложений Threads
Мы можем немногое узнать, глядя на публичные сборки Meta, но похоже, что Threads в значительной степени заимствует подходы и код Instagram на обеих платформах.
Threads — это новое приложение от команды Instagram, предназначенное «для обмена текстовыми обновлениями и участия в публичных обсуждениях». Возможно, выпуск этого приложения был в планах уже давно, а возможно команда Meta*/Instagram* подумала, что людям может понадобиться новое приложение для обмена текстовыми обновлениями после всего, что происходило с Twitter в последнее время 🤷.
Meta вкладывает значительные внутренние ресурсы в оптимизацию мобильной производительности. Вы можете просмотреть анализ любого приложения, и мобильные приложения Meta достаточно хорошо оптимизированы. Meta использует некоторые паттерны, которые не являются типичными “лучшими практиками”, но у Meta есть инфраструктура и инженерные мощности, чтобы хорошо их реализовать.
Android-приложение Threads
- Версия: 289.0.0.77.109
- Размер: 72.3 MB
- Интерактивная версия: тут
Как и другие приложения Meta, Threads поставляется в виде универсального APK. AAB считаются лучшей практикой, но Meta активно оптимизирует свои универсальные APK — обфусцирует ресурсы, упаковывает общие библиотеки и использует Redex.
Удивительно, что Threads поставляется с отладочным кодом. Threads имеет такие отладочные пакеты, как com.instagram.debug.devoptions.sandboxselector и com.instagram..debug.quickexperiment.
Разработчики используют React Native для части приложения — InstagramBundle.js.hbc.spk.xz, вероятно, является сжатой версией байткода Hermes (js.hbc).
Имеется большой файл .spo, который выглядит как скомпилированная версия различных нативных библиотек. Вместе с ним упакован файл метаданных:
arm64-v8a/librtc.so 11336240 bda527a307edd868700fccfab15481f403d3f39363289d5d6a717579f284bed7 arm64-v8a/libgojni.so 11330024 616915938eb1face6aa3392aedab8bddce280f2b84423377ac65896a6b3faad7 arm64-v8a/libarfxgraphicsmerged.so 9710600 afb00aa881a63b20371e447dbbad61fefcf4df2c23c922a9e44e2171d7a649ad ...
Можно предположить, что файл .spo представляет собой объединенную версию всех нативных библиотек, вторая запись — смещение/размер, третья — контрольная сумма.
Судя по сообщению @richz (инженер Threads), Threads в основном использует Jetpack Compose для своего пользовательского интерфейса. Часть dex, посвященная compose, относительно мала (~130 КБ) по сравнению с общим размером dex. Это может означать, что они эффективно используют Compose и/или используют код из Instagram, в результате чего его использование кажется меньше, чем есть на самом деле.
Сходство с приложением Instagram
Похоже, что Threads имеет много общего с приложением Instagram (v289.0.0.25.49). Упомянутый выше InstagramBundle.js.hbc.spk.xz аналогичен для Threads и IG. Набор /assets/dsp также одинаков для обоих приложений. Вполне логично, что эти приложения будут использовать общий код, поскольку Threads сильно интегрирован с Instagram.
iOS-приложение Threads
- Версия: 289.0
- Размер: 244.2 MB
- Интерактивная версия: тут
Для Threads на iOS характерны два момента:
- В Threads нет динамических библиотек, в то время как в приложении Facebook* активно используются динамические фреймворки.
- Threads имеет один из самых больших плагинов, которые мы когда-либо видели. Расширение BarcelonaShareExtension имеет размер 81 МБ. Для сравнения, самый большой плагин Instagram — InstagramNotificationExtension — имеет размер 23.5 МБ. TheInstagramShareExtension имеет размер 5.6 МБ.
Интересно, что FBSharedFramework Instagram имеет много общих элементов с расширением BarcelonaShareExtension от Thread.
Некоторые заметные общие элементы
- FilterAsset.bundle
- ig_signals_cupid_better_recall_v1.mlmodelc и ig_signals_cupid_v2.mlmodelc
- Каталог ассетов практически полностью совпадает
Как и в случае с приложением для Android, похоже, что для ускорения разработки Threads и Instagram смогли поделиться значительным количеством кода. Команда Threads хотела двигаться быстро и брала из Instagram все, что могла, и пихала туда, куда нужно.
Время запуска Threads
Хотя большая часть кода обфусцирована, можно использовать ETTrace для просмотра времени запуска потоков
Если вы хотите самостоятельно посмотреть время запуска Thread, вы можете скачать этот JSON-файл и загрузить его в ETTrace.
Мы работаем с обфусцированными сборками, поэтому из трассировки стека можно получить очень немногое. Но мы видим, что значительное количество времени уходит на pre-main (~50 мс из трассировки).
При запуске приложения инициализируется WKWebView, который работает довольно медленно. Это говорит о том, что процесс входа в систему не является нативным и отображает веб-вью, либо используется в фоновом режиме для отслеживания.
Итог
Мы можем немногое узнать, глядя на публичные сборки Meta, но похоже, что Threads в значительной степени заимствует подходы и код Instagram на обеих платформах. Будет интересно посмотреть, изменится ли это.