AndroidO中DRM的工作流程

    • DRM软件框架
    • DRM工作流程
      • DrmManagerService的初始化
      • DRM的工作流程

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

DRM软件框架

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

图示为Android中的DRM软件架构。

AndroidO中DRM的工作流程_第1张图片

上图中DRM Framework API模块是Framework层暴露给App的接口。该模块中最主要的类是DrmManagerClient。

DRM Framework API模块通过Binder机制和位于drmserver进程(以Android O为例,drmserver的代码位于framework/av/drm/drmserver)中的DRM Manager模块通信。DRM Manager加载并管理系统中所有的DRM插件。

DRM Plugins是真正实现权限管理、数字内容解密等工作的模块。根据DRM标准的不同,这些Plugins的实现亦不相同。另外,一个手机可能会集成多个DRM Plugin。这是因为媒体文件如果采用不同的DRM解决方案进行加密的话,手机在播放它们时,DRM Manager需找到对应的DRM Plugin以进行解密。

AndroidO中DRM的工作流程_第2张图片

图2 DRM重要类图

对于图2:

FileSource代表一个媒体文件。MediaExtractor创建时会去对FileSource 执行DrmInitialization(),

 source->DrmInitialization(nullptr /* mime */);

然后如果媒体文件中有DRM信息,它将创建一个DrmManagerClient对象,否则返回null。该对象用于处理媒体文件中和DRM相关的操作。DrmManagerClient内部通过DrmManagerClientImpl和位于drmserver进程中的DrmManagerService进行跨Binder通信。

  sp<DecryptHandle> FileSource::DrmInitialization(const char *mime) {
      if (getuid() == AID_MEDIA_EX) return nullptr; // no DRM in media extractor
      if (mDrmManagerClient == NULL) {
          mDrmManagerClient = new DrmManagerClient();
      }

      if (mDrmManagerClient == NULL) {
          return NULL;
      }

      if (mDecryptHandle == NULL) {
          mDecryptHandle = mDrmManagerClient->openDecryptSession(
                  mFd, mOffset, mLength, mime);
      }

      if (mDecryptHandle == NULL) {
          delete mDrmManagerClient;
          mDrmManagerClient = NULL;
      }

      return mDecryptHandle;
  }

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机构提供专利代码包。

DRM工作流程

DrmManagerService的初始化

AndroidO中DRM的工作流程_第3张图片

1.DrmManagerService实例对象由drmserver进程在main函数中调用instantiate创建

main_drmserver.cpp

int main()
{
    signal(SIGPIPE, SIG_IGN);

    sp proc(ProcessState::self());
    sp sm = defaultServiceManager();
    ALOGV("ServiceManager: %p", sm.get());
    DrmManagerService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

2.DrmManagerService内部会创建一个DrmManager实例对象并调用loadPlugins来加载设备可能提供的DRM Plugin。DRM Plugin通过动态库的方式集成到设置中去。

DrmManagerService::DrmManagerService() :
        mDrmManager(NULL) {
    ALOGV("created");
    mDrmManager = new DrmManager();
    mDrmManager->loadPlugIns();
}

3.Android N中有两个目录可存放DRM Plugin。
一个是/vendor/lib/drm/,例如Widevine对应的libdrmwvmplugin.so。

另一个目录是/system/lib/drm/。

这里写图片描述
从下面是android N中的loadPlugIns中也可以得到验证

  status_t DrmManager::loadPlugIns() {
      String8 vendorPluginDirPath("/vendor/lib/drm");
      loadPlugIns(vendorPluginDirPath);

      String8 pluginDirPath("/system/lib/drm");
      loadPlugIns(pluginDirPath);
      return DRM_NO_ERROR;
  }

但是Android O中只有/system/lib/drm这一个目录下的plugin在使用,见Android O中DrmManager::loadPlugIns()部分:

status_t DrmManager::loadPlugIns() {
    String8 pluginDirPath("/system/lib/drm");
    loadPlugIns(pluginDirPath);
    return DRM_NO_ERROR;
}

每一个DRM Plugin对应为一个IDrmManager实例。所有被加载的DRM Plugin由DrmManager来统一管理。

4.DrmManagerService最后将通过addService把自己注册到Binder系统中以为广大客户端服务。

void DrmManagerService::instantiate() {
    defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService());
...

DRM的工作流程

下面来介绍DRM的工作流程。
Android支持的DRM播放方式分为两种:
一种是基于基本码流的(Elementary Stream Based,简称ES Based)播放方式。目前Widevine DRM、Marline DRM都属于这一种类型。

但是”Google is deprecating Widevine classic in Android M. Consequently, for qcom it no longer requires starting with Android M and newer chipsets after MSM8996 chipset.”

另一种是基于容器的(Container Base)播放方式,目前OMA DRM支持这种方法。
这两种不同的方式在播放流程上不尽相同。下文将以一个播放具有DRM保护的MP4文件为例,介绍DRM的工作流程。

所以基于Android O 我们来看Container Base这种方式….

(待补充)

你可能感兴趣的:(DRM)