菜单

设备兼容性

相关源文件

本页面记录了 scrcpy 中特定设备的兼容性问题以及为解决这些问题而实现的解决方法。Scrcpy 旨在兼容各种 Android 设备和版本,但不同设备制造商定制 Android 的方式可能导致兼容性问题。

有关排查常见连接问题的更多信息,请参阅 常见问题

设备兼容性挑战概述

Scrcpy 在与不同的 Android 设备配合使用时面临多项兼容性挑战

  1. Android 版本差异 - API 在 Android 版本之间会有变化
  2. 制造商定制 - OEM 以特定设备的方式修改 Android
  3. 访问限制 - 限制应用功能的安全功能
  4. 硬件差异 - 不同的屏幕尺寸、编码器和功能

代码库包含多种解决方法来处理这些差异,并在不同设备上提供一致的功能。

设备兼容性架构

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java server/src/main/java/com/genymobile/scrcpy/FakeContext.java

Android 版本兼容性

Scrcpy 实现了版本检查和特定的代码路径来处理 Android 版本之间的差异。 AndroidVersions 类定义了需要特殊处理的 API 级别的常量。

特定版本解决方法

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java166-313

主要的 Android 版本兼容性考虑因素

Android 版本API 级别兼容性考虑因素
Android 11+30+AudioRecord 创建的更改,需要解决方法
Android 12+31+需要为三星设备设置 ConfigurationController
新的 AttributionSource 要求
Android 14+34+AudioRecord 原生设置更改(添加了 halInputFlags 参数)

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java237-283

OEM 特定兼容性问题

不同的设备制造商会以影响 scrcpy 功能的方式修改 Android。代码库包含针对多个 OEM 的特定解决方法。

已知的 OEM 特定问题

制造商/品牌问题变通方法
三星 (Samsung)DisplayManagerGlobal 在 Android 12+ 上需要 ConfigurationController在上下文初始化之前填充 ConfigurationController
Vivo修改了 AudioRecord 构造函数,需要真实的应用程序上下文使用反射创建 AudioRecord,以避免触发修改后的代码
ONYX应用信息填充会破坏视频镜像在 ONYX 设备上跳过填充应用信息

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java60-77

OEM 检测和解决方法应用

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java59-77

上下文模拟

Scrcpy 创建一个虚假的应用程序上下文,以规避 Android API 中的限制和要求。这在 FakeContext 类中实现。

FakeContext 架构

来源: server/src/main/java/com/genymobile/scrcpy/FakeContext.java14-94

虚假上下文

  • 使用“com.android.shell”作为包名
  • 创建虚假的 ContentResolver 以进行内容提供者操作
  • 为 Android 12+ 兼容性提供归因来源 (attribution source)
  • 使用系统上下文作为 ContextWrapper 的基类

来源: server/src/main/java/com/genymobile/scrcpy/FakeContext.java57-59 server/src/main/java/com/genymobile/scrcpy/Workarounds.java155-164

音频捕获兼容性

音频捕获尤其受到特定设备修改的影响,尤其是在 Vivo 等制造商的 ROM 上。

音频捕获解决方法

对于 Android 11 及以上版本,scrcpy 使用反射来创建 AudioRecord 实例,以绕过制造商的修改

  1. 创建一个带有特殊构造函数的空 AudioRecord 实例
  2. 手动设置通常由构造函数设置的字段和状态
  3. 直接调用原生的设置方法并传入所需的参数
  4. 处理原生设置方法中特定版本的差异

之所以需要这种方法,是因为一些设备制造商修改了标准的 AudioRecord 构造函数,要求提供真实应用程序环境的上下文。

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java166-313

输入法兼容性

输入处理也可能受到特定设备限制的影响。

输入兼容性问题

问题受影响的设备解决方案
鼠标和键盘无法工作部分设备在开发者选项中启用“USB 调试(安全设置)”
特殊字符无法工作所有设备(默认注入方法的限制)使用物理键盘模拟模式

来源: FAQ.md153-178

视频编码兼容性

视频编码兼容性取决于设备支持的编解码器和编码器实现。

视频编码器问题

如果遇到与 MediaCodec 相关的异常,这可能表示与默认编码器不兼容。Scrcpy 允许通过命令行选项更改编码器。

来源: FAQ.md215-226

常见的故障排除步骤

当遇到设备兼容性问题时

  1. 更新 scrcpy:确保您使用的是最新版本,其中包含所有当前的兼容性解决方法
  2. 检查 Android 版本:考虑上面记录的特定版本问题
  3. 检查设备制造商:注意已知的 OEM 特定问题
  4. 查看日志:查找与设备兼容性相关的特定错误消息

对于与设备的连接问题,请参阅 常见问题 页面。

实施新的设备兼容性解决方法

Workarounds.java 文件是处理设备兼容性问题的中心位置。通常的模式包括:

  1. 检测特定条件(Android 版本或设备制造商)
  2. 在必要时使用反射实现解决方法,以访问隐藏的 API
  3. 优雅地处理失败,因为这些是解决方法而不是核心功能

来源: server/src/main/java/com/genymobile/scrcpy/Workarounds.java