| 8 min read

接着前一篇文章 DRM Widevine L1 在 Android Webview 的支持情况, 这一篇文章是基于 Cursor 对 Chroimum 源码分析得出的一些结论。本文主要回答两个问题:

  • 为什么 Android Webview 不支持 L1 级别的 Widevine DRM 安全级别
  • 为什么 Android Chrome 应用支持 L1 级别的 Widevine DRM 安全级别

为什么 Android Webview 不支持 L1 级别的 Widevine DRM 安全级别?

主要原因:

1. 硬件安全解码要求
根据 Chromium 代码中的逻辑,在 Android 平台上:

// 在 Android 上,SW_SECURE_DECODE 及以上级别需要硬件安全编解码器
if (robustness >= Robustness::SW_SECURE_DECODE || hw_secure_codecs_required) {
    return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired};
}

这意味着:

任何高于或等于 SW_SECURE_DECODE 的安全级别都需要硬件安全编解码器但是 WebView 没有提供硬件安全编解码器的基础设施

2. WebView 的架构限制

单进程架构:WebView 运行在单进程中,不像 Chrome 那样有进程隔离缺少安全表面:硬件安全解码需要特殊的安全表面处理,WebView 没有实现权限限制:硬件安全解码通常需要额外的系统权限和特殊处理

3. 安全考虑

硬件安全解码需要更严格的进程隔离和安全机制 在 WebView 中实现硬件安全解码可能会带来安全风险
需要大量的架构改动才能安全地支持

技术细节:

DRM 安全级别从低到高:

  • SW_SECURE_CRYPTO:软件安全加密
  • SW_SECURE_DECODE:软件安全解码(WebView 支持的最高级别)
  • HW_SECURE_CRYPTO:硬件安全加密
  • HW_SECURE_ALL:硬件安全全部

** WebView 的限制:**

  • 只支持到 SW_SECURE_DECODE 级别
  • 不支持 HW_SECURE_CRYPTO 和 HW_SECURE_ALL
  • 当网页请求更高安全级别时,WebView 会拒绝

实际影响:

  • 内容兼容性:某些高安全级别的内容可能无法在 WebView 中播放
  • 性能影响:软件解码比硬件解码消耗更多 CPU 资源
  • 电池消耗:软件解码会增加电池消耗

为什么这样设计?

  • 简化架构:WebView 作为嵌入式组件,保持简单和安全
  • 兼容性:确保在各种 Android 设备上都能正常工作
  • 安全性:避免在嵌入式环境中引入复杂的安全机制

这就是为什么 Android WebView 只支持 SW_SECURE_DECODE 的技术原因。如果需要更高级别的 DRM 支持,通常需要使用原生 Android 应用或 Chrome 浏览器。

1. Android 硬件安全编解码器支持检查代码

// 硬件安全编解码器的渲染只有在 AndroidOverlay 启用时才支持
const bool is_secure = robustness == CdmInfo::Robustness::kHardwareSecure;
if (is_secure) {
    bool are_overlay_supported =
        content::AndroidOverlayProvider::GetInstance()->AreOverlaysSupported();
    bool overlay_fullscreen_video =
        base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo);
    if (!are_overlay_supported || !overlay_fullscreen_video) {
        DVLOG(1) << "Hardware secure codecs not supported for key system"
                 << key_system << ".";
        std::move(cdm_capability_cb)
            .Run(base::unexpected(media::CdmCapabilityQueryStatus::
                                      kHardwareSecureCodecNotSupported));
        return;
    }
}

关键点:

  • 硬件安全编解码器需要 AndroidOverlay 支持
  • 需要 kOverlayFullscreenVideo 功能启用
  • 如果这些条件不满足,就会返回 kHardwareSecureCodecNotSupported 错误

2. WebView 明确禁用了相关功能
在 src/android_webview/browser/aw_field_trials.cc 中:

// WebView 还不支持视频覆盖的全屏
aw_feature_overrides.DisableFeature(media::kOverlayFullscreenVideo);

// WebView 不支持多进程,所以不要尝试在单独进程中调用一些 MediaDrm API
aw_feature_overrides.DisableFeature(media::kMediaDrmQueryInSeparateProcess);

关键点:

  • WebView 明确禁用了 kOverlayFullscreenVideo 功能
  • 禁用了 kMediaDrmQueryInSeparateProcess 功能

这些正是硬件安全编解码器所需的基础设施

3. Widevine 密钥系统信息中的 Android 特定逻辑
在 src/components/cdm/renderer/widevine_key_system_info.cc 中:

当 Android 应用嵌入 WebView 时,WebView 的浏览器代码运行在应用的进程中
(我们称之为"浏览器进程")。这意味着 WebView 代码共享相同的地址空间,
我们通常认为应用就像任何其他浏览器进程代码一样是可信的。

关键点:

  • Android 平台要求 SW_SECURE_DECODE 及以上级别必须使用硬件安全编解码器
  • 但是 WebView 没有提供硬件安全编解码器的基础设施

4. WebView 的架构限制

在 src/android_webview/docs/architecture.md 中:

当 Android 应用嵌入 WebView 时,WebView 的浏览器代码运行在应用的进程中
(我们称之为"浏览器进程")。这意味着 WebView 代码共享相同的地址空间,
我们通常认为应用就像任何其他浏览器进程代码一样是可信的。

关键点:

  • WebView 运行在单进程中,没有进程隔离
  • 硬件安全编解码器通常需要特殊的进程隔离和安全机制
  • WebView 的架构不支持这些安全要求

5. WebView 中缺少硬件安全编解码器相关代码

通过搜索发现,在 src/android_webview/ 目录中:

总结

