
このドキュメントでは、Android Digital Rights Management(DRM)フレームワークの概要と、DRM プラグインが実装する必要があるインターフェースについて説明します。DRM スキームによって定義される堅牢性ルールやコンプライアンス ルールについては説明しません。
フレームワーク
Android プラットフォームは、コンテンツに関連付けられたライセンス制約に従って、アプリが著作権で保護されたコンテンツを管理できる、拡張可能な DRM フレームワークを提供します。DRM フレームワークは多くの DRM スキームをサポートしています。デバイスがサポートする DRM スキームはデバイス メーカーによります。DRM フレームワークは、アプリケーション デベロッパーに統一インターフェースを提供し、DRM オペレーションの複雑さを軽減します。また、保護されたコンテンツと保護されていないコンテンツに対して一貫性のある操作モードを提供します。DRM スキームでは、ライセンス メタデータによって複雑な使用モデルを定義できます。DRM フレームワークは、DRM コンテンツとライセンス間の関連付けを提供し、著作権管理を扱います。これにより、DRM で保護されたコンテンツまたは保護されていないコンテンツからメディア プレーヤーを抽象化できます。保護されたメディア ストリームを復号化するための鍵を取得するクラスについては、MediaDrm をご覧ください。

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

詳しくは、Android Media DRM と Android Media 暗号化をご覧ください。
DRM プラグイン
システムの起動時に、DRM フレームワークは HAL インスタンス / サービス(.rc
ファイルに記載)をスキャンし、HIDL レジストリを介してプラグインが検出されます。Media DRM サーバー(mediadrmserver
)は、CryptoHal
と DrmHal
の両方のオブジェクトを作成します。
その後、CryptoHal
と DrmHal
はベンダー固有の実装でプラグインを呼び出します。
プラグインでは、Binder 化された HAL を実装する必要があります。Binder 化された HAL は HAL インターフェース定義言語(HIDL)を使用します。これにより、HAL を再構築せずに Android フレームワークの置き換えができます。
プラグインはベンダーや SOC メーカーによってビルドされ、デバイスの /vendor
パーティションに配置されます。Android 8.0 以降を搭載するすべてのデバイスでは、HIDL 言語で書かれた Binder 化された HAL をサポートする必要があります。
実装
プラグインによって新しい DRM フレームワーク API を実装するには:
- プラグイン サービスをデバイスのビルドファイルに追加します。
- デバイス マニフェストを更新します。
- SELinux の権限を追加します。
/vendor
下に.rc
ファイルを作成します。- プラグインを実装します。
新しい API は、iDrmPlugin.hal
と iCryptoPlugin.hal
で定義されています。
PLATFORM_ROOT/hardware/interfaces/drm/VERSION/
デバイスのビルドファイルへのプラグイン サービスの追加
たとえば、インターフェース 1.2 のサポートを追加するには、VENDOR DEVICE/device.mk
ファイルに android.hardware.drm@1.2-service.*
パッケージを含める必要があります。
PRODUCT_PACKAGES += \ android.hardware.drm@1.0-impl \ android.hardware.drm@1.0-service \ android.hardware.drm@1.2-service.clearkey \ android.hardware.drm@1.2-service.widevine
デバイス マニフェストの更新
デバイスの vendor manifest.xml
ファイルには、次のエントリが含まれている必要があります。
android.hardware.drm hwbinder 1.0 ICryptoFactory default IDrmFactory default @1.2::ICryptoFactory/clearkey @1.2::IDrmFactory/clearkey @1.2::ICryptoFactory/widevine @1.2::IDrmFactory/widevine
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@1\.2-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0device/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 Init 言語をご覧ください。
プラグインの実装
- プラグイン サービスの
service.cpp
にmain()
エントリ ポイントを実装します。 CryptoFactory
とDrmFactory
を実装します。- 新しい API をプラグインに実装します。
DRM プラグインの詳細
DRM プラグイン ベンダーは、DrmFactory
、CryptoFactory
、DRM プラグインを実装します。
DrmFactory
DrmHal
クラスは登録された DRM プラグイン サービスを検索し、対応するプラグインを構築します。このプラグインは、DrmFactory
クラスを通じて特定の暗号化方式をサポートします。
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
プラグイン ファクトリにより、特定の暗号化方式(UUID で指定)をサポートする DRM プラグインを構築できるかどうかが決定されます。
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 プラグインを構築します。
CryptoFactory
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 で指定)をサポートする暗号化プラグインを構築できるかどうかが決定されます。
DRM プラグイン
API はhardware/interfaces/drm/VERSION
/IDrmPlugin.hal
で定義されています。対応する IDrmPlugin.h
ファイルは、ビルド後の out/Soong にあります。