
Auf dieser Seite finden Sie einen Überblick über das Android-DRM-Framework (Digital Rights Management) und die Schnittstellen, die ein DRM-Plug-in implementieren muss. Auf dieser Seite werden keine Robustheits- oder Compliance-Regeln beschrieben, die von einem DRM-Schema definiert werden können.
Framework
Die Android-Plattform bietet ein erweiterbares DRM-Framework, mit dem Apps urheberrechtlich geschützte Inhalte gemäß den mit den Inhalten verbundenen Lizenzeinschränkungen verwalten können. Das DRM-Framework unterstützt viele DRM-Schemas. Der Gerätehersteller bestimmt, welche DRM-Schemas ein Gerät unterstützt. Das DRM-Framework bietet eine einheitliche Oberfläche für App-Entwickler und verdeckt die Komplexität der DRM-Vorgänge. Das DRM-Framework bietet einen einheitlichen Betriebsmodus für geschützte und nicht geschützte Inhalte. Mit DRM-Schemas können komplexe Nutzungsmodelle anhand von Lizenzmetadaten definiert werden. Das DRM-Framework stellt die Verknüpfung zwischen DRM-Inhalten und Lizenz her und verwaltet die Rechte. So kann der Mediaplayer von DRM-geschützten oder nicht geschützten Inhalten abstrahiert werden. Unter MediaDrm findest du Informationen zur Klasse, mit der Schlüssel zum Entschlüsseln geschützter Medienstreams abgerufen werden.
Abbildung 1 zeigt die DRM-Hardware-Extraktionsebene vor Android 11 und Abbildung 2 die Ebene in Android 11 und höher:
Abbildung 1: DRM-Hardwareabstraktionsschicht vor Android 11
Abbildung 2: DRM-Hardwareabstraktionsschicht ab Android 11
Die Verfügbarkeit umfangreicher digitaler Inhalte ist für Nutzer auf Mobilgeräten wichtig. Damit ihre Inhalte weithin verfügbar sind, benötigen Android-Entwickler und Publisher digitaler Inhalte eine einheitliche DRM-Implementierung, die im gesamten Android-Ökosystem unterstützt wird. Damit diese digitalen Inhalte auf Android-Geräten verfügbar sind und es mindestens eine einheitliche digitale Rechteverwaltung für alle Geräte gibt, stellt Google auf kompatiblen Android-Geräten eine digitale Rechteverwaltung ohne Lizenzgebühren zur Verfügung. Das DRM-Plug-in ist in das Android-DRM-Framework eingebunden und kann Premiuminhalte und Nutzeranmeldedaten mit hardwaregestütztem Schutz sichern.
Der vom DRM-Plug-in bereitgestellte Inhaltsschutz hängt von den Sicherheits- und Inhaltsschutzfunktionen der zugrunde liegenden Hardwareplattform ab. Die Hardwarefunktionen des Geräts sollten einen sicheren Start umfassen, um eine Vertrauenskette für die Sicherheit und den Schutz kryptografischer Schlüssel zu schaffen. Die Funktionen zum Schutz von Inhalten des Geräts sollten den Schutz von entschlüsselten Frames auf dem Gerät und den Schutz von Inhalten durch einen vertrauenswürdigen Schutzmechanismus für die Ausgabe umfassen. 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 für die Verarbeitung von Sicherheitsfunktionen ist entscheidend für ein sicheres Gerät.
Architektur
Das DRM-Framework ist implementierungsunabhängig und abstrahiert die Details der Implementierung des jeweiligen DRM-Schemas in einem schemaspezifischen DRM-Plug-in. Das DRM-Framework enthält einfache APIs, mit denen komplexe DRM-Vorgänge verarbeitet, Lizenzen erworben, das Gerät bereitgestellt, DRM-Inhalte und die zugehörige Lizenz verknüpft und schließlich DRM-Inhalte entschlüsselt werden können.
Das Android-DRM-Framework ist in zwei Architekturschichten implementiert:
- Eine DRM-Framework-API, die Apps über das Android-App-Framework zur Verfügung gestellt wird
- Ein natives DRM-Framework, das eine Schnittstelle für DRM-Plug-ins (Agenten) bereitstellt, um die Rechteverwaltung und Entschlüsselung für verschiedene DRM-Schemata zu verarbeiten
Abbildung 3 zeigt das DRM-Framework vor Android 11 und Abbildung 4 das Framework in Android 11 und höher:
Abbildung 3: DRM-Framework vor Android 11
Abbildung 4: DRM-Framework ab Android 11
Weitere Informationen finden Sie unter MediaDrm und MediaCrypto.
DRM-Plug-ins
Beim Systemstart sucht das DRM-Framework nach HAL-Instanzen und ‑Diensten (in .rc
-Dateien beschrieben) und erkennt Plugins. Der Media-DRM-Server (mediadrmserver
) erstellt sowohl CryptoHal
- als auch DrmHal
-Objekte.
CryptoHal
und DrmHal
rufen dann die Plug-ins mit anbieterspezifischen Implementierungen auf.
Plug-ins sollten binderisierte HALs implementieren. Für gebundene HALs wird die Android Interface Definition Language (AIDL) verwendet. So kann das Framework ersetzt werden, 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 auf den Markt gebracht werden, müssen binderisierte HALs unterstützen, die in der AIDL-Sprache geschrieben sind.
Implementierung
So implementierst du neue APIs für DRM-Frameworks über ein Plug-in:
- Fügen Sie den Build-Dateien des Geräts den Plug-in-Dienst hinzu.
- Aktualisieren Sie das Gerätemanifest.
- Fügen Sie SELinux-Berechtigungen hinzu.
- Erstellen Sie unter
/vendor
eine.rc
-Datei. - Implementieren Sie das Plug-in.
APIs werden in jeder Version von IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
und ICryptoFactory.aidl
definiert.
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Plug-in-Dienst zu Geräte-Build-Dateien hinzufügen
Wenn Sie beispielsweise die Unterstützung der AIDL-Schnittstelle hinzufügen möchten, muss die VENDOR DEVICE/device.mk
-Datei die android.hardware.drm-service.*
-Pakete enthalten:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Gerätemanifest aktualisieren
Die vendor manifest.xml
-Datei 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 jedes AIDL API-Releases (z. B. 1, 2).
Alternativ empfehlen wir die Verwendung von vintf_fragments
.
SELinux-Berechtigungen hinzufügen
- Fügen Sie
VENDOR DEVICE/sepolicy/vendor/file.te
Berechtigungen hinzu:
type mediadrm_vendor_data_file, file_type, data_file_type;
- Fügen Sie
VENDOR DEVICE/sepolicy/vendor/file_contexts
Berechtigungen hinzu:
/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 - Fügen Sie
device/sepolicy/vendor/hal_drm_clearkey.te
Berechtigungen hinzu:
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.
In der .rc
-Datei werden die Aktionen festgelegt, die beim Starten eines Dienstes ausgeführt werden sollen.
Weitere Informationen finden Sie unter Android Init Language.
Plug-in implementieren
- Implementiere den
main()
-Einstiegspunkt inservice.cpp
des Plug-in-Dienstes. - Implementieren Sie
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
undIDrmFactory
. - Implementieren Sie die neuen APIs im Plug-in.
Details zum DRM-Plug-in
Anbieter von DRM-Plug-ins implementieren DrmFactory
, CryptoFactory
und das DRM-Plug-in.
Klasse DrmFactory
Die Klasse DrmHal
sucht nach registrierten DRM-Plug-in-Diensten und erstellt entsprechende Plug-ins, die über die Klasse DrmFactory
ein bestimmtes Kryptoschema unterstützen.
IDrmFactory
ist der Haupteinstiegspunkt für die Interaktion mit der DRM-HAL eines Anbieters über die Methode createPlugin
. Verwenden Sie diese Methode, um IDrmPlugin
-Instanzen zu erstellen.
::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. Diese Sequenz bestimmt, ob die Plug-in-Fabrik DRM-Plug-ins erstellen kann, die ein bestimmtes Kryptoschema unterstützen, das durch eine UUID angegeben wird:
::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);
Mit dieser Sequenz wird festgelegt, ob die Plug-in-Fabrik DRM-Plug-ins erstellen kann, die ein bestimmtes Mediencontainerformat unterstützen, das durch mimeType
angegeben ist:
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Mit dieser Sequenz wird ein DRM-Plug-in für das mit der UUID angegebene Kryptoschema erstellt:
::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);
Klasse CryptoFactory
Die Klasse CryptoHal
sucht nach registrierten DRM-Plug-in-Diensten und erstellt entsprechende Plug-ins, die über die Klasse CryptoFactory
ein bestimmtes Kryptoschema unterstützen.
Diese Sequenz bestimmt, ob die Krypto-Factory Krypto-Plug-ins erstellen kann, die ein bestimmtes Krypto-Schema unterstützen, das durch eine UUID angegeben wird:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Diese Sequenz bestimmt, ob die Plug-in-Fabrik Crypto-Plug-ins erstellen kann, die ein bestimmtes Crypto-Schema 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);
DRM-Plug-in-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
.