
本文檔概述了 Android 數字版權管理 (DRM) 框架,並介紹了 DRM 插件必須實現的接口。本文檔不描述 DRM 方案可能定義的穩健性規則或合規性規則。
框架
Android 平台提供了一個可擴展的 DRM 框架,允許應用根據與內容相關的許可限制來管理受版權保護的內容。 DRM 框架支持多種 DRM 方案;設備支持哪些 DRM 方案取決於設備製造商。 DRM 框架為應用程序開發人員提供了統一的接口,並隱藏了 DRM 操作的複雜性。 DRM 框架為受保護和不受保護的內容提供一致的操作模式。 DRM 方案可以通過許可證元數據定義復雜的使用模型。 DRM 框架提供 DRM 內容和許可證之間的關聯,並處理權限管理。這使得媒體播放器可以從受 DRM 保護或不受保護的內容中抽像出來。有關獲取解密受保護媒體流的密鑰的類,請參閱MediaDrm 。


豐富的數字內容的可用性對於移動設備上的用戶來說非常重要。為了使他們的內容廣泛可用,Android 開發人員和數字內容髮布者需要在整個 Android 生態系統中支持一致的 DRM 實施。為了在 Android 設備上提供該數字內容並確保在所有設備上至少有一個一致的 DRM 可用,Google 在兼容的 Android 設備上提供 DRM,無需支付許可費用。 DRM 插件與 Android DRM 框架集成,可以使用硬件支持的保護來保護優質內容和用戶憑據。
DRM 插件提供的內容保護取決於底層硬件平台的安全和內容保護能力。設備的硬件功能應包括硬件安全啟動,以建立安全信任鍊和加密密鑰保護。設備的內容保護能力應包括保護設備中的解密幀和通過可信輸出保護機制保護內容。並非所有硬件平台都支持上述所有安全和內容保護功能。安全性永遠不會在堆棧中的一個地方實現,而是依賴於硬件、軟件和服務的集成。硬件安全功能、受信任的引導機制和用於處理安全功能的隔離安全操作系統的組合對於提供安全設備至關重要。
建築學
DRM 框架設計為與實現無關,並在特定於方案的 DRM 插件中抽象了特定 DRM 方案實現的細節。 DRM 框架包括簡單的 API 來處理複雜的 DRM 操作、獲取許可證、配置設備、關聯 DRM 內容及其許可證,最後解密 DRM 內容。
Android DRM 框架在兩個架構層中實現:
- 一個 DRM 框架 API,通過 Android 應用程序框架向應用程序公開。
- 本機代碼 DRM 框架,它為 DRM 插件(代理)公開了一個接口,以處理各種 DRM 方案的權限管理和解密。


有關詳細信息,請參閱Android Media DRM和Android Media Crypto 。
數字版權管理插件
在系統啟動時,DRM 框架會掃描 HAL 實例/服務(在.rc文件中描述),並通過 HIDL 註冊表發現插件。媒體 DRM 服務器 ( mediadrmserver ) 創建CryptoHal和DrmHal對象。 CryptoHal和DrmHal然後調用具有供應商特定實現的插件。
插件應該實現綁定的 HAL。綁定的 HAL 使用HAL 接口定義語言 (HIDL) ,它允許替換框架而無需重新構建 HAL。
插件由供應商或 SOC 製造商構建,並放在設備上的/vendor分區中。所有搭載 Android 8.0 或更高版本的設備都必須支持以 HIDL 語言編寫的綁定 HAL。
執行
通過插件實現新的 DRM 框架 API:
- 將插件服務添加到設備的構建文件中。
- 更新設備清單。
- 添加 SELinux 權限。
- 在
/vendor下創建一個.rc文件。 - 實現插件。
API 在IDrmPlugin.hal 、 ICryptoPlugin.hal 、 IDrmFactory.hal和ICryptoFactory.hal的每個版本中定義
PLATFORM_ROOT/hardware/interfaces/drm/VERSION/
將插件服務添加到設備構建文件
例如,要添加接口 1.3 支持, VENDOR DEVICE /device.mk文件必須包含android.hardware.drm@1.3-service.*包:
R / Android 11 不推薦使用 1.0 到 1.2 版本。升級到 R 的設備仍允許運行 1.0 到 1.2 版本。但是,使用 R 啟動的新設備必須僅運行 version1.3。
PRODUCT_PACKAGES += \ android.hardware.drm@1.0-impl \ android.hardware.drm@1.0-service \ android.hardware.drm@1.3-service.clearkey \ android.hardware.drm@1.3-service.widevine
更新設備清單
設備的vendor manifest.xml文件必須包含以下條目:
android.hardware.drm hwbinder @1.3::ICryptoFactory/clearkey @1.3::IDrmFactory/clearkey @1.3::ICryptoFactory/widevine @1.3::IDrmFactory/widevine
或者,我們建議使用vintf_fragments。
添加 SELinux 權限
- 添加到
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- 添加到
VENDOR DEVICE /sepolicy/vendor/file_contexts我們建議使用正則表達式來指定版本號以避免對新版本進行更新,例如:
/vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0或者,更新版本號,如下所示。
/vendor/bin/hw/android\.hardware\.drm@1\.3-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 - 添加到
device/sepolicy/vendor/hal_drm_clearkey.te
allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms; allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
在 /vendor 下創建一個 .rc 文件
.rc文件指定啟動服務時要執行的操作。
有關詳細信息,請參閱Android 初始化語言。
實現插件
- 在插件服務的
service.cpp中實現main()入口點。 - 實現
ICryptoPlugin、IDrmPlugin、ICryptoFactory和IDrmFactory。 - 在插件中實現新的 API。
DRM 插件詳細信息
DRM 插件供應商實現DrmFactory 、 CryptoFactory和 DRM 插件。
工廠
DrmHal類搜索已註冊的 DRM 插件服務,並通過DrmFactory類構建支持給定加密方案的相應插件。
IDrmFactory 是通過 createPlugin API 與供應商的 drm HAL 交互的主要入口點。 createPlugin API 用於創建 IDrmPlugin 實例。 1.3 IDrmFactory 必須始終創建 1.2 IDrmPlugin 接口,這些接口通過 1.0 createPlugin 方法返回。
Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);
1.3 IDrmFactory 中的新增功能 getSupportedCryptoSchemes 返回 HIDL drm HAL 實例支持的加密方案列表。
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
確定插件工廠是否能夠構建支持給定加密方案的 DRM 插件,該加密方案由 UUID 指定。
Return<bool> isContentTypeSupported(const hidl_string &mimeType);
確定插件工廠是否能夠構建支持mimeType指定的給定媒體容器格式的 DRM 插件。
Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
const hidl_string& appPackageName, createPlugin_cb _hidl_cb);
為 UUID 指定的加密方案構造 DRM 插件。
加密工廠
CryptoHal類搜索已註冊的 DRM 插件服務,並通過CryptoFactory類構造支持給定加密方案的相應插件。
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
確定加密工廠是否能夠構建支持給定加密方案的加密插件,該加密方案由 UUID 指定。
Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)
確定插件工廠是否能夠構建支持給定加密方案的加密插件,該加密方案由 UUID 指定。
數字版權管理插件
API 在hardware/interfaces/drm/ VERSION /IDrmPlugin.hal中定義。對應的IDrmPlugin.h文件可以在構建後的 out/Soong 中找到。