android BitTube学习

BitTube来龙去脉 
SensorManager.cpp文件展开客户端从JNI获取SensorServer服务,创建SensorEventConnection,SensorEventQueue,并通过SensorEventQueue与SensorEventConnection加交互 从底层获取数据,android_hardware_SensorManager.cpp作为客户端JNI层获取Sensor信息的"集散中心"而SystemSensorManager作为应用层Sensor信息的处理中心 

(一)客户端创建EventQueue 
sp<SensorEventQueue> SensorManager::createEventQueue()
{
    sp<SensorEventQueue> queue;

    Mutex::Autolock _l(mLock);
    while (assertStateLocked() == NO_ERROR) {
        sp<ISensorEventConnection> connection =
                mSensorServer->createSensorEventConnection();    // 二.  创建传感器事件connection
        if (connection == NULL) {
            // SensorService just died.
            ALOGE("createEventQueue: connection is NULL. SensorService died.");
            continue;
        }
        queue = new SensorEventQueue(connection); //  三.  创建传感器事件
        break;
    }
    return queue;
}

(二)创建createSensorEventConnection 
    BpSensorServer::createSensorEventConnection     {
        Parcel data, reply;
        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
        remote()->transact(CREATE_SENSOR_EVENT_CONNECTION, data, &reply); // 2.1 BnSensorServer::onTransact
        return interface_cast<ISensorEventConnection>(reply.readStrongBinder()); // 2.4 读取BnSensorServer端创建的BpBinder对象
    } 

     2.1  BnSensorServer接受BpSensorServer请求创建EventConnection      status_t BnSensorServer::onTransact(
              uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
     {
         switch(code) {
             case GET_SENSOR_LIST: {
            ......
             } break;
             case CREATE_SENSOR_EVENT_CONNECTION: {
                 CHECK_INTERFACE(ISensorServer, data, reply);
                 sp<ISensorEventConnection> connection(createSensorEventConnection()); // 2.2调用SensorServer服务
                 reply->writeStrongBinder(connection->asBinder()); // 2.3 利用Parcel对象传递构建BpBinder代理对象
                 return NO_ERROR;
             } break;
         }
         return BBinder::onTransact(code, data, reply, flags);
     } 
     2.2 调用SensorServer服务创建SensorEventConnection      sp<ISensorEventConnection> SensorService::createSensorEventConnection()      {
         uid_t uid = IPCThreadState::self()->getCallingUid();
         sp<SensorEventConnection> result(new SensorEventConnection(this, uid)); // 2.3调用子类创建
         return result;
     } 
     也即      SensorService::SensorEventConnection::SensorEventConnection(
        const sp<SensorService>& service, uid_t uid)
    : mService(service), mChannel(new BitTube()), mUid(uid)
     {
     }
     mChannel 为服务端的BitTube,mService值为SenSorServer服务 
     2.3 本地端(BnSensorServer)发送创建好的Binder对象,SensorEventConnection继承BnSensorEventConnection, 通过asBinder() 转成BpSensorEventConnection对象 
      reply->writeStrongBinder(connection->asBinder()); 
     2.4 代理端(BpSensorServer)获取SensorEventConnection的BpBinder代理对象 
     interface_cast<ISensorEventConnection>(reply.readStrongBinder()); 
      (三)创建SensorEventQueue 
     SensorEventQueue::SensorEventQueue(const sp<ISensorEventConnection>& connection)          : mSensorEventConnection(connection)  //  connection为 第二步中创建的BpSensorEventConnection
     {
     } 
     3.1 获取传感器通道      void SensorEventQueue::onFirstRef()
     {
         mSensorChannel = mSensorEventConnection->getSensorChannel(); // 3.2 BpSensorEventConnection::getSensorChannel()
     }

     3.2 BpSensorEventConnection获取SensorChannel      virtual sp<BitTube> getSensorChannel() const      {         Parcel data, reply;
        data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); // writeInterfaceToken为Bp代理端向服务端发送数据时编写的RPC报头
        remote()->transact(GET_SENSOR_CHANNEL, data, &reply); // 3.3 BnSensorEventConnection 获取SensorChannel
        return new BitTube(reply); // 3.5 利用收到的mReceiveFd,创建客户端BitTube
     } 
     status_t BnSensorEventConnection::onTransact(          uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
     {
         switch(code) {
             case GET_SENSOR_CHANNEL: {
                 CHECK_INTERFACE(ISensorEventConnection, data, reply);
                 sp<BitTube> channel(getSensorChannel()); // 3.4 SensorEventConnection::getSensorChannel获取SensorChannel
                 channel->writeToParcel(reply);
                 return NO_ERROR;
             } break;
             case ENABLE_DISABLE: {

                    ...... 
             } break;
             case SET_EVENT_RATE: {

                    ...... 
             } break;
         }
         return BBinder::onTransact(code, data, reply, flags);
     } 
     3.4 调用SensorEventConnection::getSensorChannel()返回服务端创建的mChannel ( BitTube )      sp<BitTube> SensorService::SensorEventConnection::getSensorChannel() const
     {
         return mChannel;
     }      接着调用writeToParcel  传送传感器(状态接受描述符)mReceiveFd返回给BpSensorEventConnection创建客户端BitTube      status_t BitTube::writeToParcel(Parcel* reply) const      {
         if (mReceiveFd < 0)
             return -EINVAL;

         status_t result = reply->writeDupFileDescriptor(mReceiveFd);
         close(mReceiveFd);
         mReceiveFd = -1;
         return result;
     } 

     3.5 创建客户端BitTube 
     BitTube::BitTube(const Parcel& data)     : mSendFd(-1), mReceiveFd(-1)
     {
         mReceiveFd = dup(data.readFileDescriptor());
         if (mReceiveFd >= 0) {
             int size = SOCKET_BUFFER_SIZE;
             setsockopt(mReceiveFd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));
             setsockopt(mReceiveFd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
             fcntl(mReceiveFd, F_SETFL, O_NONBLOCK);
         } else {
             mReceiveFd = -errno;
             ALOGE("BitTube(Parcel): can't dup filedescriptor (%s)",
                     strerror(-mReceiveFd));
         }
     }            备注:注意mReceiveFd描述符的传输过程,writeDupFileDescriptor,dup(data.readFileDescriptor()) ,SensorEventQueue::waitForEvent 通过getFd()获取mReceiveFd,SensorEventQueue::getLooper()通过Looper::addFd(getFd(), getFd(), ALOOPER_EVENT_INPUT, NULL, NULL) 对mReceiveFd(读通道or管道)进行监听epoll_wait 
相关链接: 
BitTube 进程间数据传递 http://blog.csdn.net/new_abc/article/details/8971961 
SensorThread线程  http://blog.csdn.net/new_abc/article/details/8971938 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值