Skip to content

源码地图

按“我要解决什么问题”定位入口。所有链接固定到 scrcpy v4.1。

一、总入口与组合根

问题入口接下来读
CLI 如何进入主流程app/src/main.ccli.c, options.c
客户端组件如何装配scrcpy()同文件 532–1035
Android 端如何装配Server.scrcpy()AsyncProcessor 实现
退出码从哪里来event_loop()callbacks + events.h

二、ADB、进程与连接

目标主要文件关键符号
选择设备app/src/server.c, adb/adb_parser.crun_server, sc_adb_select_device
push/启动 serverapp/src/server.cpush_server, execute_server
reverse/forwardadb/adb_tunnel.csc_adb_tunnel_open
Android socketDesktopConnection.javaopen, shutdown, close
可中断网络util/intr.c, util/net_intr.csc_intr_interrupt
子进程观察util/process.csc_process_observer_*

三、视频设备端

目标文件关键位置
编码循环/降级SurfaceEncoder.javastreamCapture, prepareRetry, encode
capture 抽象SurfaceCapture.javainit/prepare/start/stop/release
真实屏幕ScreenCapture.javadisplay properties + projection
相机CameraCapture.javaselectCamera, selectSize, Camera2 callbacks
虚拟显示NewDisplayCapture.javacreate/resize/display id publish
reset 原因CaptureControl.javareset, consumeReset
视频约束VideoConstraints.javamax size/alignment/capabilities
封帧device/Streamer.javacodec/session/packet headers

四、音频设备端

目标文件关键职责
source 枚举audio/AudioSource.javadirect 与 playback 分类
playback captureAudioPlaybackCapture.javaAudioRecord 构造与启动
direct captureAudioDirectCapture.java麦克风/voice source
稳定读 PCMAudioRecordReader.javatimestamp 与读循环
压缩编码AudioEncoder.javaMediaCodec
raw 直传AudioRawRecorder.javaPCM packet

五、客户端媒体

目标文件关键职责
解 scrcpy framingdemuxer.ccodec/session/packet
合并 H.26x configpacket_merger.cconfig 前置
FFmpeg 解码decoder.cpacket → frame
packet 多播trait/packet_source.csinks open/push/close
frame 多播trait/frame_source.csinks open/push/session
最新帧缓冲frame_buffer.cAVFrame ref/consume
视频调度video_regulator.cPTS deadline
音频调节audio_regulator.cring buffer + compensation

六、控制与输入

目标文件关键职责
SDL 语义翻译input_manager.cshortcuts/coords/clipboard
客户端发送队列controller.cqueue/serialize/send
控制序列化control_msg.cdesktop → device
反向反序列化device_msg.c, receiver.cdevice → desktop
Java 控制分发control/Controller.java23 种 action
Java 消息解析ControlMessageReader.javabinary reader
设备注入device/Device.javaInputEvent、power、clipboard、app
SDK 键鼠keyboard_sdk.c, mouse_sdk.cAndroid action messages
UHIDapp/src/uhid/*, UhidManager.javavirtual HID
AOAapp/src/usb/*libusb accessory HID
HID 状态app/src/hid/*descriptors/reports

七、UI 与输出

目标文件关键职责
SDL window/render/inputscreen.ccontent rect + render
YUV texturetexture.cAVFrame → SDL_Texture
坐标反算screen.cconvert_window_to_frame_coords
录制recorder.cpacket queue + FFmpeg mux
V4L2v4l2_sink.craw frame → virtual camera
文件拖放file_pusher.cadb install/push + media scan

八、Android 兼容与构建

目标文件关键职责
虚构 app 环境Workarounds.java, FakeContext.javaActivityThread/Context
系统 Binderwrappers/ServiceManager.javaservice lookup/cache
隐藏 API 漂移wrappers/*.javareflection/version branches
状态恢复CleanUp.javasettings/display/jar cleanup
C 构建app/meson.builddeps/platform/features/tests
Java 构建server/build.gradleSDK/AIDL/JUnit
总构建meson.build, server/meson.buildapp/server/prebuilt
发布矩阵.github/workflows/release.ymltests + multi-platform artifacts

九、按改动类型的最短阅读链

text
新增 control message:
control_msg.h/c → ControlMessage.java → ControlMessageReader.java
→ Controller.handleEvent → 双端 tests

新增 frame consumer:
frame_sink.h → 参考 screen/v4l2 → scrcpy.c 装配 → stop/join/destroy

新增 capture source:
SurfaceCapture → 参考 Screen/Camera/NewDisplay
→ Options → Server.scrcpy → control capabilities

排查启动失败:
run_server → adb parser/select → adb_tunnel → execute_server
→ DesktopConnection → Server.internalMain

基于 scrcpy 4.1 源码的独立学习笔记