Skip to content

源码地图:从任务反查入口

这份地图不是目录树的复读,而是回答“我要理解或调试某种行为,最少先打开哪些文件”。路径都相对于仓库根目录;链接固定到上游 v7.0.6

进程与生命周期

任务第一入口配套文件观察重点
启动参数、路径、日志core/launcher.cppplatform/*/launcher_*平台启动钩子、工作目录、Updater
Qt 事件循环与单实例core/sandbox.cppcore/external_control.cppQLockFile、QLocalServer、退出顺序
进程级服务根core/application.cppcore/application.hDomain、窗口、媒体、通知的创建顺序
多账号切换main/main_domain.cppmain/main_account.cppactive variable、账号槽位、session changes
登录会话建立main/main_session.cppmain/main_account.cpp服务聚合、Data::Session 创建、启动异步读盘

网络与同步

任务第一入口配套文件观察重点
发起 RPCmtproto/sender.hmtp_instance.cpp, session.cppbuilder、request id、回调 owner、DC 路由
连接与 transportmtproto/session.cppsession_private.cpp, connection.cpp加密 session、重连、ack、容器
业务 API 门面apiwrap.hapiwrap.cpp, api/*.cpp产品操作到 TL 请求的转换
接收 Updatesapi/api_updates.cppapi/api_pts_waiter.*seq/pts 缺口、difference、应用顺序
TL schemamtproto/scheme/api.tlscheme/mtproto.tl, codegen/schemeconstructor、flags、生成类型

数据与消息

任务第一入口配套文件观察重点
领域对象仓库data/data_session.hdata_session.cpppeers/messages/histories 的身份映射
变更广播data/data_changes.hdata_changes.cppflags 合并、realtime 与批量通知
Peer 层次data/data_peer.hdata_user.*, data_chat.*, data_channel.*公共能力与类型特有状态
会话聚合history/history.hhistory.cppitem 注册、blocks、unread、chat list
消息实体history/history_item.hhistory_item.cpp, history_message.*flags、media、reply、view 创建
发送文本apiwrap.cpp#L4579data/data_histories.cpp本地 ID、random_id、乐观 item、回包对账
应用新消息api/api_updates.cpp#L1304data_session.cpp, history.cppupdate 类型分派、去重、History 插入

界面与导航

任务第一入口配套文件观察重点
窗口级控制window/window_controller.hwindow_controller.cppaccount/window 关系、layer/box
登录会话导航window/window_session_controller.hwindow_session_controller.cppactive chat、section stack、memento
三栏主内容mainwidget.cppmainwidget.hdialogs/history/info 的布局协作
消息列表history/view/history_view_list_widget.cpphistory_view_element.*虚拟化、可见区、元素复用
消息绘制history/view/history_view_message.cpphistory_view_element.cpp, media/layout 与 paint 分离、media view
对话列表dialogs/dialogs_widget.cppdialogs_inner_widget.cppfilter、row、active entry

媒体、存储与通话

任务第一入口配套文件观察重点
通用文件加载storage/file_download.cppfile_download_mtproto.cpp, file_download_web.cpplocal-first、缓存/文件、进度 producer
MTProto 下载调度storage/download_manager_mtproto.cppdownload_manager_mtproto.hDC 队列、优先级、动态 session 数量
流媒体media/streaming/media_streaming_instance.cppmedia_streaming_reader.cppFFmpeg reader、线程切换、frame/update
播放器编排media/player/media_player_instance.cppplayer widget/panelsong/voice 状态、playlist、通话暂停
本地密钥与账号表storage/storage_domain.cppstorage_encryption.*passcodeKey → localKey → encrypted info
分账号文件storage/storage_account.cpplocalstorage.cppmap、MTP auth、drafts、stickers、settings
一对一通话calls/calls_call.cppcalls_instance.cpp, controller_webrtc信令状态机、DH/emoji、媒体控制器
群组通话calls/group/calls_group_call.cppgroup panel/membersparticipant updates、SSRC、join payload

用五个问题快速定位未知功能

  1. 它是进程级、账号级、登录会话级,还是窗口级状态?
  2. 它的服务器事实来自 RPC result 还是 Updates?
  3. 它的稳定身份是 PeerId、FullMsgId、DocumentId 还是其他复合 key?
  4. UI 是直接读取当前值,还是订阅 Data::Changes / rpl producer?
  5. 销毁 session、切账号、关窗口或取消请求后,谁终止回调?

回答完这五个问题,通常能把搜索范围从整个仓库缩到 3–8 个文件。

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