USB Storage

概述

    Android的USB存储管理从上到下主要分为StorageManager、MountService、Vold几个模块。
    framework层的功能主要是由后台服务MountService实现,与其他Service一样,
启动时会在SystemService中注册该服务。
    StorageManager是管理类,主要是提供给上层应用程序开发者的调用接口,具体实现会调用
MountService服务。
    Vold是系统的守护进程,用来监测内核事件消息和framework层的消息,都是使用socket来进行通讯,
后面会详细分析Vold的实现。

结构图

StorageManager管理类

StorageManager的初始化

mListeners

private List<ListenerDelegate> mListeners = new ArrayList<ListenerDelegate>();

StorageManager

public StorageManager(Looper tgtLooper) throws RemoteException {
    mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
    if (mMountService == null) {
        return;
    }
    mTgtLooper = tgtLooper;
    mBinderListener = new MountServiceBinderListener();
    mMountService.registerListener(mBinderListener);
}

registerListener

public void registerListener(StorageEventListener listener) {
    if (listener == null) {
        return;
    }

    synchronized (mListeners) {
        mListeners.add(new ListenerDelegate(listener));
    }
}

mountObb

public boolean mountObb(String filename, String key, OnObbStateChangeListener listener) {
    ...... 
    try {
        final int nonce = mObbActionListener.addListener(listener);
        mMountService.mountObb(filename, key, mObbActionListener, nonce);
        return true;
    } catch (RemoteException e) {
    }

    return false;
}

StorageManager.MountServiceBinderListener

private class MountServiceBinderListener extends IMountServiceListener.Stub {
    public void onUsbMassStorageConnectionChanged(boolean available) {
        final int size = mListeners.size();
        for (int i = 0; i < size; i++) {
            mListeners.get(i).sendShareAvailabilityChanged(available);
        }
    }

    public void onStorageStateChanged(String path, String oldState, String newState) {
        final int size = mListeners.size();
        for (int i = 0; i < size; i++) {
            mListeners.get(i).sendStorageStateChanged(path, oldState, newState);
        }
    }
}

MountService服务

方法名 描述
setUsbMassStorageEnabled 设置U盘模式
isUsbMassStorageEnabled 检测当前是否是U盘模式
mountVolume 挂载磁盘
unmountVolume 卸载磁盘
formatVolume 格式化磁盘
getVolumeState 获取磁盘状态
mountSecureContainer 挂载secure分区
unmountSecureContainer 卸载secure分区
isSecureContainerMounted 检测secure分区状态
mountObb 挂载obb分区
unmountObb 卸载obb分区
isObbMounted 检测obb分区状态
registerListener 注册外部回调接口,用来做设备状态变更处理

什么是Vold

Vold功能实现

Vold与MountService的传输协议

volume操作

协议字符串 用法描述 备注
volume list 返回设备列表  
volume debug <off/on> 开启debug模式  
volume mount <path> 挂载对应指定挂载点的设备 path表示挂载点
volume unmount <path> [force] 卸载指定挂载点的设备 path表示挂载点
volume format <path> 格式化对应挂载点的设备 path表示挂载点
volume share <path> <method> 开启ums模式 path表示挂载点,method可设置为"ums"
volume unshare <path> <method> 关闭ums模式 path表示挂载点,method可设置为"ums"

share操作

协议字符串 用法描述 备注
share status 返回ums的信息 返回usb状态,true为usb已连接并开启ums模式,否则为false

storage操作

协议字符串 用法描述 备注
storage users 获取设备关联的进程信息 读取/proc目录下相关进程的信息

asec操作

协议字符串 用法描述 备注
asec list 扫描asec目录,返回.asec结尾的文件名  
asec create <container-id> <size_mb> <fstype> <key> <ownerUid> 创建asec目录和文件  
asec finalize <container-id>    
asec destroy <container-id> [force] 删除asec目录和文件  
asec mount <namespace-id> <key> <ownerUid> 挂载asec目录  
asec unmount <container-id> [force] 卸载asec目录  
asec rename <old_id> <new_id> 重命名asec目录  
asec path <container-id>    

obb操作

协议字符串 用法描述 备注
obb list 扫描/proc/mounts目录,返回挂载信息  
obb mount <filename> <key> <ownerUid> 挂载obb镜像  
obb unmount <source file> [force] 卸载obb镜像  
obb path <source file> 返回obb挂载路径  

xwrap操作

协议字符串 用法描述 备注
xwrap enable    
xwrap disable    
xwrap status    

调试Vold

USB Storage框架总结