在调试android设备时遇上设备有多个usb接口的情况,此时在usb上接入多个U盘,发现先接入的U盘和后接入的U盘挂载点与接入顺序有关系。比如对于挂载节点/mnt/storage1,存在谁先插入谁就县挂载的问题,这对于应用来说并不友好,因为应用可能希望将数据都保存到一个固定的usb接口上接入的设备中,此时可以使用本文中提供的修改方式,主要是修改fstab和android的init.rc实现。

1、查看接入点信息

我们需要先知道每个usb节点对应fstab中的记录,这个很好获得,第一个是插入存储设备时通过内核的打印得知,还有一种方式是通过插入u盘设备时vold的挂载打印信息获取,但是日志都有可能没有打开,所以这里需要按照实际情况查看。如本文中使用如下命令查看vold中相关打印:

logcat -c;logcat -v time -s VoldConnector

此时接入U盘,可以看到打印的日志中有如下信息:

1-01 08:18:31.411 D/VoldConnector( 6505): RCV <- {640 disk:8:0 [  441.323363] sd 3:0:0:0: [sda] Attached SCSI removable disk8}01-01 08:18:31.412 D/VoldConnector( 6505): RCV <- {641 disk:8:0 30752000000}01-01 08:18:31.413 D/VoldConnector( 6505): RCV <- {642 disk:8:0 SanDisk 01-01 08:18:31.413 D/VoldConnector( 6505): }01-01 08:18:31.413 D/VoldConnector( 6505): RCV <- {644 disk:8:0 /sys//devices/soc.0/1c1c000.ehci2-controller/usb2/2-1/2-1:1.0/host3/target3:0:0/3:0:0:0/block/sda}01-01 08:18:31.459 D/VoldConnector( 6505): RCV <- {650 public:8:4 0 "disk:8:0" ""}01-01 08:18:31.460 D/VoldConnector( 6505): RCV <- {651 public:8:4 0}01-01 08:18:31.460 D/VoldConnector( 6505): SND -> {34 volume mount public:8:4 2 0}01-01 08:18:31.460 D/VoldConnector( 6505): RCV <- {643 disk:8:0}01-01 08:18:31.460 D/VoldConnector( 6505): RCV <- {651 public:8:4 1}01-01 08:18:31.525 D/VoldConnector( 6505): RCV <- {652 public:8:4 vfat}01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {653 public:8:4 usbhost2}01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {654 public:8:4 KRMSVOL_CN_}01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {656 public:8:4 /mnt/media_rw/usbhost2}01-01 08:18:31.526 D/VoldConnector( 6505): RCV <- {655 public:8:4 /storage/usbhost2}[  442.689739] FAT-fs (sda4): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.01-01 08:18:32.855 D/VoldConnector( 6505): RCV <- {651 public:8:4 2}01-01 08:18:32.856 D/VoldConnector( 6505): RCV <- {200 34 Command succeeded}01-01 08:18:32.856 E/VoldConnector( 6505): NDC Command {34 volume mount public:8:4 2 0} took too long (1397ms)
其中/devices/soc.0/1c1c000.ehci2-controller/为该U盘对应到设备中的节点数据,这部分说的有点模糊,表达能力不好,具体也就是每个usb设备接入后内核中会生成保存相关信息的节点,而这个和接入的usb端口是有关系的,所以我们需要得到这个信息,后面用这个信息直接挂到对应的挂载节点上。

2、fstab中指定挂载名

修改fstab,修改上面设备节点对应的挂载点的label标签,标签主要包含在fstab的挂载flag中,voldmanaged后,这个字段的说明在android源码fs_mgr.c中进行解析,解析是会获取其等号后面的值并以冒号隔开,其中冒号隔开的第一个部分为挂载的label标签,第二个为序号,具体我也不清楚什么意思,不知道是不是为了满足一个接入的存储设备保护多个分区而准备的,这里我们使用默认的auto,我们为我们的每个usb接入点分配不同的label,这样就能保证每个usb对应的挂载点都是唯一的。我修改后的fstab如下:

# Android fstab file.#                                               # 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/by-name/system               /system             ext4    ro,barrier=1                                                                   wait,verify/dev/block/by-name/cache                /cache              ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc                   wait,check,formattable/dev/block/by-name/mediadata            /mediadata          ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc                   wait,check,formattable/dev/block/by-name/alog                 /logger             ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=continue   wait,check,formattable/dev/block/by-name/data                 /data               ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc                   wait,check,formattable/dev/block/by-name/UDISK                /udisk               ext4    defaults   wait,check,formattable/devices/soc.0/1c11000.sdmmc/mmc_host/mmc*  auto                vfat    defaults                                                                wait,check,voldmanaged=sdcard:auto/devices/soc.0/1c0f000.sdmmc/mmc_host/mmc*  auto                vfat    defaults                                                                wait,check,voldmanaged=extsd:auto/devices/soc.0/1c12000.sdmmc/mmc_host/mmc*  auto                vfat    defaults                                                                wait,check,voldmanaged=extsd2:auto/devices/soc.0/1c10000.sdmmc/mmc_host/mmc*  auto               vfat    defaults                                                                wait,check,voldmanaged=extsd3:auto/devices/soc.0/1c13000.udc-controllerauto                vfat    defaults                                                                wait,check,voldmanaged=usbhost:auto/devices/soc.0/1c14000.ehci0-controller/usb*    auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost1:auto/devices/soc.0/1c14000.ohci0-controller/usb*auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost1:auto/devices/soc.0/1c1c000.ehci2-controller/usb*auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost2:auto/devices/soc.0/1c1c000.ohci2-controller/usb*auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost2:auto/devices/soc.0/1c19000.ehci1-controller/usb*auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost3:auto/devices/soc.0/1c19000.ohci1-controller/usb*auto                vfat    defaults                                                                wait,check,voldmanaged=usbhost3:auto/dev/block/zram0                             none           swap    defaults                                                                zramsize=134217728

3、修改init.rc

这部分也可以不修改,只不过有时候fstab挂载的路径很长,这个时候可以在init.rc中创建一个软连接到fstab挂载的目录上,然后应用直接使用init.rc中创建的软连接来操作存储设备。如我建立了一个/mnt/usbhost的挂载目录用来保存所有的usb存储设备的软连接,之后创建了三个软连接到具体挂载的目录上:

mkdir   /mnt/usbhost 0777 system systemsymlink /storage/usbhost1 /mnt/usbhost/Storage01symlink /storage/usbhost2 /mnt/usbhost/Storage02symlink /storage/usbhost3 /mnt/usbhost/Storage03


更多相关文章

  1. android的UI中include、merge和viewstub用法
  2. android4.4 debug调试授权拦截(替换掉 允许USB调试吗? UI)
  3. Android自己定义NumberPicker
  4. Android直播软件开发中接入腾讯IM大概流程是怎样的
  5. Android(安卓)App支付系列(二):支付宝SDK接入详细指南(附官方支付de
  6. [送给不懂android的开发者]react-native如何替换android图标资源
  7. android解析xml文件的方式之DOM解析
  8. 向android 的状态栏中加入快捷按钮(home,back,menu等等)的方法(续)
  9. android studio修改项目名,模块名,包名

随机推荐

  1. 《android recyclerview的简单使用》
  2. android 屏幕方向随传感器变化,并带有切换
  3. 酷炫的android dialog弹出框
  4. Android属性动画-简单实例
  5. java Android 算一定业务规定的工作日(除
  6. Android emulated sdcard
  7. Android保存图片到本地
  8. 在android4.2中添加自己的intent事件并使
  9. 关于android 调用系统图片浏览器并返回图
  10. ubuntu环境开发android时候无法找到aapt