OMA DRM 1.0之DrmService启动流程

1. init.rc

对应文件:/system/core/rootdir/init.rc

在init.rc文件中跟drm相关的部分


# create directory for DRM plug-ins - give drm the read/write access to
# the following directory. 
# 这个里面有四个文件夹IDM、id、ro、st、wv,应该跟权限相关的一些文件
mkdir /data/drm 0770 drm drm  

# create directory for MediaDrm plug-ins - give drm the read/write access to
# the following directory.
# 有一个IDM1013文件夹,这个干什么用
mkdir /data/mediadrm 0770 mediadrm mediadrm

# make sure drm server has rights to read and write sdcard ####
# 启动drmservice
service drm /system/bin/drmserver
    class main
    user drm
    # group drm system inet drmrpc ####
    group drm system inet drmrpc sdcard_r ####

2. main_drmserver

对应文件:frameworks/av/drm/drmserver/main_drmserver.cpp

int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGV("ServiceManager: %p", sm.get());
    DrmManagerService::instantiate(); //启动drmservice
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

3. DrmManagerService

对应文件:/frameworks/av/drm/drmserver/DrmManagerService.cpp

void DrmManagerService::instantiate() {
    // 加入service manager
    defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService());

    if (0 >= trustedUids.size()) {
        // 这里添加信任的Uid和DrmMtkDef.cpp这个文件里面定义白名单区别?
        trustedUids.push(AID_MEDIA);
        trustedUids.push(AID_DRM);
        trustedUids.push(AID_SYSTEM);
        trustedUids.push(AID_ROOT);
    }
}

DrmManagerService::DrmManagerService() :
        mDrmManager(NULL) {
    // 从这个service实际调用的是DrmManager里面的方法,而
    // DrmManager最终调用lib库
    mDrmManager = new DrmManager();
    mDrmManager->loadPlugIns();
}

4. DrmManager

对应文件位置:/frameworks/av/drm/drmserver/DrmManager.cpp

// 加载lib库
status_t DrmManager::loadPlugIns() {

    String8 vendorPluginDirPath("/vendor/lib/drm"); // 路径下有libdrmwvmplugin.so
    loadPlugIns(vendorPluginDirPath);

    String8 pluginDirPath("/system/lib/drm"); // 路径下有libdrmctaplugin.so(这个是?)和libdrmmtkplugin.so两个so库
    loadPlugIns(pluginDirPath);
    return DRM_NO_ERROR;

}
// 里面的接口函数结构一致,都是先获取支持的DRM ID,然后根据ID载入对应插件进行函数调用
int DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) {
    Mutex::Autolock _l(mLock); 
    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
    if (EMPTY_STRING != plugInId) {
        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
        return rDrmEngine.checkRightsStatus(uniqueId, path, action);
    }
    return RightsStatus::RIGHTS_INVALID;
}

至此DRM service服务已经启动

你可能感兴趣的:(drm)