接着前一篇文章 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 级别。