基于Android 6.0源码, 来分析存储相关架构,涉及源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/framework/base/services/java/com/android/server/SystemServer.java /framework/base/services/core/java/com/android/server/MountService.java /framework/base/services/core/java/com/android/server/NativeDaemonConnector.java /framework/base/services/core/java/com/android/server/NativeDaemonEvent.java /framework/base/core/java/android/os/storage/IMountService.java /framework/base/core/java/android/os/storage/IMountServiceListener.java /framework/base/core/java/android/os/storage/StorageManager.java /system/vold/Main.cpp /system/vold/VolumeManager.cpp /system/vold/NetlinkManager.cpp /system/vold/NetlinkHandler.cpp /system/vold/CommandListener.cpp /system/vold/VoldCommand.cpp /system/vold/VolumeBase.cpp /system/vold/PublicVolume.cpp /system/vold/EmulatedVolume.cpp /system/vold/PublicVolume.cpp /system/vold/Disk.cpp /system/core/libsysutils/src/NetlinkListener.cpp /system/core/libsysutils/src/SocketListener.cpp /system/core/libsysutils/src/FrameworkListener.cpp /system/core/libsysutils/src/FrameworkCommand.cpp /system/core/include/sysutils/NetlinkListener.h /system/core/include/sysutils/SocketListener.h /system/core/include/sysutils/FrameworkListener.h /system/core/include/sysutils/FrameworkCommand.h |
一、概述
本文主要介绍跟存储相关的模块MountService和Vold的整体流程与架构设计.
- MountService:Android Binder服务,运行在system_server进程,用于跟Vold进行消息通信,比如
MountService
向Vold
发送挂载SD卡的命令,或者接收到来自Vold
的外设热插拔事件。 - Vold:全称为Volume Daemon,用于管理外部存储设备的Native守护进程,这是一个非常重要的守护进程,由NetlinkManager,VolumeManager,CommandListener这3部分组成。
二、MountService
MountService运行在system_server
进程,在系统启动到阶段PHASE_WAIT_FOR_DEFAULT_DISPLAY后,进入startOtherServices
会启动MountService.
2.1 启动
[-> SystemServer.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void startOtherServices() { ... IMountService mountService = null; //启动MountService服务,【见小节2.2】 mSystemServiceManager.startService(MOUNT_SERVICE_CLASS); //等价new IMountService.Stub.Proxy(),即获取MountService的proxy对象 mountService = IMountService.Stub.asInterface( ServiceManager.getService("mount")); ... mActivityManagerService.systemReady(new Runnable() { public void run() { //启动到阶段550【见小节2.7】 mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY); ... }); } |
NotificationManagerService依赖于MountService,比如media/usb通知事件,所以需要先启动MountService。此处MOUNT_SERVICE_CLASS=com.android.server.MountService$Lifecycle
.
2.2 startService
mSystemServiceManager.startService(MOUNT_SERVICE_CLASS)主要完成3件事:
- 创建MOUNT_SERVICE_CLASS所指类的Lifecycle对象;
- 将该对象添加SystemServiceManager的
mServices
服务列表; - 最后调用Lifecycle的onStart()方法,主要工作量这个过程,如下:
[-> MountService.java]
1 2 3 4 yon-nums-content" style="font-size: 13px !important; line-height: 15px !important;"> 1 2 3 4 4a8613960498" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always" style=" margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;">
一、概述本文主要介绍跟存储相关的模块MountService和Vold的整体流程与架构设计.
二、MountServiceMountService运行在 2.1 启动[-> SystemServer.java]
NotificationManagerService依赖于MountService,比如media/usb通知事件,所以需要先启动MountService。此处MOUNT_SERVICE_CLASS= 2.2 startServicemSystemServiceManager.startService(MOUNT_SERVICE_CLASS)主要完成3件事:
[-> MountService.java]
|