數位版權管理

Android DRM HAL 圖標

本文檔概述了 Android 數位版權管理 (DRM) 框架,並介紹了 DRM 外掛程式必須實現的介面。本文檔不描述可能由 DRM 方案定義的穩健性規則或合規性規則。

框架

Android 平台提供了一個可擴展的 DRM 框架,可讓應用程式根據與內容關聯的許可證約束來管理受版權保護的內容。 DRM框架支援多種DRM方案;設備支援哪些 DRM 方案取決於設備製造商。 DRM框架為應用開發者提供了統一的接口,隱藏了DRM操作的複雜性。 DRM框架為受保護和不受保護的內容提供一致的操作模式。 DRM 方案可以透過許可證元資料定義複雜的使用模型。 DRM 框架提供 DRM 內容和許可證之間的關聯,並處理權限管理。這使得媒體播放器能夠從受 DRM 保護或不受保護的內容中抽象化。請參閱MediaDrm以取得用於解密受保護媒體流的金鑰的類別。

Android DRM HAL
圖 1a。 Android 11之前的DRM硬體抽象層
Android DRM HAL 後 R
圖 1b。從 Android 11 開始 DRM 硬體抽象層

豐富的數位內容的可用性對於行動裝置上的使用者來說非常重要。為了使他們的內容廣泛可用,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 DRM 框架
圖 2a。 Android 11之前的DRM框架
Android DRM 框架
圖 2b。從 Android 11 開始的 DRM 框架

有關更多詳細信息,請參閱Android Media DRMAndroid Media Crypto

數位版權管理插件

在系統啟動時,DRM 框架會掃描 HAL 實例/服務(在.rc檔案中描述)並發現外掛程式。媒體 DRM 伺服器 ( mediadrmserver ) 建立CryptoHalDrmHal物件。然後CryptoHalDrmHal調用具有供應商特定實現的插件。

插件應該實現綁定化的 HAL。 Binderized HAL 使用Android 介面定義語言 (AIDL) ,它允許替換框架而無需重建 HAL。

插件由供應商或 SOC 製造商構建,並放置在設備上的/vendor分區中。所有搭載 Android 13 或更高版本的裝置都必須支援以 AIDL 語言編寫的綁定化 HAL。

執行

適用於 Android 13 的 GMS 和 AOSP 裝置版本必須使用 AIDL 介面。

要透過外掛程式實現新的 DRM 框架 API:

  1. 將插件服務新增至裝置的建置檔案。
  2. 更新設備清單。
  3. 新增 SELinux 權限。
  4. /vendor下建立一個.rc檔。
  5. 實施插件。

API 在IDrmPlugin.aidlICryptoPlugin.aidlIDrmFactory.aidlICryptoFactory.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權限

  1. 新增至VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. 新增至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
  3. 加入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 初始化語言

實作插件

  1. 在插件服務的service.cpp中實作main()入口點。
  2. 實作ICryptoPluginIDrmPluginICryptoFactoryIDrmFactory
  3. 在插件中實作新的 API。

DRM 插件詳細信息

DRM 插件供應商實現DrmFactoryCryptoFactory和 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);

確定插件工廠是否能夠建立支援給定加密方案(由 UUID 指定)的 DRM 插件。

::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中定義。建置後可以在out/Soong 中找到對應的IDrmPlugin.h檔案。