Android4.4KitKat支持u盘功能

作者:  发布日期:2014-05-14 23:16:13
0
Tag标签:功能  
  • Android U 盘功能实现和分析

    u 盘功能实现结果:

    u 盘会当成 usb storage 在 Settings Storage 里面显示。

    准备工作

    内核需支持 usb host需支持 FUSE 文件系统在 FS 选项里面配置即可(CONFIG_FUSE_FS=y)。

    Android 的配置

    配置 init.<board>.rc

        mkdir /storage/udisk0 0000 system system
    mkdir /mnt/media_rw/udisk0 0700 media_rw media_rw
    service fuse_udisk0 /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d /mnt/media_rw/udisk0 /storage/udisk0
    class late_start
    disabled

    配置 fstab.<board>

    /block/sda      /mnt/media_rw/udisk0  vfat  defaults  voldmanaged=udisk0:auto

    配置 overlay

       <storage android:mountPoint="/storage/udisk0"
    android:storageDescription="@string/storage_usb"
    android:primary="false"
    android:removable="true" />

    挂载过程:

    /dev/block/vold/8:1 /mnt/media_rw/udisk0 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
    /dev/fuse /storage/udisk0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
    root@android:/ # logcat -s Vold MountService
    --------- beginning of /dev/log/main
    --------- beginning of /dev/log/system
    I/Vold ( 820): Vold 2.1 (the revenge) firing up
    D/Vold ( 820): Volume sdcard1 state changing -1 (Initializing) -> 0 (No-Media)
    D/Vold ( 820): Volume sdcard1 state changing -1 (Initializing) -> 0 (No-Media)
    D/Vold ( 820): Volume udisk0 state changing -1 (Initializing) -> 0 (No-Media)
    D/Vold ( 820): Volume udisk0 state changing 0 (No-Media) -> 2 (Pending)
    D/Vold ( 820): Volume udisk0 state changing 2 (Pending) -> 1 (Idle-Unmounted)
    D/Vold ( 820): Volume sdcard1 state changing 0 (No-Media) -> 2 (Pending)
    D/Vold ( 820): Volume sdcard1 state changing 2 (Pending) -> 1 (Idle-Unmounted)
    D/MountService( 1587): got storage path: /storage/sdcard0 description: Internal storage primary: true removable: false emulated: true mtpReserve: 50 allowMassStorage: false maxFileSize: 0
    D/MountService( 1587): addVolumeLocked() StorageVolume:
    D/MountService( 1587): mStorageId=65537 mPath=/storage/emulated/0 mDescriptionId=17040662
    D/MountService( 1587): mPrimary=true mRemovable=false mEmulated=true mMtpReserveSpace=50
    D/MountService( 1587): mAllowMassStorage=false mMaxFileSize=0 mOwner=UserHandle{0} mUuid=null
    D/MountService( 1587): mUserLabel=null mState=null
    D/MountService( 1587): got storage path: /storage/sdcard1 description: SD card primary: false removable: true emulated: false mtpReserve: 0 allowMassStorage: false maxFileSize: 4294967296
    D/MountService( 1587): addVolumeLocked() StorageVolume:
    D/MountService( 1587): mStorageId=0 mPath=/storage/sdcard1 mDescriptionId=17040663 mPrimary=false
    D/MountService( 1587): mRemovable=true mEmulated=false mMtpReserveSpace=0 mAllowMassStorage=false
    D/MountService( 1587): mMaxFileSize=4294967296 mOwner=null mUuid=null mUserLabel=null mState=null
    D/MountService( 1587): got storage path: /storage/udisk0 description: USB storage primary: false removable: true emulated: false mtpReserve: 0 allowMassStorage: false maxFileSize: 0
    D/MountService( 1587): addVolumeLocked() StorageVolume:
    D/MountService( 1587): mStorageId=0 mPath=/storage/udisk0 mDescriptionId=17040664 mPrimary=false
    D/MountService( 1587): mRemovable=true mEmulated=false mMtpReserveSpace=0 mAllowMassStorage=false
    D/MountService( 1587): mMaxFileSize=0 mOwner=null mUuid=null mUserLabel=null mState=null
    W/MountService( 1587): Duplicate state transition (unmounted -> unmounted) for /storage/sdcard1
    D/MountService( 1587): volume state changed for /storage/sdcard1 (unmounted -> removed)
    W/MountService( 1587): Duplicate state transition (unmounted -> unmounted) for /storage/udisk0
    I/Vold ( 820): /dev/block/vold/8:1 being considered for volume udisk0
    D/Vold ( 820): Volume udisk0 state changing 1 (Idle-Unmounted) -> 3 (Checking)
    D/MountService( 1587): volume state changed for /storage/udisk0 (unmounted -> checking)
    D/MountService( 1587): sendStorageIntent Intent { act=android.intent.action.MEDIA_CHECKING dat=file:///storage/udisk0 (has extras) } to UserHandle{-1}
    I/Vold ( 820): Filesystem check completed OK
    D/Vold ( 820): blkid identified as /dev/block/vold/8:1: UUID="402E-0EE3" TYPE="vfat"
    D/Vold ( 820): Volume udisk0 state changing 3 (Checking) -> 4 (Mounted)
    D/MountService( 1587): volume state changed for /storage/udisk0 (checking -> mounted)
    D/MountService( 1587): sendStorageIntent Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/udisk0 (has extras) } to UserHandle{-1}
    W/MountService( 1587): Duplicate state transition (mounted -> mounted) for /storage/emulated/0

    Vold 解析 fstab 文件

    在 Android 4.4 中 Vold 会解析 vold.<hardware> 文件

       property_get("ro.hardware", propbuf, "");
    snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf); fstab = fs_mgr_read_fstab(fstab_filename);
    if (!fstab) {
    SLOGE("failed to open %s\n", fstab_filename);
    return -1;
    }

    其中 #define FSTAB_PREFIX "/fstab." 所以配置的 fatab 文件必须放在根目录 Vold 是 android 的后台进程将会一直监听 fatab 里面标记为 voldmanaged 的项目 如果没有标记则略过。没有标记的项目。可以交给 init 的 mount 命令处理但是不会监听所以你可以将recovery 和 cache 目录这样只需启动是挂载的目录项放在 fatab 里面交给 init 的 mount 命令处理例如三星 device/samsung/manta/fstab.manta

    # Android fstab file.
    #<src> <mnt_point> <type> <mnt_flags and opt
    ions> <fs_mgr_flags>
    # The filesystem that contains the filesystem checker binary (typically /system) cannot
    # specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK /dev/block/platform/dw_mmc.0/by-name/system /system ext4 ro
    wait
    /dev/block/platform/dw_mmc.0/by-name/cache /cache ext4 noatime,nosuid,nodev,nombl
    k_io_submit,errors=panic wait,check
    /dev/block/platform/dw_mmc.0/by-name/userdata /data ext4 noatime,nosuid,nodev,nombl
    k_io_submit,errors=panic wait,check,encryptable=/dev/block/platform/dw_mmc.0/by-name/metadata
    /dev/block/platform/dw_mmc.0/by-name/efs /factory ext4 noatime,nosuid,nodev,ro
    wait
    /dev/block/platform/dw_mmc.0/by-name/boot /boot emmc defaults
    defaults
    /dev/block/platform/dw_mmc.0/by-name/recovery /recovery emmc defaults
    defaults
    /dev/block/platform/dw_mmc.0/by-name/misc /misc emmc defaults
    defaults
    /dev/block/mmcblk0boot0 /bootloader emmc defaults
    defaults

    在系统启动调用 mount :

    on fs
    mkdir /factory 0775 radio radio mount_all /fstab.manta

    同理 init 的 mount 也会忽略标记为 voldmanaged 的项目 init 的 mount 命令与 vold 的 mount 管理大有不同两者不能混用。

    MountService 与 Vold 联合挂载 u 盘

    MountService 与 Vold 会建立 socket 通信具体的挂载操作都是下发命令交给 Vold 去完成。 MountService 会解析我们配置的 storage_list.xml

       private void readStorageListLocked() {
    mVolumes.clear();
    mVolumeStates.clear(); Resources resources = mContext.getResources(); int id = com.android.internal.R.xml.storage_list;
    XmlResourceParser parser = resources.getXml(id);
    AttributeSet attrs = Xml.asAttributeSet(parser); try {
    XmlUtils.beginDocument(parser, TAG_STORAGE_LIST);
    while (true) {
    XmlUtils.nextElement(parser);

    Vold 获取到 list 里面的设备变化时将会发送 state change event MountService 在 onEvent 处理各种不同 state 其中获取到设备插入将会执行挂载操作:

                if (code == VoldResponseCode.VolumeDiskInserted) {
    new Thread("MountService#VolumeDiskInserted") {
    @Override
    public void run() {
    try {
    int rc;
    if ((rc = doMountVolume(path)) != StorageResultCode.OperationSucceeded) {
    Slog.w(TAG, String.format("Insertion mount failed (%d)", rc));
    }
    } catch (Exception ex) {
    Slog.w(TAG, "Failed to mount media on insertion", ex);
    }
    }
    }.start();

    doMountVolume 只是发送 mount 命令给 Vold

       private int doMountVolume(String path) {
    int rc = StorageResultCode.OperationSucceeded; final StorageVolume volume;
    synchronized (mVolumesLock) {
    volume = mVolumesByPath.get(path);
    } if (DEBUG_EVENTS) Slog.i(TAG, "doMountVolume: Mouting " + path);
    try {
    mConnector.execute("volume", "mount", path);

    最终 Vold 里面执行相应的 mount 操作我们的 u 盘是 vfat 格式我只测试了这个格式 Linux 下的格式没有测试因为 Vold 只支持 fat 和 ext4

    int VolumeManager::mountVolume(const char *label) {
    Volume *v = lookupVolume(label); if (!v) {
    errno = ENOENT;
    return -1;
    } return v->mountVol();
    }
           if (Fat::doMount(devicePath, getMountpoint(), false, false, false,
    AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) {
    SLOGE("%s failed to mount via VFAT (%s)\n", devicePath, strerror(errno));
    continue;

Android4.4KitKat支持u盘功能的更多相关文章

  1. Android 4.4 KitKat 支持 u 盘功能

    Android U 盘功能实现和分析 u 盘功能实现结果: u 盘会当成 usb storage 在 Settings Storage 里面显示. 准备工作 内核需支持 usb host,需支持 FU ...

  2. Ceph与OpenStack整合(仅为云主机提供云盘功能)

    1. Ceph与OpenStack整合(仅为云主机提供云盘功能) 创建: linhaifeng,最新修改: 大约1分钟以前 ceph ceph osd pool create volumes 128 ...

  3. [转帖]4412开发板/4418开发板Android4.4.4实现ble功能

    本文转自迅为论坛:http://bbs.topeetboard.com ①.4418开发板实现ble功能方法: 在4418/android/device/nexell/drone2/device.mk ...

  4. Nginx 支持 WAF 防护功能实战

    WAF(Web Application Firewall),中文名称叫做“Web应用防火墙 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...

  5. 数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题

    数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据.解决图片恢复后打不开的问题. 用过非常多数据恢复软件.最早EasyRecovery pro.恢复过U盘.手机SD卡,硬盘数据.但如今下载不了最新版 ...

  6. Ubuntu14.04不支持U盘exfat格式该如何解决

    转: http://www.jb51.net/os/Ubuntu/275158.html exfat是U盘的文件系统,很多系统都支持exfat格式的使用,但Ubuntu系统并不支持exfat格式,要如 ...

  7. javascript如何判断访问网页的设备及是否支持触屏功能

    var system ={}; var p = navigator.platform; system.win = p.indexOf("Win") == 0; system.mac ...

  8. KDB支持单步调试功能(ARM架构)

    0    实践发现KDB不支持step调试功能 (本文针对的是arm CotexA9架构,各种架构的实现方式不一样,    X86的好像已经支持,不过本人没有验证过) 1    首先看下要调试的代码段 ...

  9. 安装nginx+ngx_lua支持WAF防护功能

    安装nginx+ngx_lua支持WAF防护功能 nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.nginx以 ...

随机推荐

  1. R语言笔记1--向量、数组、矩阵、数据框、列表

    注释:R语言是区分大小写的 1.向量 R语言中可以将各种向量赋值为一个变量,这种赋值操作符就是等号“=”,也可以使用“<-”. 1)产生向量 (1)函数c() 例如:x1=c(2,4,6,8,0 ...

  2. HAProxy与varnish

    Even if HAProxy can do TCP proxying, it is often used in front of web application, exactly where we ...

  3. document.createDocumentFragment 方法

    基本概念 document.createDocumentFragment 方法会创建一个 DocumentFragment 对象,该对象是一个存在于 DOM 树之外的 DOM 节点.它有一个非常有用的 ...

  4. json解析尖括号<>

    如题 rs.getString("HEADLINE").replaceAll("<", " <").replaceAll(&qu ...

  5. MySQL-测试卷一

    MySQL-测试卷一 一.单项选择题 1 下面不属于Msql数据库特点的是(  ) A. 免费使用  B.不能跨平台  C.开源软件  D.功能强大 2 定义表的一个字段, 要求能表示4位整数,2位小 ...

  6. Log4j 简介及初步应用

    使用2.5版本有问题,暂时没有解决,也许是JDK版本不兼容的原因.因此使用的是log4j-1.2.8.jar 1.三个组件 日志记录器  ——  Logger.输出目的地 —— Appender.输出 ...

  7. C++中的基本数据类型

    C++中定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type). 另外还定义了一种叫做void的特殊类型.void类型没有对应的值,仅用在有限的一些情况下,通常用作无 ...

  8. jQuery Mobile 学习

    jQuery Mobile 学习系列 http://blog.csdn.net/bao990423420/article/details/13995021

  9. android下m、mm、mmm编译命令的使用

    android下m.mm.mmm编译命令的使用 通过查看android源码目录下的build/envsetup.sh文件,可知: - m:       Makes from the top of th ...

  10. margin

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...