
En este documento, se proporciona una descripción general del framework de administración de derechos digitales (DRM) de Android y se presentan las interfaces que debe implementar un complemento de DRM. En este documento, no se describen las reglas de robustez ni de cumplimiento que puede definir un esquema de DRM.
Framework
La plataforma de Android proporciona un framework de DRM extensible que permite a las apps administrar contenido protegido por derechos según las restricciones de licencia asociadas con el contenido. El framework de DRM admite muchos esquemas de DRM. El fabricante del dispositivo determina qué esquemas de DRM admite. El framework de DRM proporciona una interfaz unificada para los desarrolladores de aplicaciones y oculta la complejidad de las operaciones de DRM. El framework de DRM proporciona un modo de operación coherente para el contenido protegido y no protegido. Los esquemas de DRM pueden definir modelos de uso complejos según los metadatos de la licencia. El framework de DRM proporciona la asociación entre el contenido y la licencia de DRM, y controla la administración de derechos. Esto permite que el reproductor multimedia se abstraiga del contenido protegido o no por DRM. Consulta MediaDrm para obtener la clase que permite obtener claves para desencriptar transmisiones de contenido multimedia protegidas.


La disponibilidad de contenido digital enriquecido es importante para los usuarios que usan dispositivos móviles. Para que su contenido esté disponible en todo el mundo, los desarrolladores de Android y los publicadores de contenido digital necesitan una implementación de la DRM coherente que sea compatible con todo el ecosistema de Android. Para que ese contenido digital esté disponible en dispositivos Android y garantizar que haya al menos un DRM coherente disponible en todos los dispositivos, Google proporciona DRM sin tarifas de licencia en dispositivos Android compatibles. El complemento de DRM está integrado en el framework de DRM de Android y puede usar protección con copia de seguridad de hardware para proteger el contenido premium y las credenciales del usuario.
La protección de contenido que proporciona el complemento de DRM depende de las capacidades de seguridad y protección de contenido de la plataforma de hardware subyacente. Las funciones de hardware del dispositivo deben incluir un inicio seguro de hardware para establecer una cadena de confianza de seguridad y protección de claves criptográficas. Las capacidades de protección de contenido del dispositivo deben incluir la protección de los fotogramas desencriptados en el dispositivo y la protección del contenido a través de un mecanismo de protección de salida confiable. No todas las plataformas de hardware admiten todas las funciones de seguridad y protección de contenido anteriores. La seguridad nunca se implementa en un solo lugar de la pila, sino que se basa en la integración de hardware, software y servicios. La combinación de funciones de seguridad de hardware, un mecanismo de inicio de confianza y un SO seguro y aislado para controlar las funciones de seguridad es fundamental para proporcionar un dispositivo seguro.
Arquitectura
El framework de DRM está diseñado para ser independiente de la implementación y abstrae los detalles de la implementación específica del esquema de DRM en un complemento de DRM específico del esquema. El framework de DRM incluye APIs simples para controlar operaciones de DRM complejas, adquirir licencias, aprovisionar el dispositivo, asociar el contenido de DRM y su licencia, y, por último, desencriptar el contenido de DRM.
El framework de DRM de Android se implementa en dos capas arquitectónicas:
- Una API de framework de DRM, que se expone a las apps a través del framework de aplicaciones de Android
- Un framework de DRM de código nativo, que expone una interfaz para que los complementos (agentes) de DRM controlen la administración de derechos y la desencriptación de varios esquemas de DRM.


Consulta Android Media DRM y Android Media Crypto para obtener más información.
Complementos de DRM
Cuando se inicia el sistema, el framework de DRM busca instancias o servicios de HAL (que se describen en los archivos .rc
) y se descubren los complementos. El servidor de DRM de contenido multimedia (mediadrmserver
) crea objetos CryptoHal
y DrmHal
.
Luego, CryptoHal
y DrmHal
llaman a los complementos con implementaciones específicas del proveedor.
Los complementos deben implementar HALs vinculados. Los HAL vinculados usan el Lenguaje de definición de la interfaz de Android (AIDL), que permite reemplazar el framework sin tener que volver a compilar los HAL.
Los proveedores o los creadores de SoC compilan los complementos y los colocan en una partición /vendor
en el dispositivo. Todos los dispositivos que se lancen con Android 13 o versiones posteriores deben admitir HALs vinculados escritos en el lenguaje AIDL.
Implementación
Los dispositivos GMS y AOSP lanzados para Android 13 deben usar la interfaz AIDL.
Para implementar nuevas APIs de frameworks de DRM con un complemento, haz lo siguiente:
- Agrega el servicio de complementos a los archivos de compilación del dispositivo.
- Actualiza el manifiesto del dispositivo.
- Agrega permisos de SELinux.
- Crea un archivo
.rc
en/vendor
. - Implementa el complemento.
Las APIs se definen en cada versión de IDrmPlugin.aidl
,
ICryptoPlugin.aidl
, IDrmFactory.aidl
y
ICryptoFactory.aidl
.
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Agrega el servicio del complemento a los archivos de compilación del dispositivo
Por ejemplo, para agregar compatibilidad con la interfaz AIDL, el archivo VENDOR DEVICE/device.mk
debe incluir los paquetes android.hardware.drm-service.*
:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Actualiza el manifiesto del dispositivo
El archivo vendor manifest.xml
del dispositivo debe incluir las siguientes entradas:
<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>
La STABLE AIDL VERSION es el número de versión de cada versión de la API de AIDL (p.ej., 1, 2). Como alternativa, te recomendamos que uses vintf_fragments.
Agrega permisos de SELinux
- Agregar a
VENDOR DEVICE/sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Agregar a
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 - Agregar a
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)
Crea un archivo RC en /vendor.
El archivo .rc
especifica las acciones que se deben realizar cuando se inicia un servicio.
Consulta Lenguaje de inicialización de Android para obtener más información.
Implementa el complemento
- Implementa el punto de entrada
main()
enservice.cpp
del servicio del complemento. - Implementa
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
yIDrmFactory
. - Implementa las nuevas APIs en el complemento.
Detalles del complemento de DRM
Los proveedores de complementos de DRM implementan DrmFactory
, CryptoFactory
y el complemento de DRM.
DrmFactory
La clase DrmHal
busca servicios de complementos de DRM registrados y construye los complementos correspondientes que admiten un esquema criptográfico determinado a través de la clase DrmFactory
.
IDrmFactory es el punto de entrada principal para interactuar con el HAL de drm de un proveedor a través de la API de createPlugin. La API de createPlugin se usa para crear instancias de IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes muestra una lista de esquemas de criptografía compatibles para la instancia de HAL de drm de AIDL.
::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);
Determina si la fábrica de complementos puede crear complementos de DRM que admitan un esquema de criptografía determinado, que se especifica con un UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Determina si la fábrica de complementos puede crear complementos de DRM que admitan un formato de contenedor multimedia determinado que especifique 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);
Crea un complemento de DRM para el esquema de criptografía especificado por UUID.
CryptoFactory
La clase CryptoHal
busca servicios de complementos de DRM registrados y construye los complementos correspondientes que admiten un esquema criptográfico determinado a través de la clase CryptoFactory
.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Determina si la fábrica de criptografía puede crear complementos de criptografía que admitan un esquema de criptografía determinado, que se especifica con un 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);
Determina si la fábrica de complementos puede crear complementos de criptografía que admitan un esquema de criptografía determinado, que se especifica con un UUID.
APIs de complementos de DRM
Las APIs se definen enhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
. El archivo IDrmPlugin.h
correspondiente se puede encontrar en out/Soong después de la compilación.