![Android DRM HAL-Symbol](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_hal_drm.png?authuser=9&hl=de)
Dieses Dokument bietet einen Überblick über das Android Digital Rights Management (DRM)-Framework und stellt die Schnittstellen vor, die ein DRM-Plugin implementieren muss. Dieses Dokument beschreibt keine Robustheitsregeln oder Compliance-Regeln, die durch ein DRM-Schema definiert werden können.
Rahmen
Die Android-Plattform bietet ein erweiterbares DRM-Framework, mit dem Apps rechtegeschützte Inhalte entsprechend den mit den Inhalten verbundenen Lizenzbeschränkungen verwalten können. Das DRM-Framework unterstützt viele DRM-Schemata; Welche DRM-Schemata ein Gerät unterstützt, liegt beim Gerätehersteller. Das DRM-Framework bietet eine einheitliche Schnittstelle für Anwendungsentwickler und verbirgt die Komplexität von DRM-Vorgängen. Das DRM-Framework bietet einen konsistenten Betriebsmodus für geschützte und nicht geschützte Inhalte. DRM-Systeme können anhand von Lizenzmetadaten komplexe Nutzungsmodelle definieren. Das DRM-Framework stellt die Verknüpfung zwischen DRM-Inhalt und Lizenz her und übernimmt die Rechteverwaltung. Dadurch kann der Media Player von DRM-geschützten oder nicht geschützten Inhalten abstrahiert werden. Informationen zur Klasse zum Abrufen von Schlüsseln zum Entschlüsseln geschützter Medienströme finden Sie unter MediaDrm .
![Android DRM HAL](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm.png?authuser=9&hl=de)
![Android DRM HAL nach R](https://source.android.google.cn/static/docs/core/media/images/aidl-ape_fwk_drm_postQ.png?authuser=9&hl=de)
Die Verfügbarkeit umfangreicher digitaler Inhalte ist für Benutzer mobiler Geräte wichtig. Um ihre Inhalte allgemein verfügbar zu machen, benötigen Android-Entwickler und Herausgeber digitaler Inhalte eine konsistente DRM-Implementierung, die im gesamten Android-Ökosystem unterstützt wird. Um diese digitalen Inhalte auf Android-Geräten verfügbar zu machen und sicherzustellen, dass auf allen Geräten mindestens ein konsistentes DRM verfügbar ist, stellt Google DRM ohne Lizenzgebühren auf kompatiblen Android-Geräten bereit. Das DRM-Plugin ist in das Android DRM-Framework integriert und kann einen hardwaregestützten Schutz nutzen, um Premium-Inhalte und Benutzeranmeldeinformationen zu schützen.
Der vom DRM-Plugin bereitgestellte Inhaltsschutz hängt von den Sicherheits- und Inhaltsschutzfunktionen der zugrunde liegenden Hardwareplattform ab. Zu den Hardwarefunktionen des Geräts sollte ein Hardware-Secure-Boot gehören, um eine Vertrauenskette für Sicherheit und Schutz kryptografischer Schlüssel aufzubauen. Zu den Inhaltsschutzfunktionen des Geräts sollten der Schutz entschlüsselter Frames im Gerät und der Inhaltsschutz durch einen vertrauenswürdigen Ausgabeschutzmechanismus gehören. Nicht alle Hardwareplattformen unterstützen alle oben genannten Sicherheits- und Inhaltsschutzfunktionen. Sicherheit wird nie an einer einzigen Stelle im Stack implementiert, sondern basiert auf der Integration von Hardware, Software und Diensten. Die Kombination aus Hardware-Sicherheitsfunktionen, einem vertrauenswürdigen Boot-Mechanismus und einem isolierten sicheren Betriebssystem zur Handhabung von Sicherheitsfunktionen ist entscheidend für die Bereitstellung eines sicheren Geräts.
Die Architektur
Das DRM-Framework ist implementiertungsunabhängig und abstrahiert die Details der spezifischen DRM-Schema-Implementierung in einem schemaspezifischen DRM-Plugin. Das DRM-Framework umfasst einfache APIs zur Abwicklung komplexer DRM-Vorgänge, zum Erwerb von Lizenzen, zur Bereitstellung des Geräts, zur Zuordnung von DRM-Inhalten und seiner Lizenz und schließlich zur Entschlüsselung von DRM-Inhalten.
Das Android DRM-Framework ist in zwei Architekturschichten implementiert:
- Eine DRM-Framework-API, die über das Android-Anwendungsframework für Apps verfügbar gemacht wird.
- Ein DRM-Framework mit nativem Code, das eine Schnittstelle für DRM-Plugins (Agenten) bereitstellt, um die Rechteverwaltung und Entschlüsselung für verschiedene DRM-Schemata zu übernehmen.
![Android DRM-Framework](https://source.android.google.cn/static/docs/shared-images/ape_fwk_drm_2.png?authuser=9&hl=de)
![Android DRM-Framework](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm_2_postO.png?authuser=9&hl=de)
Weitere Informationen finden Sie unter Android Media DRM und Android Media Crypto .
DRM-Plugins
Beim Systemstart sucht das DRM-Framework nach HAL-Instanzen/-Diensten (beschrieben in .rc
Dateien) und Plugins werden erkannt. Der Medien-DRM-Server ( mediadrmserver
) erstellt sowohl CryptoHal
als auch DrmHal
-Objekte. CryptoHal
und DrmHal
rufen dann die Plugins mit herstellerspezifischen Implementierungen auf.
Plugins sollten binderisierte HALs implementieren. Binderisierte HALs verwenden die Android Interface Definition Language (AIDL) , wodurch das Framework ersetzt werden kann, ohne dass HALs neu erstellt werden müssen.
Plugins werden von Anbietern oder SOC-Herstellern erstellt und in einer /vendor
Partition auf dem Gerät abgelegt. Alle Geräte, die mit Android 13 oder höher gestartet werden, müssen binderisierte HALs unterstützen, die in der AIDL-Sprache geschrieben sind.
Implementierung
GMS- und AOSP-Geräte, die für Android 13 veröffentlicht werden, müssen die AIDL-Schnittstelle verwenden.
So implementieren Sie neue DRM-Frameworks-APIs durch ein Plugin:
- Fügen Sie den Build-Dateien des Geräts einen Plugin-Dienst hinzu.
- Aktualisieren Sie das Gerätemanifest.
- Fügen Sie SELinux-Berechtigungen hinzu.
- Erstellen Sie eine
.rc
Datei unter/vendor
. - Implementieren Sie das Plugin.
APIs sind in jeder Version von IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
und ICryptoFactory.aidl
definiert
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Plugin-Dienst zu Geräte-Build-Dateien hinzufügen
Um beispielsweise AIDL-Schnittstellenunterstützung hinzuzufügen, muss die Datei VENDOR DEVICE /device.mk
die Pakete android.hardware.drm-service.*
enthalten:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Aktualisieren Sie das Gerätemanifest
Die vendor manifest.xml
für das Gerät muss die folgenden Einträge enthalten:
<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>
Die STABILE AIDL-VERSION ist die Versionsnummer jeder AIDL-API-Version (z. B. 1, 2). Alternativ empfehlen wir die Verwendung von vintf_fragments.
Fügen Sie SELinux-Berechtigungen hinzu
- Zu
VENDOR DEVICE /sepolicy/vendor/file.te
hinzufügen
type mediadrm_vendor_data_file, file_type, data_file_type;
- Zu
VENDOR DEVICE /sepolicy/vendor/file_contexts
hinzufügen
/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 - Zu
device/sepolicy/vendor/hal_drm_clearkey.te
hinzufügen
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)
Erstellen Sie eine RC-Datei unter /vendor
Die .rc
Datei gibt die Aktionen an, die beim Start eines Dienstes ausgeführt werden sollen.
Weitere Informationen finden Sie unter Android Init Language .
Implementieren Sie das Plugin
- Implementieren Sie den
main()
-Einstiegspunkt inservice.cpp
des Plugin-Dienstes. - Implementieren Sie
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
undIDrmFactory
. - Implementieren Sie die neuen APIs im Plugin.
Details zum DRM-Plugin
DRM-Plugin-Anbieter implementieren DrmFactory
, CryptoFactory
und DRM-Plugin.
DrmFactory
Die DrmHal
Klasse sucht nach registrierten DRM-Plugin-Diensten und erstellt über die DrmFactory
Klasse entsprechende Plugins, die ein bestimmtes Kryptoschema unterstützen.
IDrmFactory ist der Haupteinstiegspunkt für die Interaktion mit dem DRM-HAL eines Anbieters über die createPlugin-API. Die createPlugin-API wird zum Erstellen von IDrmPlugin-Instanzen verwendet.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes gibt eine Liste der unterstützten Kryptoschemata für die AIDL drm HAL-Instanz zurück.
::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);
Bestimmt, ob die Plugin-Factory DRM-Plugins erstellen kann, die ein bestimmtes Kryptoschema unterstützen, das durch eine UUID angegeben wird.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Bestimmt, ob die Plugin-Factory DRM-Plugins erstellen kann, die ein bestimmtes Mediencontainerformat unterstützen, das durch mimeType
angegeben wird.
::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);
Konstruiert ein DRM-Plugin für das durch die UUID angegebene Kryptoschema.
CryptoFactory
Die Klasse CryptoHal
sucht nach registrierten DRM-Plugin-Diensten und erstellt über die Klasse CryptoFactory
entsprechende Plugins, die ein bestimmtes Kryptoschema unterstützen.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Bestimmt, ob die Kryptofabrik Krypto-Plugins erstellen kann, die ein bestimmtes Kryptoschema unterstützen, das durch eine UUID angegeben wird.
::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);
Bestimmt, ob die Plugin-Factory in der Lage ist, Krypto-Plugins zu erstellen, die ein bestimmtes Krypto-Schema unterstützen, das durch eine UUID angegeben wird.
DRM-Plugin-APIs
Die APIs sind inhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
definiert. Die entsprechende IDrmPlugin.h
Datei finden Sie nach dem Build in out/Soong.