步骤:、
1.获取ProcessState实例的强引用 proc
2.获取到一个BpServiceManager ServiceManager的代理类
3.初始化服务:AudioFlinger MediaPlayerService CameraService AudioPolicyService
4.开启线程池
{
//sp是 strongpointer 是一个强引用指针
//获取ProcessState实例的强引用
sp<ProcessState> proc(ProcessState::self());
//获取到一个BpServiceManager(BpBinder的子类)(servicerManager的代理对象)
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
//AudioFlinger服务初始化
AudioFlinger::instantiate();
//MediaPlayerService服务初始化
MediaPlayerService::instantiate();
//CameraService服务初始化
CameraService::instantiate();
//AudioPolicyService服务初始化
AudioPolicyService::instantiate();
//Server进程开启线程池 ?
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
{
Mutex::Autolock _l(gProcessMutex);
if (gProcess != NULL) {
return gProcess;
}
gProcess =new ProcessState;
return gProcess;
}
: mDriverFD(open_driver())//这里会打开Binder设备
, mVMStart(MAP_FAILED)
, mManagesContexts(false)
, mBinderContextCheckFunc(NULL)
, mBinderContextUserData(NULL)
, mThreadPoolStarted(false)
, mThreadPoolSeq(1)
{
if (mDriverFD >=0) {//表示打开open_drover()函数打开Binder设备并映射好虚拟内存空间成功
// XXX Ideally, there should be a specific define for whether we
// have mmap (or whether we could possibly have the kernel module
// availabla).
#if!defined(HAVE_WIN32_IPC)
// mmap the binder, providing a chunk of virtual address space to receive transactions.
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
if (mVMStart == MAP_FAILED) {
// *sigh*
ALOGE("Using /dev/binder failed: unable to mmap transaction memory. ");
close(mDriverFD);
mDriverFD =-1;
}
#else
mDriverFD =-1;
#endif
}
LOG_ALWAYS_FATAL
{
int fd = open("/dev/binder", O_RDWR);
if (fd >=0) {
//又是系统调用,具体功能就不知道了。
fcntl(fd, F_SETFD, FD_CLOEXEC);
int vers;
//获取Binder设备的版本号。
status_t result = ioctl(fd, BINDER_VERSION, &vers);
if (result ==-1) {
ALOGE("Binder ioctl to obtain version failed: %s", strerror(errno));
close(fd);
fd =-1;
}
//比较版本号是否匹配,不匹配就打开失败咯
if (result !=0|| vers != BINDER_CURRENT_PROTOCOL_VERSION) {
ALOGE("Binder driver protocol does not match user space protocol!");
close(fd);
fd =-1;
}
//通过Binder设备的系统调用,设置最大的线程数量
size_t maxThreads =15;
result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
if (result ==-1) {
ALOGE("Binder ioctl to set max threads failed: %s", strerror(errno));
}
} else {
ALOGW("Opening '/dev/binder' failed: %s ", strerror(errno));
}
return fd;
}
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
if (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}//ProcessState::self()单例函数调用,getContextObject返回的是一个BpBidner
//interface_cast<IServiceManager> 函数把BpBidner封装成BpServiceManager,BpBidner被放在
//BpServiceManager父类的 BpRefBase 中的mRemote 中并提供remote()函数来返回BpBidner变量
}
return gDefaultServiceManager;
}
class BinderService
{
public:
//调用了IServiceManager的addService方法,实现服务的注册
static status_t publish(bool allowIsolated =false) {
sp<IServiceManager> sm(defaultServiceManager());
return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated);
}
staticvoid publishAndJoinThreadPool(bool allowIsolated =false) {
sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated);
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
//简单调用了publish()方法。
staticvoid instantiate() { publish(); }
static status_t shutdown() {
return NO_ERROR;
}
};
sp < IServiceManager > sm(defaultServiceManager());
return sm -> addService(String16(SERVICE :: getServiceName()), new SERVICE(), allowIsolated);
}
bool allowIsolated)
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());//"android.os.IserviceManager"
data.writeString16(name);
data.writeStrongBinder(service);
data.writeInt32(allowIsolated ?1:0);
//调用remote()返回一个IBinder对象,在调用BpBinder的事物处理函数transact
//来处理这个事物
status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
return err == NO_ERROR ? reply.readExceptionCode() : err;
}
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
// Once a binder has died, it will never come back to life.
if (mAlive) {
status_t status = IPCThreadState::self()->transact(
mHandle, code, data, reply, flags);
if (status == DEAD_OBJECT) mAlive =0;
return status;
}
return DEAD_OBJECT;
}
uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags)
{
status_t err = data.errorCheck();
flags |= TF_ACCEPT_FDS;
IF_LOG_TRANSACTIONS() {
TextOutput::Bundle _b(alog);
alog <<"BC_TRANSACTION thr "<< (void*)pthread_self() <<" / hand "
<< handle <<" / code "<< TypeCode(code) <<": "
<< indent << data << dedent << endl;
}
if (err == NO_ERROR) {
LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(),
(flags & TF_ONE_WAY) ==0?"READ REPLY":"ONE WAY");
err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);
}
..............
if (reply) {
err = waitForResponse(reply);
} else {
Parcel fakeReply;
err = waitForResponse(&fakeReply);
}
..............
return err;
}
与Binder设备进行数据的交互是另外一种数据结构binder_transaction_data,不同于进程之间进行通讯的数据结构Parcel
int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
{
binder_transaction_data tr;
tr.target.handle = handle;
tr.code = code;
tr.flags = binderFlags;
tr.cookie =0;
tr.sender_pid =0;
tr.sender_euid =0;
const status_t err = data.errorCheck();
if (err == NO_ERROR) {
tr.data_size = data.ipcDataSize();
tr.data.ptr.buffer = data.ipcData();
tr.offsets_size = data.ipcObjectsCount()*sizeof(size_t);
tr.data.ptr.offsets = data.ipcObjects();
} elseif (statusBuffer) {
tr.flags |= TF_STATUS_CODE;
*statusBuffer = err;
tr.data_size =sizeof(status_t);
tr.data.ptr.buffer = statusBuffer;
tr.offsets_size =0;
tr.data.ptr.offsets = NULL;
} else {
return (mLastError = err);
}
mOut.writeInt32(cmd);
mOut.write(&tr, sizeof(tr));
return NO_ERROR;
{
int32_t cmd;
int32_t err;
while (1) {
if ((err=talkWithDriver()) < NO_ERROR) break;
err = mIn.errorCheck();
if (err < NO_ERROR) break;
if (mIn.dataAvail() ==0) continue;
cmd = mIn.readInt32();
IF_LOG_COMMANDS() {
alog <<"Processing waitForResponse Command: "
<< getReturnString(cmd) << endl;
}
switch (cmd) {
case BR_TRANSACTION_COMPLETE:
if (!reply &&!acquireResult) goto finish;
break;
case BR_DEAD_REPLY:
err = DEAD_OBJECT;
goto finish;
case BR_FAILED_REPLY:
err = FAILED_TRANSACTION;
goto finish;
case BR_ACQUIRE_RESULT:
{
ALOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT");
const int32_t result = mIn.readInt32();
if (!acquireResult) continue;
*acquireResult = result ? NO_ERROR : INVALID_OPERATION;
}
goto finish;
case BR_REPLY:
{
binder_transaction_data tr;
err = mIn.read(&tr, sizeof(tr));
ALOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY");
if (err != NO_ERROR) goto finish;
if (reply) {
if ((tr.flags & TF_STATUS_CODE) ==0) {
reply->ipcSetDataReference(
reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
tr.data_size,
reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
tr.offsets_size/sizeof(size_t),
freeBuffer, this);
} else {
err =*static_cast<const status_t*>(tr.data.ptr.buffer);
freeBuffer(NULL,
reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
tr.data_size,
reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
tr.offsets_size/sizeof(size_t), this);
}
} else {
freeBuffer(NULL,
reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
tr.data_size,
reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
tr.offsets_size/sizeof(size_t), this);
continue;
}
}
goto finish;
default:
err = executeCommand(cmd);
if (err != NO_ERROR) goto finish;
break;
}
}
finish:
if (err != NO_ERROR) {
if (acquireResult) *acquireResult = err;
if (reply) reply->setError(err);
mLastError = err;
}
return err;
}
mIn.setDataPosition(0);
{
ALOG_ASSERT(mProcess->mDriverFD >=0, "Binder driver is not opened");
binder_write_read bwr;
// Is the read buffer empty?
constbool needRead = mIn.dataPosition() >= mIn.dataSize();
// We don't want to write anything if we are still reading
// from data left in the input buffer and the caller
// has requested to read the next data.
const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() :0;
bwr.write_size = outAvail;
bwr.write_buffer = (longunsignedint)mOut.data();
// This is what we'll read.
if (doReceive && needRead) {
bwr.read_size = mIn.dataCapacity();
bwr.read_buffer = (longunsignedint)mIn.data();
} else {
bwr.read_size =0;
bwr.read_buffer =0;
}
//用来打印日志的
IF_LOG_COMMANDS() {
TextOutput::Bundle _b(alog);
if (outAvail !=0) {
alog <<"Sending commands to driver: "<< indent;
constvoid* cmds = (constvoid*)bwr.write_buffer;
constvoid* end = ((const uint8_t*)cmds)+bwr.write_size;
alog << HexDump(cmds, bwr.write_size) << endl;
while (cmds < end) cmds = printCommand(alog, cmds);
alog << dedent;
}
alog <<"Size of receive buffer: "<< bwr.read_size
<<", needRead: "<< needRead <<", doReceive: "<< doReceive << endl;
}
// Return immediately if there is nothing to do.
if ((bwr.write_size ==0) && (bwr.read_size ==0)) return NO_ERROR;
bwr.write_consumed =0;
bwr.read_consumed =0;
status_t err;
do {
IF_LOG_COMMANDS() {
alog <<"About to read/write, write size = "<< mOut.dataSize() << endl;
}
#ifdefined(HAVE_ANDROID_OS)
if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >=0)
err = NO_ERROR;
else
err =-errno;
#else
err = INVALID_OPERATION;
#endif
IF_LOG_COMMANDS() {
alog <<"Finished read/write, write size = "<< mOut.dataSize() << endl;
}
} while (err ==-EINTR);
IF_LOG_COMMANDS() {
alog <<"Our err: "<< (void*)err <<", write consumed: "
<< bwr.write_consumed <<" (of "<< mOut.dataSize()
<<"), read consumed: "<< bwr.read_consumed << endl;
}
if (err >= NO_ERROR) {
if (bwr.write_consumed >0) {
if (bwr.write_consumed < (ssize_t)mOut.dataSize())
mOut.remove(0, bwr.write_consumed);
else
mOut.setDataSize(0);
}
if (bwr.read_consumed >0) {
mIn.setDataSize(bwr.read_consumed);
mIn.setDataPosition(0);
}
IF_LOG_COMMANDS() {
TextOutput::Bundle _b(alog);
alog <<"Remaining data size: "<< mOut.dataSize() << endl;
alog <<"Received commands from driver: "<< indent;
constvoid* cmds = mIn.data();
constvoid* end = mIn.data() + mIn.dataSize();
alog << HexDump(cmds, mIn.dataSize()) << endl;
while (cmds < end) cmds = printReturnCommand(alog, cmds);
alog << dedent;
}
return NO_ERROR;
}
return err;
}
IPCThreadState::self()->joinThreadPool();
{
AutoMutex _l(mLock);
if (!mThreadPoolStarted) {
mThreadPoolStarted =true;
spawnPooledThread(true);
}
}
staticconst android::String16 descriptor;
static android::sp<I##INTERFACE> asInterface(
const android::sp<android::IBinder>& obj);
virtualconst android::String16& getInterfaceDescriptor() const;
I##INTERFACE();
virtual~I##INTERFACE();
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)
const android::String16 I##INTERFACE::descriptor(NAME);
const android::String16&
I##INTERFACE::getInterfaceDescriptor() const {
return I##INTERFACE::descriptor;
}
android::sp<I##INTERFACE> I##INTERFACE::asInterface(
const android::sp<android::IBinder>& obj)
{
android::sp<I##INTERFACE> intr;
if (obj != NULL) {
intr =static_cast<I##INTERFACE*>(
obj->queryLocalInterface(
I##INTERFACE::descriptor).get());
if (intr == NULL) {
intr =new Bp##INTERFACE(obj);
}
}
return intr;
}
I##INTERFACE::I##INTERFACE() { }
I##INTERFACE::~I##INTERFACE() { }
#define CHECK_INTERFACE(interface, data, reply)
if (!data.checkInterface(this)) { return PERMISSION_DENIED; }