Android4.4KitKat支持u盘功能

作者:  发布日期:2014-05-14 23:16:13
我来说两句(0)

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 systemmkdir /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/udisk0class late_startdisabled

    配置 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      rowait
    /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,rowait
    /dev/block/platform/dw_mmc.0/by-name/boot       /boot               emmc      defaultsdefaults
    /dev/block/platform/dw_mmc.0/by-name/recovery   /recovery           emmc      defaultsdefaults
    /dev/block/platform/dw_mmc.0/by-name/misc       /misc               emmc      defaultsdefaults
    /dev/block/mmcblk0boot0                         /bootloader         emmc      defaultsdefaults

    在系统启动调用 mount :

    on fsmkdir /factory 0775 radio radiomount_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") {@Overridepublic 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 u盘 uuid,Android4.4KitKat支持u盘功能

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

  2. Android 4.4 KitKat 支持 u 盘功能

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

  3. matlab编辑rayfile光源文件,rayfile网盘功能详解 rayfile网盘安装步骤及安装注意事项...

    rayfile网盘是一款网络硬盘文件,用户可以用它上传.下载网络资源文件,上传.下载速度快,且支持同时上传和下载多个文件,断点续传等功能,非常实用,另外还具有文件管理功能,可以通过客户端轻松管理自己已 ...

  4. android 百度网盘 播放器,最好用的安卓播放器,支持云盘播放,看电影必备

    原标题:最好用的安卓播放器,支持云盘播放,看电影必备 你最喜欢用什么播放器来看电影? 或许腾讯视频.优酷等主流的点播播放器是数千万人的选择,但有时,我们也需要一款好用.离线.轻量级别的本地播放器来播放 ...

  5. android的usb热插拔,Android M能让外部存储变成内部存储 支持U盘热插拔

    在此之前,Android一直对mirco SD卡之类的外部存储设备不太待见,最明显的例子就是和系统内部存储分得很清,俨然是庶出和嫡出的区别.今天发布的Android M,将有一个重大改变. 在Andr ...

  6. android+4.4+打印功能,安卓android4.4新增打印支付功能

    安卓4.4的到来慢慢逼近,安卓4.4功能也相继曝光;最近有消息传出,安卓4.4将新增打印支付功能,这将是一个让人值得期待的功能;我们一起来了解一下吧! Android 4.4拨号界面的曝光后,相机界面 ...

  7. 巧设BIOS,让老主板也支持U盘启动!

    现在的U盘大都支持启动机器的功能,用U盘做个启动盘,把常用的DOS工具和杀毒软件放在里面,携带方便再也不为一张启动盘而大动干戈来刻录,再也不为只有1.44M的软盘而伤心.   但是现在有些人的主板由于 ...

  8. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

  9. usb3.0 u盘 安装 linux,在16G USB3.0中安装ubuntu10.10成功!U盘功能可用

    折腾了快两天,终于成功的将ubuntu装入U盘,同时能够保持U盘功能,激动ing... 感兴趣的同学可以查看附件.(ps:不会传,现把全文内容附上,说不上原创,不过集合了网上很多的资源,自己稍有发挥. ...

最新文章

  1. [BUUCTF-pwn]——wdb_2018_2nd_easyfmt
  2. Android动态改变TextView字体颜色
  3. 输出一串小于100的随机数(rand())
  4. FTP与SFTP两者有什么区别
  5. Tensor看这一篇就够了!
  6. 中国大学生软件开发论坛 中国最大的大学生软件开发论坛
  7. Go 中文和unicode字符之间转换
  8. Android Studio 设置签名。
  9. 关于Keil C语言变量被多次定义的问题
  10. Deep Learning论文翻译(Nature Deep Review)
  11. LeetCode - 441 - 排列硬币(arranging-coins)
  12. 阿里在职5年,一个女测试工师的坎坷之路
  13. 又猎一“狐”:一名外逃越南嫌疑人落网-网易
  14. 基本数据类型在传参中的自顶向下和自底向上;this;访问权限修饰符
  15. 【HBase】HBase入门详解(一)
  16. 说话技巧 为人处事
  17. cocos2d-x下硬件音量按键控制游戏音量的实现
  18. Swift创作天气APP
  19. 【笔记】DenseTNT:End-to-end Trajectory Prediction from Dense Goal Sets
  20. 多元线性回归(OLS+稳健误)python代码实现

热门文章

  1. 神策数据正式成为国家级信创工委会成员单位!
  2. Spring注入方法
  3. MICROSOFT IGNITE 2018 大会成功举办,Docker 现场揭秘全新版本内容!
  4. 巨头纷纷布局,机器视觉迎来黄金期
  5. Alpha版使用说明
  6. Eclipse无法打开“Failed to load the JNI shared library”
  7. andiod 导入工程 报错
  8. Android应用程序键盘(Keyboard)消息处理机制分析(12)
  9. RM格式转换成VCD
  10. human-robotic eco system