MediaService_start_process
2016-09-30 02:49:16 0 举报
MediaService_start_process是一个用于启动媒体服务处理流程的函数。它负责初始化媒体服务,并开始执行相关的任务。在启动过程中,它会加载所需的资源和配置文件,建立与媒体设备的连接,并设置必要的参数。一旦启动完成,该函数将返回一个表示成功状态的值,同时会创建和管理与媒体服务相关的对象和线程。用户可以通过调用这个函数来启动媒体服务,以便进行音频或视频的处理、播放或录制等操作。这个函数提供了一种简单而高效的方式来启动和管理媒体服务,为用户提供了丰富的功能和灵活的操作接口。
作者其他创作
大纲/内容
binder_ioctl()
talkWithDriver()
ProcessState::self()-startThreadPool()
mVMStart=mmap(...)
status_t Parcel::writeStrongBinder(const sp& val)
binder:mRefs
MediaPlayerService::instantiate()
target.handle=0
status_t Parcel::writeInterfaceToken(const String16& interface) { writeInt32(IPCThreadState::self()-getStrictModePolicy() | STRICT_MODE_PENALTY_GATHER); // currently the interface identification token is just its name as a string return writeString16(interface); }
ProcessState::self()
code=ADD_SERVICE_TRANSACTION
BC_TRANSACTION
循环
\"media.player\"
此处cmd==BC_TRANSACTION
注意obj.type为BINDER_TYPE_BINDER,后面要用到
doReceive&&needRead为true
if(bwr.write_consumed0){
type:BINDER_TYPE_HANDLE
cookie
其中name为\"media.player\"
bwr.read_size=mIn.dataCapacity();bwr.read_buffer=(long unsigned int)mIn.data();
ptr.buffer
IPCThreadState::talkWithDriver(boolean doReceive)
而doReceiver使用默认值(true)
\"android.os.IServiceManager\"
defaultServiceManager()-addService(String16(\"media.player\
MediaPlayerService
err = mIn.errorCheck(); if (err NO_ERROR) break; if (mIn.dataAvail() == 0) continue
故outAvail=mOut.dataSize();bwr.write_size=outAvail;bwr.write_buffer=(long unsigned int)mOut.data();
struct binder_transaction { int debug_id; // 当驱动为目标进程或线程创建一个事务时,就会将该成员的type置为 // BINDER_WORK_TRANSACTION,并将它添加到目标进程或线程的todo队列,等待处理 struct binder_work work; struct binder_thread *from; // 发起事务的线程 // 事务所依赖的另外一个事务以及目标线程下一个要处理的事务 struct binder_transaction *from_parent; struct binder_proc *to_proc; // 负责处理该事务的进程 struct binder_thread *to_thread; // 负责处理该事务的线程 struct binder_transaction *to_parent; unsigned need_reply:1; // 同步事务为1需要等待对方回复;异步为0 /* unsigned is_dead:1; */ /* not used at the moment */ // 指向驱动为该事务分配的内核缓冲区,保存了进程间通信数据 struct binder_buffer *buffer; unsigned int code; // 直接从进程间通信数据中拷贝过来 unsigned int flags; // 直接从进程间通信数据中拷贝过来long priority; // 源线程优先级 // 线程在处理事务时,驱动会修改它的优先级以满足源线程和目标Service组建的要求。在修改之 // 前,会将它原来的线程优先级保存在该成员中,以便线程处理完该事务后可以恢复原来的优先级 long saved_priority; uid_t sender_euid; // 源线程用户ID};
defaultServiceManager()返回BpServiceManager对象
struct binder_version{signed long protocol_version; }
writeStrongBinder(service)
从而needRead为true
copy_from_user()用于从用户空间复制binder_transaction_data到tr中
struct binder_write_read{signed long write_size;signed long write_consumed;unsigned long write_buffer;signed long read_size;signed long read_consumed;unsigned long read_buffer;}
BpBinder::transact()
interface为\"android.os.IServiceManager\"
struct flat_binder_object { /* 8 bytes for large_flat_header. */ unsigned long type; unsigned long flags; /* 8 bytes of data. */ union { void *binder; /* local object */ signed long handle; /* remote object */ }; /* extra data associated with local object */ void *cookie; };
cmd为BC_TRANSACTION
binder_transaction_data
struct binder_transaction_data{union{size_t handle;void *ptr;} target;void *cookie;unsigned int code;unsigned int flags;pid_t sender_pid;uid_t sender_euid;size_t data_size;size_t offsets_size;unino{ struct{const void *buffer;const void *offsets;} ptr;uint8_t buf[8]; } data;};
flat_binder_object对象
Parcel对象的初始状态为:mData = 0; mDataSize = 0; mDataCapacity = 0; mDataPos = 0; mObjects = NULL; mObjectsSize = 0; mObjectsCapacity = 0;
IPCThreadState::self()-joinThreadPool()
open_driver()
int fd=open(\"/dev/binder\
0 条评论
下一页