android6.0 mount failed

本文分析了Android系统中mount操作失败的原因,主要包括配置文件错误和SELinux权限设置问题,并提供了具体的排查与修复方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mount失败有两个原因:

1)配置文件配置出错

android6.0 vold进程中会读取配置文件 /fstab.XXX

 if (process_config(vm)) {
        PLOG(ERROR) << "Error reading configuration... continuing anyways";
    }


std::string DefaultFstabPath() {
    char hardware[PROPERTY_VALUE_MAX];
    property_get("ro.hardware", hardware, "");
    return StringPrintf("/fstab.%s", hardware);
}


把路径加到一个集合中:

void VolumeManager::addDiskSource(const std::shared_ptr<DiskSource>& diskSource) {
    mDiskSources.push_back(diskSource);
}

当插入一个设备时,vold会检测这个设备的是否与配置文件中的设备一值,一致才会进行后续的mount操作。主要检测'DEVPATH=/devices/soc0/soc.0/2100000.aips-bus/2190000.usdhc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1'

04-23 20:12:56.923   186   211 V vold    : ----------------
04-23 20:12:56.923   186   211 V vold    : handleBlockEvent with action 2
04-23 20:12:56.923   186   211 D NetlinkEvent: NL param 'DEVPATH=/devices/soc0/soc.0/2100000.aips-bus/2190000.usdhc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1'
04-23 20:12:56.923   186   211 D NetlinkEvent: NL param 'MAJOR=179'
04-23 20:12:56.923   186   211 D NetlinkEvent: NL param 'MINOR=1'
04-23 20:12:56.923   186   211 D NetlinkEvent: NL param 'DEVNAME=mmcblk0p1'
04-23 20:12:56.923   186   211 D NetlinkEvent: NL param 'DEVTYPE=partition'
04-23 20:12:56.923   186   211 D NetlinkEvent: NL param 'PARTN=1'

而我的配置文件内容如下:

/devices/soc0/soc.0/2100000.aips-bus/2198000.usdhc/mmc_host* auto auto defaults voldmanaged=sdcard:auto,encryptable=userdata 修改即可


2)setexeccon()函数报错,这个函数跟selinux相关,已经把selinux功能整个去掉了,但是这里还是报错。不知道为什么,没有找到函数实现。屏蔽这个函数就可以了。

if (setexeccon(context)) {
        LOG(ERROR) << "Failed to setexeccon";
        abort();
    }


### 实现 Android 设备直接访问 U 盘文件读取操作 #### 权限设置 为了能够成功读取 U 盘上的文件,应用程序必须获得相应的存储权限。对于 SDK 版本低于 23 的情况,在 `AndroidManifest.xml` 中声明读写外部存储的权限即可[^2]。 ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 而对于更高版本,则还需要动态请求这些权限。这是因为自 Android 6.0 (API level 23) 开始引入了运行时权限机制,开发者需在应用启动期间向用户申请必要的权限。 #### 获取 U 盘挂载点路径 不同型号和品牌的 Android 设备可能有不同的默认挂载位置。通常情况下,U 盘会被挂载至 `/mnt/media_rw/USB_DEVICE_NAME` 或者类似的目录下。可以通过调用 `Environment.getExternalStorageDirectory()` 方法来尝试定位标准外置存储的位置;然而,当涉及到 USB OTG 设备时,这个方法并不总是可靠的。因此建议通过扫描整个文件系统树形结构的方式来发现所有可用的可移动媒体设备及其对应的挂载点。 #### 遍历 U 盘文件夹并显示文件列表 一旦确认了具体的挂载路径之后,就可以利用 Java IO 类库来进行进一步的操作了。下面给出了一段简单的代码片段用于展示如何枚举指定目录内的所有条目: ```java import java.io.File; public class UsbFileReader { public static void listFiles(String mountPointPath){ File rootDir = new File(mountPointPath); if(!rootDir.exists()){ System.out.println("Mount point does not exist."); return; } File[] filesList = rootDir.listFiles(); if(filesList != null && filesList.length > 0){ for(File f : filesList){ System.out.println(f.getName()); } }else{ System.out.println("No files found or unable to access the directory"); } } } ``` 这段程序会打印出给定挂载点下的所有顶层项目名称。如果想要更深入地探索子文件夹内容,则可以在遇到目录类型的对象时递归调用相同的方法。 #### 打开并读取特定文件内容 假设已经知道了目标文件的确切路径,那么接下来就可以像处理常规文件那样对其进行打开了。这里提供了一个 Qt C++ 风格的例子说明怎样逐行解析文本文件的数据[^4]: ```cpp #include <QFile> #include <QTextStream> void readFileContent(const QString& filePath){ QFile file(filePath); if(file.open(QIODevice::ReadOnly | QIODevice::Text)){ QTextStream stream(&file); while(!stream.atEnd()){ QString line = stream.readLine(); qDebug()<<line; // 输出每行数据到调试控制台 } file.close(); } else { qWarning()<<"Failed to open file."; } } ``` 需要注意的是,实际开发过程中应当考虑更多异常状况的发生可能性,并采取适当措施加以应对,比如捕获潜在 I/O 错误、验证输入参数的有效性等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值