
本文檔概述了 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
文件中描述)並發現插件。媒體 DRM 服務器 ( mediadrmserver
) 創建CryptoHal
和DrmHal
對象。 CryptoHal
和DrmHal
然後調用具有供應商特定實現的插件。
插件應該實現綁定的 HAL。 Binderized HAL 使用Android 接口定義語言 (AIDL) ,它允許替換框架而無需重新構建 HAL。
插件由供應商或 SOC 製造商構建,並放在設備上的/vendor
分區中。所有搭載 Android 13 或更高版本的設備都必須支持以 AIDL 語言編寫的綁定 HAL。
執行
適用於 Android 13 的 GMS 和 AOSP 設備版本必須使用 AIDL 接口。
通過插件實現新的 DRM 框架 API:
- 將插件服務添加到設備的構建文件中。
- 更新設備清單。
- 添加 SELinux 權限。
- 在
/vendor
下創建一個.rc
文件。 - 實現插件。
API 在IDrmPlugin.aidl
、 ICryptoPlugin.aidl
、 IDrmFactory.aidl
和ICryptoFactory.aidl
的每個版本中定義
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
將插件服務添加到設備構建文件
例如,要添加 AIDL 接口支持, VENDOR DEVICE /device.mk
文件必須包含android.hardware.drm-service.*
包:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
更新設備清單
設備的vendor manifest.xml
文件必須包含以下條目:
<hal format="aidl"> <name>android.hardware.drm</name> <version>STABLE AIDL VERSION</version> <fqname>ICryptoFactory/clearkey</fqname> <fqname>IDrmFactory/clearkey</fqname> <fqname>ICryptoFactory/widevine</fqname> <fqname>IDrmFactory/widevine</fqname> </hal>
STABLE AIDL VERSION 是每個 AIDL API 版本的版本號(例如 1、2)。或者,我們建議使用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-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
vndbinder_use(hal_drm_clearkey) allow hal_drm_clearkey servicemanager:binder { call transfer }; allow hal_drm_clearkey hal_drm_service:service_manager add; allow hal_drm_clearkey { appdomain -isolated_app }:fd use; get_prop(ramdump, public_vendor_default_prop)
在 /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 實例。
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes 返回 AIDL drm HAL 實例支持的加密方案列表。
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_mimeType, ::aidl::android::hardware::drm::SecurityLevel in_securityLevel, bool* _aidl_return);
確定插件工廠是否能夠構建支持給定加密方案的 DRM 插件,該加密方案由 UUID 指定。
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
確定插件工廠是否能夠構建支持mimeType
指定的給定媒體容器格式的 DRM 插件。
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_appPackageName, std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);
為 UUID 指定的加密方案構造 DRM 插件。
加密工廠
CryptoHal
類搜索已註冊的 DRM 插件服務,並通過CryptoFactory
類構造支持給定加密方案的相應插件。
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
確定加密工廠是否能夠構建支持給定加密方案的加密插件,該加密方案由 UUID 指定。
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::vector<uint8_t>& in_initData, std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);
確定插件工廠是否能夠構建支持給定加密方案的加密插件,該加密方案由 UUID 指定。
DRM 插件 API
API 在hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
中定義。對應的IDrmPlugin.h
文件可以在構建後的 out/Soong 中找到。