OMA DRM 1.0之DrmService启动流程

本文详细介绍了OMA DRM 1.0的启动流程,从init.rc开始,接着是main_drmserver,然后是DrmManagerService,最后是DrmManager,涵盖了各个关键步骤和对应的源代码文件。
摘要由CSDN通过智能技术生成
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服务已经启动

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值