当前位置: 首页 > news >正文

化妆品网站建设的维护兰州市新闻头条

化妆品网站建设的维护,兰州市新闻头条,医院网站需要前置审批,家装公司网站建设方案前言 我们分2篇文章来介绍Android 9.0中存储卡的挂载流程#xff0c;本篇文章先介绍总体的挂载模块、Vold进程的入口main函数的详细分析#xff0c;有了这些基础知识#xff0c;下一篇中我们再详细介绍收到驱动层消息是怎么挂载和卸载存储卡的#xff0c;还有framework层如…前言 我们分2篇文章来介绍Android 9.0中存储卡的挂载流程本篇文章先介绍总体的挂载模块、Vold进程的入口main函数的详细分析有了这些基础知识下一篇中我们再详细介绍收到驱动层消息是怎么挂载和卸载存储卡的还有framework层如何与vold进程通讯交流。Android 9.0 Vold挂载流程解析下 Android挂载模块整体框架 存储卡挂载模块由驱动层、vold进程、framework层、App层这几个模块注册vold进程通过Socket方式监听驱动层存储卡热插拔事件Add、Change 、Remove创建相应的磁盘管理类管理磁盘的生命周期状态提供挂载、卸载等功能并把相应磁盘信息状态通过Binder的方式回调给Framework层方便App层获取磁盘信息和状态。以下是其整体的模块框架图 从图中我们知道vold有三个核心的类NetlinkManager、VolumeManager、VoldNativeService这三个类在启动vold进程时就会调用其start方法启动NetlinkManager里创建了Socket连接并交给NetlinkHandler处理通讯,由NetlinkHandler监听驱动层发送的uevent事件并转发给VolumeManager处理VolumeManager接受到相应的事件会创建存储管理的类获取存储卡的信息和状态的并通过VoldNativeService回调给Framework层StorageManagerService处理StroageManagerService也可以通过binder机制调用VoldNativeSerivice的方法设置userId,shutdown等好让vold进程进行相应的处理。StorageManagerService也提供了存储卡操作相关的方法给APP调用App通过获取StorageManager类间接调用StorageManagerService中的方法。 Vold进程main函数详细分析 我们从Vold进程的main.cpp中入手开始分析 vold进程main.cpp路径system/vold/main.cpp int main(int argc, char** argv) {atrace_set_tracing_enabled(false);//设置日志等级setenv(ANDROID_LOG_TAGS, *:v, 1);android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM));LOG(INFO) Vold 3.0 (the awakening) firing up;ATRACE_BEGIN(main);//打印支持的底层文件系统LOG(VERBOSE) Detected support for: (android::vold::IsFilesystemSupported(ext4) ? ext4 : ) (android::vold::IsFilesystemSupported(f2fs) ? f2fs : ) (android::vold::IsFilesystemSupported(vfat) ? vfat : )// Mediatek Android Patch Begin (android::vold::IsFilesystemSupported(ntfs) ? ntfs : ) (android::vold::IsFilesystemSupported(cifs) ? cifs : );// Mediatek Android Patch EndVolumeManager *vm;NetlinkManager *nm;//解析参数parse_args(argc, argv);sehandle selinux_android_file_context_handle();if (sehandle) {selinux_android_set_sehandle(sehandle);} //创建/dev/block/vold目录挂载存储卡了其下有对应的节点信息mkdir(/dev/block/vold, 0755);/* For when cryptfs checks and mounts an encrypted filesystem */klog_set_level(6);/* Create our singleton managers *///单例模式获取VolumeManager对象if (!(vm VolumeManager::Instance())) {LOG(ERROR) Unable to create VolumeManager;exit(1);} //单例模式获取NetlinkManager对象if (!(nm NetlinkManager::Instance())) {LOG(ERROR) Unable to create NetlinkManager;exit(1);} //设置是否打开VolumeManager中的日志默认falseif (android::base::GetBoolProperty(vold.debug, false)) {vm-setDebug(true);} //调用其start方法稍后分析 1if (vm-start()) {PLOG(ERROR) Unable to start VolumeManager;exit(1);}bool has_adoptable;bool has_quota;bool has_reserved; //解析fstab文件该文件描述系统中各种文件系统的信息我以MTK9669为例分析其fsab文件路径在vendor/etc/fstab.m7642 //稍后详细分析该方法 2if (process_config(vm, has_adoptable, has_quota, has_reserved)) {PLOG(ERROR) Error reading configuration... continuing anyways;}ATRACE_BEGIN(VoldNativeService::start);//启动与framework通讯的服务if (android::vold::VoldNativeService::start() ! android::OK) {LOG(ERROR) Unable to start VoldNativeService;exit(1);}ATRACE_END();LOG(DEBUG) VoldNativeService::start() completed OK;ATRACE_BEGIN(NetlinkManager::start);//调用NetlinkManager start 方法 //稍后详细分析 3if (nm-start()) {PLOG(ERROR) Unable to start NetlinkManager;exit(1);}ATRACE_END();// This call should go after listeners are started to avoid// a deadlock between vold and init (see b/34278978 for details)//解析的参数设置到属性中android::base::SetProperty(vold.has_adoptable, has_adoptable ? 1 : 0);android::base::SetProperty(vold.has_quota, has_quota ? 1 : 0);android::base::SetProperty(vold.has_reserved, has_reserved ? 1 : 0);// Do coldboot here so it wont block booting,// also the cold boot is needed in case we have flash drive// connected before Vold launchedcoldboot(/sys/block);ATRACE_END();//将vold进程中主线程加入到线程池中android::IPCThreadState::self()-joinThreadPool();LOG(INFO) vold shutting down;exit(0); }通过以上代码分析我们总结其做了以下几件事 1.创建/dev/block/vold目录 2.单例模式获取NetlinkManager对象并调用其start方法 3.解析fstab文件 4.调用VoldNativeService::start()方法与framework通讯 5.单例模式获取VolumeManager对象并调用其start方法 接下来分析NetlinkManager中start方法,路径system/vold/NetlinkManager.cpp int NetlinkManager::start() {struct sockaddr_nl nladdr;int sz 64 * 1024;int on 1;memset(nladdr, 0, sizeof(nladdr));nladdr.nl_family AF_NETLINK;nladdr.nl_pid getpid();nladdr.nl_groups 0xffffffff; //创建socket客户端if ((mSock socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC,NETLINK_KOBJECT_UEVENT)) 0) {PLOG(ERROR) Unable to create uevent socket;return -1;}// When running in a net/user namespace, SO_RCVBUFFORCE will fail because// it will check for the CAP_NET_ADMIN capability in the root namespace.// Try using SO_RCVBUF if that fails.if ((setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, sz, sizeof(sz)) 0) (setsockopt(mSock, SOL_SOCKET, SO_RCVBUF, sz, sizeof(sz)) 0)) {PLOG(ERROR) Unable to set uevent socket SO_RCVBUF/SO_RCVBUFFORCE option;goto out;}if (setsockopt(mSock, SOL_SOCKET, SO_PASSCRED, on, sizeof(on)) 0) {PLOG(ERROR) Unable to set uevent socket SO_PASSCRED option;goto out;} //绑定服务端if (bind(mSock, (struct sockaddr *) nladdr, sizeof(nladdr)) 0) {PLOG(ERROR) Unable to bind uevent socket;goto out;} //交给NetlinkHander处理通讯mHandler new NetlinkHandler(mSock);if (mHandler-start()) {PLOG(ERROR) Unable to start NetlinkHandler;goto out;}return 0; //关闭socket out:close(mSock);return -1; }该方法处理很简单就是建立了Socket并交给其NetlinkHandler处理调用其start方法接下来看NetlinkHandler中做了什么 路径system/vold/NetlinkHandler.cpp int NetlinkHandler::start() {//调用其父类SocketListener中的方法开始监听服务端中的消息//消息会解析成NetlinkEvent对象作为参数并回调onEvent(NetlinkEvent *evt)方法return this-startListener(); }void NetlinkHandler::onEvent(NetlinkEvent *evt) {VolumeManager *vm VolumeManager::Instance();const char *subsys evt-getSubsystem();if (!subsys) {LOG(WARNING) No subsystem found in netlink event;return;}// 如果subsys是block类型的就调用VolumeManager的handleBlockEvent方法处理if (std::string(subsys) block) {vm-handleBlockEvent(evt);} } 通过以上代码分析NetlinkManager主要与驱动层建立Socket连接接收存储卡的插拔事件传递给VolumeManager处理。 回到main.cpp中分析下怎么解析fstab文件的先看下MTK9669中vendor/etc/fstab.m7642中的内容 第一列Src下面方法解析中的rec-blk_device属性用于匹配解析驱动穿过来的挂载的文件系统路径 第二列mnt_point,挂载点外部存储卡挂载为auto 第三列类型文件系统类型外部存储卡为auto 第四列第五列为mnt_flags、fs_mgr_flags文件系统挂载标志位 static int process_config(VolumeManager* vm, bool* has_adoptable, bool* has_quota,bool* has_reserved) {ATRACE_NAME(process_config);//解析fstab文件获取fstab结构体对象fstab_default fs_mgr_read_fstab_default();if (!fstab_default) {PLOG(ERROR) Failed to open default fstab;return -1;}/* Loop through entries looking for ones that vold manages */*has_adoptable false;*has_quota false;*has_reserved false;//遍历每一行数据for (int i 0; i fstab_default-num_entries; i) {auto rec fstab_default-recs[i];//fs_mgr_flags列是否包含了quotaif (fs_mgr_is_quota(rec)) {*has_quota true;}//reserved_size是否大于0if (rec-reserved_size 0) {*has_reserved true;}//fs_mgr_flags列是否有voldmanaged标志if (fs_mgr_is_voldmanaged(rec)) {//是否是不可移动的if (fs_mgr_is_nonremovable(rec)) {LOG(WARNING) nonremovable no longer supported; ignoring volume;continue;}std::string sysPattern(rec-blk_device);std::string nickname(rec-label);//add by liuxin debugLOG(DEBUG) sysPatternrec-blk_device,nicknamerec-label,mountPointrec-mount_point;int flags 0;//fs_mgr_flags是否encryptableif (fs_mgr_is_encryptable(rec)) {flags | android::vold::Disk::Flags::kAdoptable;*has_adoptable true;}//没有主存储卡if (fs_mgr_is_noemulatedsd(rec)|| android::base::GetBoolProperty(vold.debug.default_primary, false)) {flags | android::vold::Disk::Flags::kDefaultPrimary;}//把解析的参数创建DiskSource对象添加到VolumeManager中vm-addDiskSource(std::shared_ptrVolumeManager::DiskSource(new VolumeManager::DiskSource(sysPattern, nickname, flags)));}}return 0; } 上面代码解析了fstabe文件设置了has_adoptable、has_quota 、has_reserved属性并且fs_mgr_flags列是voldmanager解析处理创建DiskSource对象添加到VolumeManager中。 看打印如下 接下来分析VoldNativeService的start()方法VoldNativeService继承自BinderService,BinderService继承BBinder所以它是Binder机制中的服务端程序 status_t VoldNativeService::start() {IPCThreadState::self()-disableBackgroundScheduling(true);//注册当前客户端到binder驱动status_t ret BinderServiceVoldNativeService::publish();if (ret ! android::OK) {return ret;}//加入到binder线程池spProcessState ps(ProcessState::self());ps-startThreadPool();ps-giveThreadPoolName();return android::OK; }上述代码主要把当前的binder服务端加入到binder驱动中方便提供给客户端调用 接下来看第五个步骤VolumeManager的start方法 int VolumeManager::start() {ATRACE_NAME(VolumeManager::start);// Always start from a clean slate by unmounting everything in// directories that we own, in case we crashed.//卸载掉所有的存储卡unmountAll();Devmapper::destroyAll();Loop::destroyAll();// Assume that we always have an emulated volume on internal// storage; the framework will decide if it should be mounted.CHECK(mInternalEmulated nullptr);//创建内部存储卡mInternalEmulated std::shared_ptrandroid::vold::VolumeBase(new android::vold::EmulatedVolume(/data/media));mInternalEmulated-create();// Consider creating a virtual disk//虚拟存储卡不考虑updateVirtualDisk();return 0; }上面代码很简单先卸载所有的存储卡再创建了内部储存卡其EmulateVolume关于挂载卸载的操作我们在下一篇文章中再介绍了。 总结 本篇文章介绍总体的挂载模块、Vold进程的入口main函数的详细分析下一篇将介绍收到插拔事件如果管理存储卡信息和状态与Framework层通讯。 Android 9.0 Vold挂载流程解析下
http://www.hkea.cn/news/14315220/

