小扎和馬斯克的天內“格斗”,從八角籠中來到了社交平臺上。用戶億增壓
當地時間 7 月 5 日,數破速碾Meta 旗下的勁建 Instagram正式發布 Threads,與 Twitter 展開直接競爭。何構據介紹,天內Threads 的用戶億增壓定位是“用文本分享動態和加入公共對話”。應用上線后,數破速碾Meta 公司首席執行官馬克·扎克伯格“實時”公布 Threads 最新成績:4 小時,勁建注冊用戶 500 萬;7 小時,何構注冊用戶 1000 萬;24 小時,天內注冊用戶 3000 萬;48 小時,用戶億增壓注冊用戶 7000 萬。數破速碾
北京時間 7 月 10 日 15 點左右,勁建據數據追蹤網站 Quiver Quantitative 披露,何構Threads 的登錄用戶數已經突破 1 億人。扎克伯格表示,這主要是自然需求,Threads 甚至還沒有開展很多推廣活動。這遠遠超出了預期。
而此時,距離 Threads 在美洲地區首發上線連 5 天整都沒到。Threads 的注冊用戶增速也打破了此前 ChatGPT 留下的記錄,后者用了 2 個月實現注冊用戶數破億。此外,Threads 用戶的活躍度也很高,據報道,過去幾天 Threads 上的帖子數量已經達到 9500 多萬條,點贊數 1.9 億次。
投資銀行 Evercore ISI 表示,雖然現在還處于早期階段,但預計 Threads 可以為 Meta 帶來可觀的現金。Threads 有望在未來兩年內覆蓋近 2 億的日活躍用戶,并產生約 80 億美元的年收入。
那么,這樣一款現象級應用程序是如何構建的?
Threads 是如何構建的?
近日,國外工具分析平臺 Emerge Tools 率先對 Threads App 進行了拆解分析,分別揭曉了 Android版 Threads 以及 iOS版 Threads 是如何構建的。
Emerge Tools 表示,Meta 投入大量資源對應用做移動性能優化。通過測試和分析,可以看到 Meta 的移動應用優化確實做得不錯。Meta 采取的不少模式雖非典型的最佳實踐,但憑借著強大的基礎設施和工程能力,Meta 仍然在這場“以終為始”的性能大戰中占據了主動。
拆解 Android、iOS 版 Threads
Android 版 Threads 方面,跟其他 Meta 應用一樣,Threads 也提供通用 APK 文件。雖然業界認為 AAB 才是最佳實踐,但 Meta 還是選擇了高度優化過的通用 APK——把資源、自定義打包共享庫和 Redex 結合了起來。
Threads 還發布了調試代碼。Threads 提供 com.instagram.debug.devoptions.sandboxselector 和 com.instagram..debug.quickexperiment 等調試包。
此外,Threads 在應用的某些部分使用了 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 ...
Emerge Tools 猜測這個.spo 文件是所有本機庫的合并版本,第二個條目是 offset/size,第三個條目則是 checksum。
UI 方面,根據 @richz(Threads 工程師)的帖子,Threads 主要用 Jetpack Compose 來構建自己的 UI。跟整個 dex 大小相比,dex 的組裝部分相對較小(約 130 KB),所以也許能更高效地使用 Compose 并 / 或共享 Instagram 代碼、控制實際代碼量。
Threads 的 iOS 版有兩點比較突出:
Thredas 有 0 個動態庫,而 Facebook 應用卻大量使用動態框架。
Threads 的插件體量幾乎逼近人們的認知極限。其中 BarcelonaShareExtension 達到 81 MB。相比之下,最大的 Instagram 插件 - InstagramNotificationExtension 也僅為 23.5 MB,InstagramShareExtension 則為 5.6 MB。
后端采用 Cinder,基于 Python3.10 構建
此外,據 CPython 核心開發者?ukasz Langa 透露,Threads 的后端使用了 Cinder,這是基于 Python 3.10 構建的高性能版本,其中包含 JIT、延遲加載模塊、預編譯靜態模塊,而且針對 Python 3.10 做出了一系列有趣的調整。
據了解,Cinder 是 Meta 內部打造的、強調高性能的 CPython 3.10 生產版本。其中包含多種性能優化,例如字節碼內聯緩存、協和即時評估、每次一個方法 JIT,以及使用類型注釋在 JIT 中實現類型專用字節碼、從而提高性能的實驗性字節碼編譯器。
Cinder 目前已經在支持 Instagram,而且正越來越多被用在 Meta 公司的各類 Python 應用程序當中。Meta 表示,公開發布 Cinder 是為了推動將部分工作負載回流至 CPython 的討論,同時努力減少 CPython 開發者在性能優化方面浪費的時間。
但 Cinder 本身尚不完善,也不是 CPython 的替代品,Meta 發布項目代碼的唯一理由,就是想幫助 CPython 在速度方面更上一層樓。雖然 Meta 自己確實在生產環境中運行 Cinder,但無法為其他開發者提供生產層級的技術支持。只能保證 Cinder 在 Meta 自己的生產工作負載中穩定且快速,但不保證其在其他外部工作負載或用例中具有良好的穩定性、正確性或性能。
據介紹,Instagram 擁有非常龐大的 Python 代碼庫,所以由引用計數復制所帶來的開銷也極為沉重。為此,Cinder 開發出名為“不朽實例”(Immortal Instance)的解決方案,能夠從引用計數中清退對象。此功能通過定義 Py_IMMORTAL_INSTANCES 進行控制,并在 Cinder 中默認啟用。這對生產流程是一個巨大的勝利(節約開銷約 5%),但也會令直接代碼的運行速度變慢。由于引用計數操作會頻繁發生,所以啟用此功能前必須檢查對象是否確實參與了引用計數。
Threads 的啟動時間如何?
Emerge Tools 用 ETTrace 來查看 Threads 的實際啟動時間。
使用 ETTrace 為 Threads 的啟動過程生成火焰圖。
Emerge Tools 表示,由于 Meta 公開的 build 混淆,能從棧中追蹤到的信息不多。但仍然可以看到,其中存在大量 pre-main 時間(在追蹤期間約為 50 毫秒)。
還有一個會在應用啟動時初始化的 WKWebView,它的速度也相當慢。這意味著整個登錄體驗并非本機、而是在顯示 webview,或者是出于追蹤的目的而將登錄放在了后臺。
Threads 未來會 “去 Instagram 化”嗎?
分析發現,Threads 在 Android 和 iOS 兩大平臺上都照搬了不少 Instagram 代碼,比如 InstagramBundle.js.hbc.spk.xz 等等。
其中,Android 版 Threads 與 Instagram 間的 /assets/dsp也是相同的。考慮到 Threads 與 Instagram 高度集成,二者共享代碼也完全在情理之中。
此外,iOS 版 Threads 的 BarcelonaShareExtension 與 Instagram 的 FBSharedFramework 之間擁有很多相同元素。一些值得注意的相同元素:
FilterAsset.bundle;
ig_signals_cupid_better_recall_v1.mlmodelc 與ig_signals_cupid_v2.mlmodelc;
資產目錄幾乎完全相同。
作為一款新產品,Threads 的發布顯然有些倉促。Threads 在 Android 和 iOS 兩大平臺上和 Instagram 共享大量代碼,明顯是為了加快開發速度。Threads 團隊希望快速行動,在一切可能的位置直接使用 Instagram 那邊的現成代碼。在未來的發展中,Threads 會不會逐步“去 Instagram 化”值得關注。
目前,Threads 還缺少了一些關鍵功能,比如沒有翻譯按鈕、不能搜索內容(只能搜索用戶)、沒有話題標簽功能、沒有編輯按鈕(發布帖子后無法進行編輯)、不能私信等。Meta 產品副總裁 Connor Hayes 也承認,有一些功能沒能趕上這次發布,它們會在日后更新時推出。