1, 总体
DRM在Android中的支持目前应该有两个部分,一部分是早期版本中就存在的对于OMA DRM 1.0的支持,还有一部分是在Android 4.0版本之后提出来的libDrmFramework,这两个部分我在代码中没有看到交集。我认为libDrmFramework应该是大势所趋,框架才能够把不同的实现统一起来,为上层提供相同的接口,尤其Android系统这种开源的项目,要规范大家的行为就必须把有些东西框架化,进行限制。下面的图大体上体现了这两部分的结构:
相关代码可以再Android的如下目录中找到。
OMA DRM 1.0:
Frameworks/base/media/libdrm/mobile1
Frameworks/base/media/java/android/drm/mobile1
DrmFramework:
Frameworks/av/drm
Frameworks/base/drm/java/android/drm
2, OMA DRM 1.0
OMA DRM 1.0有几种的MIME,具体如下:
1. Forward-Lock
application/vnd.oma.drm.message (.dm)
2. Combineddelivery
application/vnd.oma.drm.message andapplication/vnd.oma.drm.rights+xml (.dm)
3. Separatedelivery
application/vnd.oma.drm.rights+xml, (.dr)
application/vnd.oma.drm.rights+wbxml, (.drc)
application/vnd.oma.drm.content(.dcf)
这个模块中所有的处理都是在session中进行的,通过调用SVC_drm_openSession() 可以打开一个session,drm file依据MIME将在这个session中进行解析,解析的结果将保存在两个文件中,一个是 /data/drm/rights/uid.txt用来保存uid和id的对应关系,uid是一个drm file的唯一标识,还有一个文件 /data/drm/rights/id.info 用来保存right object,这样在下次打开同一个文件的时候就可通过uid找到其rightobject了。关于right object的解析可以参考 drm_relParser() 函数,right object管理在drm_rights_manager.c中实现。如果有一个drm right file,可以直接调用SVC_drm_installRights()进行解析,并把rightobject安装到系统中。
OMA DRM 1.0在Java还是可以看到应用的,具体可以参考Frameworks/base/media/java/android/drm/mobile1/DrmRawContent,支持ringtone和image。
3.DrmFramework
DrmFramework的类图如下:
Drm所有的特性最终都是在plugin中实现的,原生的代码中只是提供了一个框架,实现了两个plugin,这两个plugin并没有太多的实际意义,更多的plugin应该由第三方或者系统提供者提供,上图只是native层的结构,关于Java层的可以参考代码:
Frameworks/base/drm/java/android/drm
在代码中我没有发现对于Java层框架的应用,但是在native层这个框架被应用到了player中,具体类图如下:
SniffDRM() register inDataSource by RegisterDefaultSniffers()
One source set to AwesomePlayer, the finishSetDataSouce_l() will be called
SniffDRM() be called if the MIME of source is unknown
SniffDRM() callsource-> DrmInitialization(), then one drm session will be opened
mDectyptHandle be set inChromiumHTTPDataSource or NuCachedSource2 if the plugin detect the MIME successful
DRMExtractor be createdby MediaExtractor::Create() in finishSetDataSouce_l()
DecryptHandle and DrmManagerClientbe retrieved by source->getDrmInfo() in DRMExtractor
Now the DRMExtractor cancommunicate with drm session
3.一些参考
Standardization of OMADRM:
DRM in Andoird:
http://developer.samsung.com/android/technical-docs/DRM-in-Android
Android developers DRM:
http://developer.android.com/reference/android/drm/package-summary.html
Stagefright :
http://blog.youkuaiyun.com/flyingqr/article/details/8576537