相关文章:

  • 企业建站找哪家小程序开发公司网站源码下载
  • 8211 wordpress网站框架优化
  • 凡科网做网站如何推广如何规避电子政务门户网站建设教训
  • 做动图素材网站优化大师网页版
  • 有域名和主机怎么做网站收费的网站如何免费
  • 传媒公司网站建设思路seo职位
  • 个人网站开发的感想石家庄网页定制开发
  • 交通局网站模板做单页网站
  • 个人博客模板网站网页设计师培训哪个好
  • 做不了大流量网站南宁隆安网站建设
  • html5网站开发书籍哪个网站可以免费下载电视剧看
  • 15年做哪些网站致富淘宝网页打不开是什么原因
  • 网站建设登录结构图西安房产信息网官网
  • 苏州企业网站建站系统安徽制作网站专业公司
  • 湖南网红网站建设有限公司oppo软件商店官方网页
  • 中文单页面网站模板seo和网站建设那个先学
  • 兖州建设局网站微信头像做国旗网站
  • 成都高新区建设厅网站描述网站开发的广告词
  • php网站模板怎么用商城源码免费
  • 网站开发好什么进行界面的优化wordpress微信公众号企业版
  • 多个wordpress站点同步上海58同城招聘网最新招聘
  • 东莞企业网站模板建站做电影分享网站违法吗
  • 精品网站建设平台怎样做直播网站app
  • wordpress站点如何添加百度分享代码dede做视频网站
  • 网站建设文化服务郑州搭建网站公司
  • 国外 作品集 网站石排网站仿做
  • 网站建设 个体经营范围网站上传后
  • 无锡网站排名系统微网站开发制作
  • 品牌网站建设费用要多少潍坊网站建设优化
  • 淘宝内部卷网站建设上海小学网站建设招标