![Ícono de HAL DRM de Android](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_hal_drm.png?authuser=2&hl=es-419)
Este documento proporciona una descripción general del marco de gestión de derechos digitales (DRM) de Android y presenta las interfaces que debe implementar un complemento DRM. Este documento no describe las reglas de solidez ni las reglas de cumplimiento que pueden definirse mediante un esquema DRM.
Estructura
La plataforma Android proporciona un marco DRM extensible que permite que las aplicaciones administren contenido protegido por derechos de acuerdo con las restricciones de licencia asociadas con el contenido. El marco DRM admite muchos esquemas DRM; qué esquemas DRM admite un dispositivo depende del fabricante del dispositivo. El marco DRM proporciona una interfaz unificada para los desarrolladores de aplicaciones y oculta la complejidad de las operaciones DRM. El marco DRM proporciona un modo de operación consistente para contenido protegido y no protegido. Los esquemas DRM pueden definir modelos de uso complejos por metadatos de licencia. El marco DRM proporciona la asociación entre el contenido DRM y la licencia, y maneja la gestión de derechos. Esto permite que el reproductor multimedia se abstraiga del contenido protegido o no protegido por DRM. Consulte MediaDrm para conocer la clase para obtener claves para descifrar flujos de medios protegidos.
![HAL DRM de Android](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm.png?authuser=2&hl=es-419)
![Android DRM HAL publicar R](https://source.android.google.cn/static/docs/core/media/images/aidl-ape_fwk_drm_postQ.png?authuser=2&hl=es-419)
La disponibilidad de contenido digital enriquecido es importante para los usuarios de dispositivos móviles. Para que su contenido esté ampliamente disponible, los desarrolladores de Android y los editores de contenido digital necesitan una implementación de DRM consistente compatible con todo el ecosistema de Android. Para que el 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 cargos de licencia en dispositivos Android compatibles. El complemento DRM está integrado con el marco DRM de Android y puede usar protección respaldada por hardware para asegurar contenido premium y credenciales de usuario.
La protección de contenido proporcionada por el complemento DRM depende de las capacidades de seguridad y protección de contenido de la plataforma de hardware subyacente. Las capacidades de hardware del dispositivo deben incluir arranque 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 marcos descifrados en el dispositivo y la protección de 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 arranque confiable y un sistema operativo seguro aislado para manejar las funciones de seguridad es fundamental para proporcionar un dispositivo seguro.
Arquitectura
El marco DRM está diseñado para ser independiente de la implementación y abstrae los detalles de la implementación del esquema DRM específico en un complemento DRM específico del esquema. El marco DRM incluye API simples para manejar operaciones DRM complejas, adquirir licencias, aprovisionar el dispositivo, asociar contenido DRM y su licencia y, finalmente, descifrar contenido DRM.
El marco DRM de Android se implementa en dos capas arquitectónicas:
- Una API de marco DRM, que se expone a las aplicaciones a través del marco de aplicaciones de Android.
- Un marco DRM de código nativo, que expone una interfaz para complementos DRM (agentes) para manejar la gestión de derechos y el descifrado para varios esquemas DRM.
![Marco DRM de Android](https://source.android.google.cn/static/docs/shared-images/ape_fwk_drm_2.png?authuser=2&hl=es-419)
![Marco DRM de Android](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm_2_postO.png?authuser=2&hl=es-419)
Consulte Android Media DRM y Android Media Crypto para obtener más detalles.
Complementos DRM
Al iniciar el sistema, el marco DRM busca instancias/servicios HAL (descritos en archivos .rc
) y se descubren complementos. Media DRM Server ( mediadrmserver
) crea objetos CryptoHal
y DrmHal
. CryptoHal
y DrmHal
luego llaman a los complementos con implementaciones específicas del proveedor.
Los complementos deben implementar HAL encuadernados. Las HAL enlazadas usan el lenguaje de definición de interfaz de Android (AIDL) , que permite reemplazar el marco sin tener que reconstruir las HAL.
Los complementos son creados por proveedores o creadores de SOC y se colocan en una partición /vendor
en el dispositivo. Todos los dispositivos que se inicien con Android 13 o superior deben admitir HAL encuadernados escritos en el lenguaje AIDL.
Implementación
La versión de dispositivos GMS y AOSP para Android 13 debe usar la interfaz AIDL.
Para implementar nuevas API de marcos DRM mediante un complemento:
- Agregue el servicio de complemento a los archivos de compilación del dispositivo.
- Actualice el manifiesto del dispositivo.
- Agregue permisos de SELinux.
- Cree un archivo
.rc
en/vendor
. - Implementar el complemento.
Las API se definen en cada versión de IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
e ICryptoFactory.aidl
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Agregue el servicio de 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
Actualizar el manifiesto del dispositivo
El archivo vendor manifest.xml
para el 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 VERSIÓN ESTABLE DE AIDL es el número de versión de cada versión de la API de AIDL (p. ej., 1, 2). Alternativamente, recomendamos usar vintf_fragments.
Agregar 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 - Añadir
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)
Cree un archivo RC en /proveedor
El archivo .rc
especifica las acciones que se realizarán cuando se inicie un servicio.
Consulte Idioma de inicio de Android para obtener más detalles.
Implementar el complemento
- Implemente el punto de entrada
main()
enservice.cpp
del servicio de complemento. - Implemente
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
eIDrmFactory
. - Implemente las nuevas API en el complemento.
Detalles del complemento DRM
Los proveedores de complementos DRM implementan DrmFactory
, CryptoFactory
y complementos DRM.
Drm Factory
La clase DrmHal
busca servicios de complementos DRM registrados y construye los complementos correspondientes que admiten un esquema criptográfico dado a través de la clase DrmFactory
.
IDrmFactory es el principal punto de entrada para interactuar con el drm HAL de un proveedor a través de la API createPlugin. La API createPlugin se utiliza para crear instancias de IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes devuelve una lista de esquemas criptográficos admitidos para la instancia 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);
Determina si la fábrica de complementos puede construir complementos DRM que admitan un esquema criptográfico determinado, que se especifica mediante un UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Determina si la fábrica de complementos puede construir complementos DRM que admitan un formato de contenedor de medios dado especificado por 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);
Construye un complemento DRM para el esquema criptográfico especificado por UUID.
CriptoFábrica
La clase CryptoHal
busca servicios de complementos DRM registrados y construye los complementos correspondientes que admiten un esquema criptográfico dado 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 cifrado puede construir complementos de cifrado que admitan un esquema de cifrado determinado, que se especifica mediante 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 construir complementos criptográficos que admitan un esquema criptográfico determinado, que se especifica mediante un UUID.
API de complemento DRM
Las API 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 after the build.