






















接着前一篇文章 DRM Widevine L1 在 Android Webview 的支持情况, 这一篇文章是基于 Cursor 对 Chroimum 源码分析得出的一些结论。本文主要回答两个问题:
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 的限制:**
实际影响:
这就是为什么 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;
}
}
关键点:
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);
关键点:
这些正是硬件安全编解码器所需的基础设施
3. Widevine 密钥系统信息中的 Android 特定逻辑
在 src/components/cdm/renderer/widevine_key_system_info.cc 中:
当 Android 应用嵌入 WebView 时,WebView 的浏览器代码运行在应用的进程中
(我们称之为"浏览器进程")。这意味着 WebView 代码共享相同的地址空间,
我们通常认为应用就像任何其他浏览器进程代码一样是可信的。
关键点:
4. WebView 的架构限制
在 src/android_webview/docs/architecture.md 中:
当 Android 应用嵌入 WebView 时,WebView 的浏览器代码运行在应用的进程中
(我们称之为"浏览器进程")。这意味着 WebView 代码共享相同的地址空间,
我们通常认为应用就像任何其他浏览器进程代码一样是可信的。
关键点:
5. WebView 中缺少硬件安全编解码器相关代码
通过搜索发现,在 src/android_webview/ 目录中:
这些代码证据清楚地表明:
因此,WebView 确实没有提供硬件安全编解码器的基础设施,这就是为什么它只能支持 SW_SECURE_DECODE 的原因。
核心差异:Chrome vs WebView
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);
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 %}
进程隔离的安全优势:
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 通过检查,支持硬件安全
}
Chrome 支持的 DRM 级别:
WebView 支持的 DRM 级别:
Chrome 的 L1 支持实现:
安全视频路径:
// 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
| 特性 | Chrome | WebView |
|---|---|---|
| 多进程架构 | ✅ 40个沙盒进程 + 10个特权进程 | ❌ 简单的双进程模型 |
| AndroidOverlay | ✅ 完全支持 | ❌ 不支持 |
| OverlayFullscreenVideo | ✅ 默认启用 | ❌ 明确禁用 |
| 硬件安全表面 | ✅ 支持 | ❌ 不支持 |
| 进程隔离 | ✅ 严格隔离 | ❌ 基本隔离 |
| TEE 集成 | ✅ 支持 | ❌ 不支持 |
| 最高 DRM 级别 | HW_SECURE_ALL (L1) | SW_SECURE_DECODE (L3) |
结论
Android Chrome 支持 L1 DRM Security Level 是因为它具备了完整的硬件安全基础设施:
而 WebView 为了保持轻量级和兼容性,选择了更简单但安全性较低的架构,因此只能支持到 SW_SECURE_DECODE 级别。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。