
このドキュメントでは、Android デジタル著作権管理 (DRM) フレームワークの概要を説明し、DRM プラグインが実装する必要があるインターフェイスを紹介します。このドキュメントでは、DRM スキームによって定義される可能性がある堅牢性ルールまたはコンプライアンス ルールについては説明しません。
フレームワーク
Android プラットフォームは、コンテンツに関連付けられたライセンスの制約に従って、アプリが権利保護されたコンテンツを管理できるようにする拡張可能な DRM フレームワークを提供します。 DRM フレームワークは、多くの DRM スキームをサポートしています。デバイスがサポートする DRM スキームは、デバイスの製造元によって異なります。 DRM フレームワークは、アプリケーション開発者に統一されたインターフェイスを提供し、DRM 操作の複雑さを隠します。 DRM フレームワークは、保護されたコンテンツと保護されていないコンテンツに対して一貫した操作モードを提供します。 DRM スキームは、ライセンス メタデータによって複雑な使用モデルを定義できます。 DRM フレームワークは、DRM コンテンツとライセンス間の関連付けを提供し、権利管理を処理します。これにより、DRM で保護されたコンテンツまたは保護されていないコンテンツからメディア プレーヤーを抽象化できます。保護されたメディア ストリームを復号化するためのキーを取得するクラスについては、 MediaDrmを参照してください。


豊富なデジタル コンテンツを利用できることは、モバイル デバイスのユーザーにとって重要です。コンテンツを広く利用できるようにするために、Android デベロッパーとデジタル コンテンツ パブリッシャーは、Android エコシステム全体でサポートされる一貫した DRM 実装を必要としています。そのデジタル コンテンツを Android デバイスで利用できるようにし、すべてのデバイスで少なくとも 1 つの一貫した DRM を利用できるようにするために、Google は互換性のある Android デバイスでライセンス料なしで DRM を提供しています。 DRM プラグインは Android DRM フレームワークと統合されており、ハードウェアに支えられた保護を使用して、プレミアム コンテンツとユーザー資格情報を保護できます。
DRM プラグインによって提供されるコンテンツ保護は、基盤となるハードウェア プラットフォームのセキュリティおよびコンテンツ保護機能に依存します。デバイスのハードウェア機能には、セキュリティの信頼チェーンと暗号化キーの保護を確立するためのハードウェア セキュア ブートが含まれている必要があります。デバイスのコンテンツ保護機能には、デバイス内の復号化されたフレームの保護と、信頼できる出力保護メカニズムによるコンテンツ保護が含まれている必要があります。すべてのハードウェア プラットフォームが上記のセキュリティおよびコンテンツ保護機能をすべてサポートしているわけではありません。セキュリティはスタック内の単一の場所に実装されることはなく、ハードウェア、ソフトウェア、およびサービスの統合に依存しています。ハードウェア セキュリティ機能、トラステッド ブート メカニズム、およびセキュリティ機能を処理するための分離された安全な OS の組み合わせは、安全なデバイスを提供するために重要です。
建築
DRM フレームワークは、実装に依存しないように設計されており、スキーム固有の DRM プラグインで特定の DRM スキーム実装の詳細を抽象化します。 DRM フレームワークには、複雑な DRM 操作を処理し、ライセンスを取得し、デバイスをプロビジョニングし、DRM コンテンツとそのライセンスを関連付け、最終的に DRM コンテンツを復号化するためのシンプルな API が含まれています。
Android DRM フレームワークは、次の 2 つのアーキテクチャ レイヤーで実装されます。
- Android アプリケーション フレームワークを介してアプリに公開される DRM フレームワーク API。
- ネイティブ コードの DRM フレームワーク。DRM プラグイン (エージェント) のインターフェイスを公開して、さまざまな DRM スキームの権利管理と復号化を処理します。


詳細については、 Android Media DRMとAndroid Media Cryptoを参照してください。
DRM プラグイン
システムの起動時に、DRM フレームワークは HAL インスタンス/サービス ( .rc
ファイルに記述) をスキャンし、プラグインが検出されます。メディア DRM サーバー ( mediadrmserver
) は、 CryptoHal
オブジェクトとDrmHal
オブジェクトの両方を作成します。その後、 CryptoHal
とDrmHal
は、ベンダー固有の実装でプラグインを呼び出します。
プラグインは、バインドされた HAL を実装する必要があります。バインダ化された HAL はAndroid Interface Definition Language (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 Init 言語を参照してください。
プラグインの実装
- プラグイン サービスの
service.cpp
にmain()
エントリ ポイントを実装します。 -
ICryptoPlugin
、IDrmPlugin
、ICryptoFactory
、およびIDrmFactory
を実装します。 - プラグインに新しい API を実装します。
DRM プラグインの詳細
DRM プラグイン ベンダーは、 DrmFactory
、 CryptoFactory
、および DRM プラグインを実装しています。
DrmFactory
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
で定義されています。対応するIDrmPlugin.h
ファイルは、ビルド後に out/Soong にあります。