Skip to content

Telegram Desktop 源码拆解从 106 万行 C++ 中找到主干

不逐文件背目录。沿着启动、请求、同步、数据、消息、界面、媒体和存储的真实运行链路,建立一张可用于调试与二次开发的系统地图。

Telegram Desktop Source Notes

一张图建立主线

平台入口 │ ▼ Core::Launcher ──► Core::Sandbox ──► Core::Application │ │ │ ▼ │ Main::Domain(多账号集合) │ │ │ ▼ │ Main::Account(授权与 MTProto) │ │ │ ┌────────────┴────────────┐ │ ▼ ▼ │ Main::Session MTP::Instance │ │ │ │ ▼ ▼ │ Data::Session ◄──── Api::Updates / ApiWrap │ │ │ ┌──────────┼───────────┐ │ ▼ ▼ ▼ │ History Storage Media │ │ ▼ ▼ Qt 事件循环 ──► Window::SessionController ──► HistoryView / Dialogs / Info

这张图故意省略了大量产品功能,却保留了绝大多数问题都必须经过的“骨架对象”。理解这些对象的所有权和消息流,之后再进入贴纸、Stories、群组通话、支付或 WebView,都会容易很多。

14 章路线

阶段章节你最终能回答的问题
建模01–03这个百万行客户端的稳定边界在哪里?启动后谁拥有账号、会话和窗口?
网络04–05一个 TL 请求怎样发出?推送乱序或丢失时,客户端怎样恢复一致?
数据06–08User/Chat/Channel/HistoryItem 如何归一化?发送消息为什么先出现在屏幕上?
界面09rpl、lifetime、Controller、Memento 如何协作而不把业务状态锁死在 Widget 里?
重型子系统10–12下载如何并发调度?本地数据怎样加密?通话怎样跨过信令与媒体引擎边界?
工程13–14平台差异、代码生成与发布怎样隔离?遇到问题该从哪里下断点?

推荐阅读方式

  • 第一次读:按 01 → 09 顺序,先拿到主干,再按兴趣选 10–13
  • 带着 bug 读:直接去源码地图,找到所属链路后只读相邻两章。
  • 做二次开发:先读 02 / 03 / 06 / 09 / 13,重点看边界和生命周期。
  • 研究协议同步:集中读 04 / 05 / 08,把 request、update、random_id、pts/seq 放进同一张图。

基线说明

本教程分析的是本地快照 7.0.6AppVersion 7000006)。上游仍会快速演进;文中所有源码链接都固定到 v7.0.6,概念性结论则尽量只依赖长期稳定的结构。

独立学习资料 · 基于 Telegram Desktop v7.0.6