当前位置:操作系统 > 安卓/Android >>

DRM in Android

DRM in Android
DRM,英文全称为Digital Rights Management,译为数字版权管理。它是目前业界使用非常广泛的一种数字内容版权保护技术。随着知识产权保护受重视的程度日益提高,快速攻城略地得Android智能手机是如何利用DRM来有效保护数字版权的呢?本文将通过剖析Android中的DRM框架以及相关工作流程来向读者揭示DRM的神秘面纱。

一  DRM架构介绍
严格来讲,DRM不是一项技术,而是一类技术。很多机构和联盟都提出过相应的DRM标准[1]。例如Open Mobile Alliance推出的OMA DRM、Marlin Developer Community提出的Marlin DRM,而Google则通过收购Widevine公司推出了Widevine DRM。

从Android智能终端来看,Google的原生Android(Android Open Source Project,简称AOSP)系统仅仅集成了OMA DRM V1的一部分功能,它远未构成一个完整的DRM解决方案。在这种情况下,设备厂商只能根据情况选择合适的DRM解决方案并集成到Android平台中来。例如,手机厂商可以通过Google的授权以获取Widevine DRM对应的软件包从而将Widevine DRM集成到自己的产品中。

为了方便设备厂商的集成,Android设计了一个通用的DRM软件框架,不同的DRM解决方案可通过Plugin的方式集成到Android系统中。图1所示为Android中的DRM软件架构。

 

\

图1  Android中DRM软件架构

由图1可知:

DRM Framework API模块是Framework层暴露给App的接口。该模块中最主要的类是DrmManagerClient。
DRM Framework API模块通过Binder机制和位于drmserver进程(以Android 4.1为例,drmserver的代码位于framework/av/drm/drmserver)中的DRM Manager模块通信。DRM Manager加载并管理系统中所有的DRM插件。
DRM Plugins是真正实现权限管理、数字内容解密等工作的模块。根据DRM标准的不同,这些Plugins的实现亦不相同。另外,一个手机可能会集成多个DRM Plugin。这是因为媒体文件如果采用不同的DRM解决方案进行加密的话,手机在播放它们时,DRM Manager需找到对应的DRM Plugin以进行解密。
图2所示为DRM架构中几个重要的类及其关系。

 

\

图2  Android中DRM架构中重要类图

由图2可知:

FileSource代表一个媒体文件。如果媒体文件中有DRM信息,它将创建一个DrmManagerClient对象。该对象用于处理媒体文件中和DRM相关的操作。DrmManagerClient内部通过DrmManagerClientImpl和位于drmserver进程中的DrmManagerService进行跨Binder通信。
MediaExtractor类封装了用于解析媒体文件中元数据的相关函数。对于DRM来说,系统会根据的DRM种类创建不同的MediaExtractor子类。和FileSource类似,MediaExtractor也通过DrmManagerClient和drmserver通信。
DrmManagerService运行于drmserver进程中,它是整个DRM框架的核心。DrmManagerService借助DrmManager管理系统中的DRM插件。
DRM插件必须实现IDrmEngine接口。为了方便开发者,Android提供了DrmEngineBase类,该类继承了IDrmEngine接口并实现了一些通用的接口函数。这样,DRM Plugin只需要从DrmEngineBase派生即可。
如前文所述,DRM框架中真正完成DRM处理工作的是DRMPlugins,这些Plugins大都需要得到相关机构的授权后才能得到相应的专利代码包。图1中列出了三个DRM Plugin。其中FwdLockEngine(OMA-V1的Forward Lock)由AOSP提供。Marlin Plugin和WidevinePlugin则需要相关DRM机构提供专利代码包。
下面来看看Android中DRM的工作流程。

二  DRM工作流程介绍
2.1  DrmManagerService的初始化
DRM的工作流程和多媒体播放密切相关。首先来了解一下DrmManagerService的创建过程,相关流程如图3所示:

 

\

图3  DrmManagerService启动流程

由图3可知:

