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服务已经启动