數位版權管理

Android DRM HAL 圖示

本文件將概略介紹 Android 數位版權管理 (DRM) 架構和 導入了 DRM 外掛程式必須實作的介面。這份文件並未 描述 DRM 定義的健全性規則或法規遵循規則 配置。

架構

Android 平台提供可擴充的 DRM 架構,讓 應用程式會根據授權管理受版權保護的內容 與內容相關的限制條件。這個 DRM 架構支援許多數位著作權管理架構 計劃;裝置支援的數位版權管理配置由裝置製造商決定。 DRM 架構為應用程式開發人員和 隱藏了 DRM 作業的複雜度。DRM 架構的 對受保護和非受保護內容執行模式。DRM 配置可定義 更複雜的使用模型與授權中繼資料DRM 架構提供 以及處理版權管理事宜。 如此一來,媒體播放器就能從受 DRM 保護,或 未受保護的內容詳情請參閱 MediaDrm 以取得用於解密受保護媒體串流的金鑰。

Android DRM HAL
圖 1a.DRM 硬體抽象化 Android 11 以下版本
Android DRM HAL 貼文 R
圖 1b.DRM 硬體抽象化 從 Android 11 開始的圖層

對行動裝置使用者來說,是否具有多媒體數位內容的可用性非常重要。目的地: 將內容提供給更多使用者 Android 開發人員和數位內容 發布商��要在 Android 平台 採行一致的數位版權管理導入做法 生態系統在 Android 裝置上提供數位內容 所有裝置上至少都有一個 DRM 機制保持一致, 在相容 Android 裝置上無須支付授權費,即可進行數位版權管理。DRM 外掛程式為 可與 Android DRM 架構整合,並採用硬體支援 保護付費內容和使用者憑證

DRM 外掛程式提供的內容保護功能,取決於 基礎硬體平台的內容保護功能 裝置的硬體功能,應提供硬體安全啟動功能, 建立加密編譯金鑰安全性與防護鏈。 裝置的內容保護功能應採用 裝置上的解密影格和內容透過受信任的輸出內容提供保護 保護機制並非所有硬體平台都支援上述所有硬體平台 安全和內容保護功能安全機制絕對不會在 而是仰賴硬體的整合 軟體和服務結合硬體安全功能、 受信任的開機機制,以及處理安全性的獨立安全作業系統 功能是提供安全裝置的關鍵。

建築

DRM 架構專為各類型導入而設計 提取 特定配置的 DRM 外掛程式。DRM 架構包含簡單的 API 來處理 處理複雜的數位版權管理作業、取得授權、佈建裝置 連結 DRM 內容及其授權,然後再解密 DRM 內容。

Android DRM 架構會在兩個架構層中實作:

  • DRM 架構 API,可透過 Android 向應用程式公開 應用程式架構
  • 提供原生程式碼 DRM 架構,提供 DRM 外掛程式 (代理程式) 的介面 來處理多種數位版權管理配置的版權管理和解密作業。
,瞭解如何調查及移除這項存取權。 Android DRM 架構
圖 2a.Android 11 以下版本的 DRM 架構
Android DRM 架構
圖 2b.從 Android 11 開始採用的 DRM 架構

請參閱 Android 媒體 DRM Android Media Crypto

DRM 外掛程式

系統啟動時,DRM 架構會掃描 HAL 執行個體/服務 (如 .rc 檔案中所述) 和外掛程式建立媒體 DRM 伺服器 (mediadrmserver) CryptoHalDrmHal 物件 CryptoHalDrmHal,然後呼叫外掛程式與供應商 - 特定實作項目

外掛程式應實作繫結器 HAL。繫結化 HAL 會使用 Android 介面定義語言 (AIDL), 這樣就能取代架構,而不必重新建構 HAL。

外掛程式是由廠商或 SOC 製造商建構,並放入 /vendor 分區 裝置。搭載 Android 13 以上版本的所有裝置都必須支援已編寫的繫結化 HAL AIDL 語言模型

實作

適用於 Android 13 的 GMS 和 Android 開放原始碼計畫裝置必須使用 AIDL 介面。

如何透過外掛程式實作新的 DRM 架構 API:

  1. 在裝置的建構檔案中新增外掛程式服務。
  2. 更新裝置資訊清單。
  3. 新增 SELinux 權限。
  4. /vendor 底下建立 .rc 檔案。
  5. 實作外掛程式。

API 是在各 IDrmPlugin.aidl 版本中定義 ICryptoPlugin.aidlIDrmFactory.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 權限

  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 Init Language 瞭解詳情。

實作外掛程式

  1. 在���掛程式的 service.cpp 中實作 main() 進入點 課程中也會快速介紹 Memorystore 這是 Google Cloud 的全代管 Redis 服務
  2. 導入 ICryptoPluginIDrmPluginICryptoFactoryIDrmFactory
  3. 在外掛程式中實作新的 API。

DRM 外掛程式詳細資料

DRM 外掛程式廠商可以實作 DrmFactoryCryptoFactory 和 DRM 外掛程式。

乳廠

DrmHal 類別會搜尋已註冊的 DRM 外掛程式服務和結構 可透過 DrmFactory 支援特定加密配置的對應外掛程式 類別

IDrmFactory 是與供應商 Drm HAL 互動的主要進入點 並透過 createPlugin API 進行上述操作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 指定的媒體容器格式。

::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 檔案。