DrmManagerService实例对象由drmserver进程在main函数中调用instantiate创建。
DrmManagerService内部会创建一个DrmManager实例对象并调用loadPlugins来加载设备可能提供的DRM Plugin。DRM Plugin通过动态库的方式集成到设置中去。Android 4.1中有两个目录可存放DRM Plugin。一个是/vendor/lib/drm/,例如Widevine对应的libdrmwvmplugin.so一般放在这个目录中。另一个目录是/system/lib/drm/。每一个DRM Plugin对应为一个IDrmManager实例。所有被加载的DRM Plugin由DrmManager来统一管理。
DrmManagerService最后将通过addService把自己注册到Binder系统中以为广大客户端服务。
下面来介绍DRM的工作流程。Android支持的DRM播放方式分为两种:

一种是基于基本码流的(Elementary Stream Based,简称ES Based)播放方式。目前Widevine DRM、Marline DRM都属于这一种类型。
另一种是基于容器的(Container Base)播放方式,目前OMA DRM支持这种方法。
这两种不同的方式在播放流程上不尽相同。下文将以一个播放具有DRM保护的MP4文件为例,介绍DRM的工作流程。首先来看ES BasedDRM媒体播放工作流程

2.2  ES BasedDRM播放流程
ES Based DRM意味着每一个数据基元在播放时都需要解密。这种DRM的媒体文件或流可以使用普通方式正常读取,但读取出来的数据是经过加密的。如果不能对数据正确解密,那么该数据将无易做图常播放。

在播放媒体文件之前,播放器首先要识别该文件是否被DRM保护。如果受DRM保护的话,还行初始化对应的DRM插件。这部分工作所涉及的流程如图4所示:

 

\

图4  ES BasedDRM插件初始化

由图4可知:

MediaExtractor首先通过sniff函数检查媒体内容的类型,然后创建相应的Extractor来分析数据。在DRM检查开启的情况下,SniffDRM函数就会被用来检查文件是否有DRM控制。
SniffDRM将调用DataSource中的DrmInitialization函数,从而在DataSource中创建一个DrmManagerClient实例。如此,MediaExtractor就将DataSource与DrmManagerService联系起来。
DrmInitialization函数非常重要,其主要工作包括:
(1)调用openDecryptSession,该函数内部会根据文件中的DRM信息来初始化正确的DRM Plugin(Widevine、OMV,还是其他DRM类型)。

(2)创建DecryptSession,并将DRM信息封装在DecryptHandler实例中传给FileSource。

DrmInitialization之后,SniffDRM会通过DecryptHandler来判断该文件是否有DRM控制,并分析出该DRM是ES Based,还是Container Based。如果属于ES Based DRM,MediaExtractor会创建一个DRMExtrator,而在DRMExtrator中,会创建一个MPEG4Extractor。
MediaExtrator创建完后,播放器即可开始播放。ES Based DRM播放相关流程如图5所示:

\

图5  ES Based的DRM媒体文件播放流程

图5所示的流程图可分为三个阶段:

第一个阶段是资源初始化过程。该过程中,媒体播放器将通过getTrack以后获取一个媒体文件中代表媒体数据的DRMSource实例,DRMSource只负责DRM的控制和解密,而实际媒体数据的分析仍交给MPEG4Extractor来完成。对于播放器来说,它只和DRMExtrator和DRMSource交互。另外,在这一阶段中,initializeDecryptUnit函数将初始化解密相关的资源。
第二阶段就是媒体数据读取,针对每一个数据基元,DRMExtrator都会先通过MPEG4Extractor取得未解密的原始数据,然后通过decrypt函数来请求DRM Plugin进行解密。解密后的数据会被放到另外一处缓存中供Codec使用。如果解密失败,decrypt将会返回错误,故播放器将无法解析这些数据。
媒体播放完毕后将释放播放资源。和DRM相关的资源将由finalizeDecryptUnit来释放。
回顾上述流程,对ES Based DRM的特点是,不论用户是否有权限,播放器都能读取到媒体数据。

下面来看看Container Based DRM的播放流程。

2.3  Container Based DRM播放流程
和ES Based DRM截然不同的是Container Based DRM。受控于这种DRM管理的媒体文件在被读取时就会进行DRM的权限验证,如果验证失败,则无法从中读取到数据。故Container Based DRM最关键的是其pread接口,相关流程如图6所示:

 

\

图6  ContainerBasedDRM播放流程图

如图6可知:

首先要进行的工

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,