3.  VolumeManager::Instance() 和 VolumeManager::start()
     system/vold/VolumeManager.cpp  
     3.1 Instance()没啥好说的 非常简单
  
 
    112  VolumeManager* VolumeManager::Instance() {113      if (!sInstance) sInstance = new VolumeManager();114      return sInstance;115  }116  117  VolumeManager::VolumeManager() {118      mDebug = false;119      mNextObbId = 0;120      mNextStubId = 0;121      // For security reasons, assume that a secure keyguard is122      // showing until we hear otherwise123      mSecureKeyguardShowing = true;124  }    3.2 VolumeManager::start()
  
 
    174  int VolumeManager::start() {175      ATRACE_NAME("VolumeManager::start");176  177      // Always start from a clean slate by unmounting everything in178      // directories that we own, in case we crashed.179      unmountAll();           -----> 全部 unmount , 这里的unmount似乎并不是全部所有分区, 全部的话那还了得180  181      Loop::destroyAll();182  183      // Assume that we always have an emulated volume on internal184      // storage; the framework will decide if it should be mounted.185      CHECK(mInternalEmulatedVolumes.empty());186  187      auto vol = std::shared_ptr<android::vold::VolumeBase>(188              new android::vold::EmulatedVolume("/data/media", 0));  ---> 创建 EmulatedVolume189      vol->setMountUserId(0);190      vol->create();191      mInternalEmulatedVolumes.push_back(vol);192  193      // Consider creating a virtual disk194      updateVirtualDisk();195  196      return 0;197  }4.  NetlinkManger::Instance() 和 NetlinkManger::start()
     system/vold/NetlinkManager.cpp
     4.1 NetlinkManger::Instance() 很简单 不需要赘述
  
 
    36  NetlinkManager* NetlinkManager::Instance() {37      if (!sInstance) sInstance = new NetlinkManager();38      return sInstance;39  }40  41  NetlinkManager::NetlinkManager() {42      mBroadcaster = NULL;43  }
     4.2 NetlinkManger::start()
     
 
47  int NetlinkManager::start() {48      struct sockaddr_nl nladdr;49      int sz = 64 * 1024;50      int on = 1;51  52      memset(&nladdr, 0, sizeof(nladdr));53      nladdr.nl_family = AF_NETLINK;54      nladdr.nl_pid = getpid();55      nladdr.nl_groups = 0xffffffff;56  57      if ((mSock = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT)) < 0) {   ---> 创建socket client58          PLOG(ERROR) << "Unable to create uevent socket";59          return -1;60      }61  62      // When running in a net/user namespace, SO_RCVBUFFORCE will fail because63      // it will check for the CAP_NET_ADMIN capability in the root namespace.64      // Try using SO_RCVBUF if that fails.65      if ((setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) &&66          (setsockopt(mSock, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz)) < 0)) {67          PLOG(ERROR) << "Unable to set uevent socket SO_RCVBUF/SO_RCVBUFFORCE option";68          goto out;69      }70  71      if (setsockopt(mSock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0) {72          PLOG(ERROR) << "Unable to set uevent socket SO_PASSCRED option";73          goto out;74      }75  76      if (bind(mSock, (struct sockaddr*)&nladdr, sizeof(nladdr)) < 0) {  --> socket bind77          PLOG(ERROR) << "Unable to bind uevent socket";78          goto out;79      }80  81      mHandler = new NetlinkHandler(mSock);    --> 创建 new NetlinkHandler82      if (mHandler->start()) {     --> 创建 new NetlinkHandler.start() 见4.383          PLOG(ERROR) << "Unable to start NetlinkHandler";84          goto out;85      }86  87      return 0;88  89  out:90      close(mSock);91      return -1;92  }4.3 new NetlinkHandler and start()
        这有个继承关系NetlinkHandler : NetlinkListener : SocketListener
  
    2  int NetlinkHandler::start() {33      return this->startListener();       ------> 实际就是SocketListener poll监听,是否有POLLIN 产生, onDataAvailable -> onEvent34  }35  36  void NetlinkHandler::onEvent(NetlinkEvent* evt) {  ---> 收到了uevent37      VolumeManager* vm = VolumeManager::Instance();38      const char* subsys = evt->getSubsystem();39  40      if (!subsys) {41          LOG(WARNING) << "No subsystem found in netlink event";42          return;43      }44  45      if (std::string(subsys) == "block") {   ------> 只有uevent的subsys是block才会处理的46          vm->handleBlockEvent(evt);       ------> VolumeManager处理 block device uevent  见 4.447      }48  }
         4.4 VolumeManager::handleBlockEvent()
     
 
199  void VolumeManager::handleBlockEvent(NetlinkEvent* evt) {200      std::lock_guard<std::mutex> lock(mLock);201  202      if (mDebug) {203          LOG(DEBUG) << "----------------";204          LOG(DEBUG) << "handleBlockEvent with action " << (int)evt->getAction();  ---> 这里是vold.debug控制的,打印具体的action205          evt->dump();206      }207  208      std::string eventPath(evt->findParam("DEVPATH") ? evt->findParam("DEVPATH") : "");209      std::string devType(evt->findParam("DEVTYPE") ? evt->findParam("DEVTYPE") : "");210  211      if (devType != "disk") return;    --->  devType不是disk还不处理, 真是牛逼哄哄212   213      int major = std::stoi(evt->findParam("MAJOR"));214      int minor = std::stoi(evt->findParam("MINOR"));215      dev_t device = makedev(major, minor);   ---> 创建block device组合216  217      switch (evt->getAction()) {218          case NetlinkEvent::Action::kAdd: {     ---> uevent action为add 具体见4.5219              for (const auto& source : mDiskSources) {  ---> 之前添加的两个disksource,还记得吗,只支持sd卡和U盘220                  if (source->matches(eventPath)) {221                      // For now, assume that MMC and virtio-blk (the latter is222                      // specific to virtual platforms; see Utils.cpp for details)223                      // devices are SD, and that everything else is USB224                      int flags = source->getFlags();225                      if (major == kMajorBlockMmc || IsVirtioBlkDevice(major)) {226                          flags |= android::vold::Disk::Flags::kSd;  ---> SD卡227                      } else {228                          flags |= android::vold::Disk::Flags::kUsb; ---> usb storage, 通过otg插入的229                      }230  231                      auto disk =232                          new android::vold::Disk(eventPath, device, source->getNickname(), flags);  ---> 创建一个disk设备节点mknod233                      handleDiskAdded(std::shared_ptr<android::vold::Disk>(disk)); --> 真正的处理234                      break;235                  }236              }237              break;238          }239          case NetlinkEvent::Action::kChange: {  --> uevent action为add 具体见4.6240              LOG(VERBOSE) << "Disk at " << major << ":" << minor << " changed";241              handleDiskChanged(device);242              break;243          }244          case NetlinkEvent::Action::kRemove: { --> uevent action为add 具体见4.7245              handleDiskRemoved(device);246              break;247          }248          default: {249              LOG(WARNING) << "Unexpected block event action " << (int)evt->getAction();250              break;251          }252      }253  }    4.5 new android::vold::Disk()和handleDiskAdded()
         system/vold/model/Disk.cpp
 
   4.5.1 new android::vold::Disk()
         
 
Disk::Disk(const std::string& eventPath, dev_t device, const std::string& nickname, int flags)95      : mDevice(device),96        mSize(-1),97        mNickname(nickname),98        mFlags(flags),99        mCreated(false),100        mJustPartitioned(false) {101      mId = StringPrintf("disk:%u,%u", major(device), minor(device));102      mEventPath = eventPath;103      mSysPath = StringPrintf("/sys/%s", eventPath.c_str());104      mDevPath = StringPrintf("/dev/block/vold/%s", mId.c_str());105      CreateDeviceNode(mDevPath, mDevice);  ---------> 创建block device 的设备节点mknod106  }        4.5.2 handleDiskAdded()
         
 
255  void VolumeManager::handleDiskAdded(const std::shared_ptr<android::vold::Disk>& disk) {256      // For security reasons, if secure keyguard is showing, wait257      // until the user unlocks the device to actually touch it258      // Additionally, wait until user 0 is actually started, since we need259      // the user to be up before we can mount a FUSE daemon to handle the disk.260      bool userZeroStarted = mStartedUsers.find(0) != mStartedUsers.end();261      if (mSecureKeyguardShowing) {262          LOG(INFO) << "Found disk at " << disk->getEventPath()263                    << " but delaying scan due to secure keyguard";264          mPendingDisks.push_back(disk);265      } else if (!userZeroStarted) {266          LOG(INFO) << "Found disk at " << disk->getEventPath()267                    << " but delaying scan due to user zero not having started";268          mPendingDisks.push_back(disk);269      } else {270          disk->create();        ---------> disk->create()271          mDisks.push_back(disk);272      }273  }146  status_t Disk::create() {147      CHECK(!mCreated);148      mCreated = true;149  150      auto listener = VolumeManager::Instance()->getListener();   ---------> StorageManaerService通信151      if (listener) listener->onDiskCreated(getId(), mFlags);  ------> StorageManaerService->onDiskCreated()152  153      if (isStub()) {154          createStubVolume();155          return OK;156      }157      readMetadata();  -------->  listener->onDiskMetadataChanged(getId(), mSize, mLabel, mSysPath);158      readPartitions();  --------> Disk::createPublicVolume()  listener->onVolumeCreated()and listener->onDiskScanned()159      return OK;160  }思考, vold比mount service启动的早,那开机时vold获取到的listener为空,也就是说虽然disk创建了但是不会mount,那什么时候才会mount呢? 我们下一篇文章解答