这些代码证据清楚地表明:

  • 硬件安全编解码器需要 AndroidOverlay 支持,但 WebView 禁用了这个功能
  • WebView 禁用了多进程 MediaDrm 查询,这是硬件安全编解码器所需的基础设施
  • WebView 运行在单进程中,缺乏硬件安全编解码器所需的进程隔离
  • WebView 代码库中完全没有硬件安全编解码器的实现

因此,WebView 确实没有提供硬件安全编解码器的基础设施,这就是为什么它只能支持 SW_SECURE_DECODE 的原因。

为什么 Android Chrome 应用支持 L1 级别的 Widevine DRM 安全级别?

核心差异:Chrome vs WebView

1. 技术基础设施支持

Chrome 具备完整的硬件安全基础设施:

AndroidOverlay 支持

// Chrome 支持 AndroidOverlay(在 AndroidOverlayProviderImpl.java 中)
@CalledByNative
private static boolean areOverlaysSupported() {
    return true;  // Chrome 返回 true,支持 overlay
}	

OverlayFullscreenVideo 功能启用

// 在 media_switches.cc 中,Chrome 默认启用此功能
BASE_FEATURE(kOverlayFullscreenVideo,
             "overlay-fullscreen-video", 
             base::FEATURE_ENABLED_BY_DEFAULT);  // 默认启用

WebView 明确禁用这些功能:

// 在 aw_field_trials.cc 中,WebView 明确禁用
// WebView does not support overlay fullscreen yet for video overlays.
aw_feature_overrides.DisableFeature(media::kOverlayFullscreenVideo);

2. 多进程架构支持

Chrome 的复杂多进程架构:

<!-- Chrome 有 40 个沙盒进程用于安全隔离 -->
{% for i in range(40) %}
<service android:name="org.chromium.content.app.SandboxedProcessService{{ i }}"
    android:process=":sandboxed_process{{ i }}"
    android:isolatedProcess="true" />
{% endfor %}

<!-- Chrome 还有 10 个特权进程 -->
{% for i in range(10) %}
<service android:name="org.chromium.content.app.PrivilegedProcessService{{ i }}"
    android:process=":privileged_process{{ i }}" />
{% endfor %}

进程隔离的安全优势:

  • 渲染器进程隔离:DRM 内容在独立的沙盒进程中处理
  • 特权进程分离:硬件安全操作在特权进程中执行
  • 安全边界:进程间有严格的安全边界

3. 硬件安全检查机制

Chrome 的硬件安全检查:

// 在 key_system_support_android.cc 中
const bool is_secure = robustness == CdmInfo::Robustness::kHardwareSecure;
if (is_secure) {
    bool are_overlay_supported =
        content::AndroidOverlayProvider::GetInstance()->AreOverlaysSupported();
    bool overlay_fullscreen_video =
        base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo);
    
    if (!are_overlay_supported || !overlay_fullscreen_video) {
        DVLOG(1) << "Hardware secure codecs not supported";
        return; // 拒绝硬件安全编解码器
    }
    // Chrome 通过检查,支持硬件安全
}

4. DRM 安全级别支持对比

Chrome 支持的 DRM 级别:

  • ✅ SW_SECURE_CRYPTO - 软件安全加密
  • ✅ SW_SECURE_DECODE - 软件安全解码
  • ✅ HW_SECURE_CRYPTO - 硬件安全加密
  • ✅ HW_SECURE_DECODE - 硬件安全解码
  • ✅ HW_SECURE_ALL - 硬件全安全(L1 级别)

WebView 支持的 DRM 级别:

  • ✅ SW_SECURE_CRYPTO - 软件安全加密
  • ✅ SW_SECURE_DECODE - 软件安全解码(最高级别)
  • ❌ HW_SECURE_CRYPTO - 不支持
  • ❌ HW_SECURE_DECODE - 不支持
  • ❌ HW_SECURE_ALL - 不支持

5. 具体技术实现

Chrome 的 L1 支持实现:

  • 硬件安全表面(Secure Surface):
  • Chrome 使用 DialogOverlayImpl 创建安全的视频表面
  • 支持 AndroidOverlay 进行硬件加速渲染
  • 具备 TEE(Trusted Execution Environment)集成

安全视频路径:

// Chrome 支持 HW_SECURE_ALL 级别
max_video_robustness = Robustness::HW_SECURE_ALL;

OEMCrypto 集成:

// Chrome 支持基于硬件的 L1 Widevine DRM
// Enable use of HW based L1 Widevine DRM via the cdm-oemcrypto daemon	

6. 架构总结

特性 Chrome WebView
多进程架构 ✅ 40个沙盒进程 + 10个特权进程 ❌ 简单的双进程模型
AndroidOverlay ✅ 完全支持 ❌ 不支持
OverlayFullscreenVideo ✅ 默认启用 ❌ 明确禁用
硬件安全表面 ✅ 支持 ❌ 不支持
进程隔离 ✅ 严格隔离 ❌ 基本隔离
TEE 集成 ✅ 支持 ❌ 不支持
最高 DRM 级别 HW_SECURE_ALL (L1) SW_SECURE_DECODE (L3)

结论

Android Chrome 支持 L1 DRM Security Level 是因为它具备了完整的硬件安全基础设施:

  • 完整的多进程安全架构
  • AndroidOverlay 硬件表面支持
  • 进程隔离和沙盒机制
  • TEE(可信执行环境)集成
  • 专门的安全视频渲染路径

而 WebView 为了保持轻量级和兼容性,选择了更简单但安全性较低的架构,因此只能支持到 SW_SECURE_DECODE 级别。

You Can Speak "Hi" to Me in Those Ways