`
- 浏览:
4052069 次
-
在Android系统,系统设置里面,提供了挂载,卸载与格式化的功能。在这里,我们可以回忆一下,Android在挂载sd卡有几个途径,卸载又是有几种方法?一、挂载sd卡,有2种方式:1.用户自己挂载sd卡;2.自动挂载sd卡,这时候是在Android系统启动完成后挂载的,所以可以看成是自动挂载;二、卸载sd卡,有2种方式:1.用户自己卸载sd卡;2.用户移除sd卡;卸载sd卡,1和2看起来有点矛盾,但这相当于平时我们在电脑使用U盘一样,一种是先安全删除再移除U盘;一种是不安全删除直接移除U盘;所以在Android系统中,卸载sd卡有两个途径:1.Framework下发卸载命令(volume unmount sdcard force),卸载sd卡;2.vold捕获到移除事件,如果是非安全删除sd卡,那么就卸载sd卡。所以挂载与卸载sd卡的两种方法不同,挂载sd卡都是由Framework下发命令,而卸载sd卡则不同。一、先来分析Framework下发卸载命令:
截取CommandListener类其中的源码:
-
elseif(!strcmp(argv[1],"unmount")){
-
if(argc<3||argc>4||(argc==4&&strcmp(argv[3],"force"))){
-
cli->sendMsg(ResponseCode::CommandSyntaxError,"Usage:volumeunmount<path>[force]",false);
-
return0;
-
}
-
-
boolforce=false;
-
if(argc>=4&&!strcmp(argv[3],"force")){
-
force=true;
-
}
-
rc=vm->unmountVolume(argv[2],force);
-
}
这条卸载命令的格式是:volume unmount sdcard true/false.这里有一个强制卸载的标志,也就是force参数,如果命令包含“force”字符串,那么就强制卸载sd卡,接下来看unmountVolume卸载函数:
-
intVolumeManager::unmountVolume(constchar*label,boolforce){
-
Volume*v=lookupVolume(label);
-
......
-
-
cleanupAsec(v,force);
-
-
returnv->unmountVol(force);
-
}
开始看卸载函数,以下函数均做简化,不再贴出大量源码,Android系统的源码实在太多:
-
intVolume::unmountVol(boolforce){
-
-
setState(Volume::State_Unmounting);
-
-
if(doMoveMount(getMountpoint(),SEC_STGDIR,force)){
-
SLOGE("Failedtomovemount%s=>%s(%s)",getMountpoint(),SEC_STGDIR,strerror(errno));
-
setState(Volume::State_Mounted);
-
return-1;
-
}
-
-
if(doUnmount(Volume::SEC_STG_SECIMGDIR,force)){
-
SLOGE("Failedtounmounttmpfson%s(%s)",SEC_STG_SECIMGDIR,strerror(errno));
-
gotofail_republish;
-
}
-
-
if(doUnmount(Volume::SEC_ASECDIR,force)){
-
SLOGE("Failedtoremovebindmounton%s(%s)",SEC_ASECDIR,strerror(errno));
-
gotofail_remount_tmpfs;
-
}
-
if(doUnmount(Volume::SEC_STGDIR,force)){
-
SLOGE("Failedtounmount%s(%s)",SEC_STGDIR,strerror(errno));
-
gotofail_recreate_bindmount;
-
}
-
-
-
-
setState(Volume::State_Idle);
-
-
mCurrentlyMountedKdev=-1;
-
return0;
-
}
二、vold捕获移除事件,调用卸载函数:
-
voidDirectVolume::handlePartitionRemoved(constchar*devpath,NetlinkEvent*evt){
-
intmajor=atoi(evt->findParam("MAJOR"));
-
intminor=atoi(evt->findParam("MINOR"));
-
charmsg[255];
-
intstate;
-
-
SLOGD("Volume%s%spartition%d:%dremoved\n",getLabel(),getMountpoint(),major,minor);
-
-
-
-
-
-
-
-
state=getState();
-
if(state!=Volume::State_Mounted&&state!=Volume::State_Shared){
-
return;
-
}
-
-
-
if((dev_t)MKDEV(major,minor)==mCurrentlyMountedKdev){
-
-
-
-
-
snprintf(msg,sizeof(msg),"Volume%s%sbadremoval(%d:%d)",
-
getLabel(),getMountpoint(),major,minor);
-
mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,
-
msg,false);
-
-
if(mVm->cleanupAsec(this,true)){
-
SLOGE("FailedtocleanupASEC-unmountwillprobablyfail!");
-
}
-
-
if(Volume::unmountVol(true)){
-
SLOGE("Failedtounmountvolumeonbadremoval(%s)",
-
strerror(errno));
-
-
}else{
-
SLOGD("Crisisaverted");
-
}
-
}elseif(state==Volume::State_Shared){
-
-
-
snprintf(msg,sizeof(msg),"Volume%sbadremoval(%d:%d)",
-
getLabel(),major,minor);
-
mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,
-
msg,false);
-
-
if(mVm->unshareVolume(getLabel(),"ums")){
-
SLOGE("Failedtounsharevolumeonbadremoval(%s)",
-
strerror(errno));
-
}else{
-
SLOGD("Crisisaverted");
-
}
-
}
-
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Android-vold源码分析
android-vold架构[收集].pdf
android中vold代码分析,主要用来自动挂载设备
android系统vold透析 Vold的全称是 Volume Daemon
在Android 系统中所有的热插拔设备都是通过Vold 进程挂载的。通过kernel–>vold–>StorageManagerService这样的架构去逐级上报热插拔事件。 一、Vold 入口 --> /system/vold/main.c int main(int argc, char** ...
USB之android_Vold分析.pdf
此篇文章详细描述了USB之android_Vold_分析
android中VOLD代码框架的讲解和分析,设计到存储管理
详细介绍androi系统对外部存储器(sdcard、U盘)挂载与卸载机制,为系统级APP涉及USB设备读写提供参考,例如:平板、机顶盒U盘的读写
主要目录 1 Vold简介 2 Vold功能介绍 3 Vold通信 4 USB Storage Framework结构分析
USB之android_Vold分析,分析了linux udev与android vold的关系由来,vold的功能、架构,使用netlink的通信过程。kernel的uevent发送,framework层的处理、磁盘的挂载等等。
Android系统启动过程分析 本文主要介绍Android系统的启动过程,以Androidinit进程之后部分为主,init之前部分同标准Linux内核启动完全相同。于Android启动过程复杂,涉及C、C++及java部分内容,本文以流程分析为主线...
android系统vold架构与流程透析
本文档详细地介绍了android系统挂载中的vold,对vold的由来、功能、内部架构以及通信等方面进行了较为详细的介绍与较为深入的分析,是学习android挂载方面知识的一份比较好的材料。
解析android中Vold进程,让大家更好更快的掌握Vold
Android vold 多U盘多分区挂载实现 可以对比原生的vold代码查看修改
android平台移植ntfs-3g使支持ntfs格式tf卡、U盘、stat硬盘挂载,解压文件到external目录下,mm编译成功后,可手动指行 ntfs-3g /dev/block/vold/* /storage/sdcard1 或者添加 Ntfs.cpp Ntfs.h到system/vold目录实现...
Vold:Volume Daemon , 用于管理和控 制Android 平台外部存储设备的后台进 程,这些管理和控制,包括SD卡的插拔事 件监测、 SD卡挂载、卸载、格式化等。