前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android之VOLD:staging目录作用与ASEC文件 -总结[通俗易懂]

android之VOLD:staging目录作用与ASEC文件 -总结[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-13 16:52:36
7220
发布2022-09-13 16:52:36
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

  1. /mnt/secure/staging 来看一下mountVol代码 int Volume::mountVol() { int rc = 0; char errmsg[255]; const char *mountPath; char devicePath[255]; sprintf(devicePath, “/dev/block/vold/%d:%d”, MAJOR(mDevNodeIndex), MINOR(mDevNodeIndex));//得到设备节点,如:/dev/block/vold/8:1 SLOGI(“%s being considered for volume %s …major : %d minor: %d\n”, devicePath, getLabel(), MAJOR(mDevNodeIndex),MINOR(mDevNodeIndex)); errno = 0; setState(Volume::State_Checking);//设置状态为checking整型为3 // TODO: find a way to read the filesystem ID bool isFatFs = true; bool isNtfsFS = true; //检查设备格式是否为Fat32 if (Fat::check(devicePath)) { if (errno == ENODATA) { SLOGW(“%s does not contain a FAT filesystem\n”, devicePath); isFatFs = false; } else { errno = EIO; /* Badness – abort the mount */ SLOGE(“%s failed FS checks (%s)”, devicePath, strerror(errno)); setState(Volume::State_Idle); return –1; } } //创建挂载目录 // create mountpoint if (mkdir(getMountpoint(), 0755)) { if (errno != EEXIST) { SLOGE(“Failed to create mountpoint %s (%s)”, getMountpoint(), strerror(errno)); return –1; } } /* * Mount the device on our internal staging mountpoint so we can * muck with it before exposing it to non priviledged users. */ errno = 0; //如果为sdcard则挂载到/mnt/secure/staging,否则挂载到挂载点————1 为什么? if(!strcmp(getLabel(),“sdcard”)) mountPath=“/mnt/secure/staging”; else mountPath=getMountpoint(); //接下来就是不同格式不同的挂载,这里支持两种格式:fat32,Ntfs if ( isFatFs ) { if (Fat::doMount(devicePath,mountPath, false, false, 1000, 1015, 0702, true)) { SLOGE(“%s failed to mount via VFAT (%s)\n”, devicePath, strerror(errno)); isFatFs = false; } isNtfsFS = false; } if ( isNtfsFS ) { if (Ntfs::doMount(devicePath, mountPath, true)) { SLOGE(“%s failed to mount via NTFS (%s)\n”, devicePath, strerror(errno)); isNtfsFS = false; } } if ( !isFatFs && !isNtfsFS ) { // unsupported filesystem return –1; } SLOGI(“Device %s, target %s mounted @ /mnt/secure/staging”, devicePath, getMountpoint()); if ( !strcmp(getLabel(), “sdcard”) ) { protectFromAutorunStupidity(); if (createBindMounts()) { 2.createBindMounts的作用有三点: “1).确认android_secure目录存在;2).挂载tmpfs ,目的是把该目录变成一个虚拟的分区,达到隐藏android_secure目录的目的,(为什么tmpfs有这个作用,请查看linux tmpfs)3)挂载/mnt/secure/staging/android_secure到/mnt/secure/asec;” SLOGE(“Failed to create bindmounts (%s)”, strerror(errno)); umount(“/mnt/secure/staging”); setState(Volume::State_Idle); return –1; } } /*—3.为什么现在才移到目标挂载目录? * Now that the bindmount trickery is done, atomically move the * whole subtree to expose it to non priviledged users. * 如果为sdcard则将/mnt/secure/staging 目录移动到挂载点,并将该目录unmount */ if(!strcmp(getLabel(),“sdcard”)){ if (doMoveMount(“/mnt/secure/staging”, getMountpoint(), false)) { SLOGE(“Failed to move mount (%s)”, strerror(errno)); umount(“/mnt/secure/staging”); setState(Volume::State_Idle); return –1; } } setState(Volume::State_Mounted);//设置状态到MountService mCurrentlyMountedKdev = mDevNodeIndex; return 0; 1.VOLD:/mnt/secure/staging作用是什么? 1)首先看android_secure的作用 android的官方解释: “vold: Stage the mounting of media to hide the ASEC imagefile() directory In order to protect the ‘/android_secure‘ directory on VFAT removable media from being mucked with by 3rd party applications on the device, we hide the directory with a read-only, zero-sized tmpfs mounted on-top. A reference to the hidden directory is kept by a bind-mount which is mounted at a location which only root can access. “ 为了保护在VFAT可移动媒体上的/ android_secure目录,避免被在android设备上的第三方应用程序搞乱,我们隐藏一个只读的大小为零的tmpfs的目录安装在最上层。的参照隐藏目录保持绑定安装,安装在一个位置只有root可以访问 “ Staging consists of(Staging 的步骤): 1. Mount checked media at a secure location (/mnt/secure/staging) 挂载被检查过的存储媒体(也就是SDcard)到一个安全的位置(到/mnt/secure/staging) 2. Ensure /android_secure exists on the media, (creating if it doesnt) 确保“/ android_secure”在存在该存储媒体(也就是SDcard)上(如果它不存在的,就创建它) 3. Bind-mount /mnt/secure/staging/android_secure -> /mnt/secure/asec (where only root can access it) 通过Volume::createBindMounts() 绑定挂载的存储媒体(也就是SDcard)到/mnt/secure/staging/android_secure到/mnt/secure/asec 也就是(ASEC imagefile ) (只有root可以访问它) 4. Mount an RDONLY zero-sized tmpfs over /mnt/secure/staging/android_secure 挂载一个RDONLY的,且零大小的tmpfs到/mnt/secure/staging/android_secure 为什么要mount一个tempfs文件系统呢?因为tmpfs的优势:没有块设备,只存在内存,速度快 也就是把该目录作为一个虚拟的分区(应为有了文件系统),后面就可以通过mount(SEC_STG_SECIMGDIR, SEC_ASECDIR, “”, MS_BIND, NULL) 把/mnt/secure/staging/android_secure到/mnt/secure/asec 5. Atomically move /mnt/secure/staging to the publicly accessable storage directory (/mnt/sdcard) 原子移动doMoveMount:/mnt/secure/staging到的可以让应用程序公开访问的存储目录(/mnt/sdcard) “ 也就是临时目录staging的作用就是为了保护android_secure。 2)其次 那android_secure的来源是什么?也就是为什么要把保护它android_secure? 先来看看历史: Google Android手机的软件为了安全性和稳定性都是默认安装到手机内存里,但是手机内存有限,所以我们会做app2sd操作,来让我们安装的软件放到sd卡上,这个操作是需要rom的支持的。 Android 2.2 可以将手机程序安装在外置的sd卡上,也就是我们平常所说的app2sd。但是,官方的app2sd非常鸡肋,需要软件自身支持安装在内存卡上才可以,也就是说用官方的app2sd,要把程序安装在内存卡上,并不是我们使用者说了算,而是软件开发者说了算。经测试安装60多个软件,其中仅有可怜的5个程序能使用官方的app2sd安装在内存卡上。所以,官方的这个app2sd就是忽悠人的。当然,现在很多第三方ROM都自带了第三方的app2sd,可以将任何程序都安装在sd卡上。 ——-应用程序相关的系统目录: “ /system 存放的是rom的信息;/system/app 存放rom本身附带的软件即系统软件;/system/data 存放/system/app 中核心系统软件的数据文件信息。 /data 存放的是用户的软件信息(非自带rom安装的软件); /data/app 存放用户安装的软件; /data/data 存放所有软件(包括/system/app 和 /data/app 和 /mnt/asec中装的软件)的一些lib和xml文件等数据信息; /data/dalvik-cache 存放程序的缓存文件,这里的文件都是可以删除的。 ” ———应用程序相关的数据目录: 那么app2sd 的应用程序数据需要哪些关键的文件夹来保存呢? 用户程序安装到到sd卡上后,其内容可能分散到:/mnt/asec , /mnt/secure , /data/data 我们最关注“/mnt/asec 目录和 /mnt/secure 目录。所以当SD卡挂载于手机时,/mnt/sdcard/.android_secure 目录会被映射到/mnt/asec 目录和 /mnt/secure 目录。其中/mnt/asec 目录中主要是程序的安装目录,包括其执行文件和lib文件等;而/mnt/secure 目录中就存放程序加密后的档案。 ”例如:

解密档案:

另外注意: 就是说,在/mnt路径下看到的/mnt/asec目录和/mnt/secure目录并不是真正存在在手机内存或者sd卡的分区挂载目录,他们本省只是根文件系统初始化的时候创建的两个目录,它们只是/mnt/sdcard/.android_secure目录的一个影像而已(也就是挂载点), 怎么看出来呢? 很简单,打开手机的mass storage。如下:

在通过ADB查看/mnt/asec目录和/mnt/secure 就发现是空的目录:

3)什么时候Bind-mount /mnt/secure/staging/android_secure -> /mnt/secure/asec? 也就是/mnt/secure/staging/android_secure 会被mount到/mnt/secure/asec const char *Volume::SEC_STG_SECIMGDIR = “/mnt/secure/staging/android_secure“; + * Path to where *only* root can access asec imagefiles +const char *Volume::SEC_ASECDIR = “/mnt/secure/asec“; 通过Volume::createBindMounts { …………… /* + * Bind mount /mnt/secure/staging/android_secure -> /mnt/secure/asec so we’ll + * have a root only accessable mountpoint for it. + */ + if (mount(SEC_STG_SECIMGDIR, SEC_ASECDIR, “”, MS_BIND, NULL)) { + LOGE(“Failed to bind mount points %s -> %s (%s)”, + SEC_STG_SECIMGDIR, SEC_ASECDIR, strerror(errno)); + return -1; + } ………………… } 执行完之后:sdcard/.android_secure目录下的*.asec文件就被mount到/mnt/secure/asec:如下

4)mount完之后/mnt/secure/asec的文件如何解析到/mnt/asec? int VolumeManager::mountAsec(const char *id, const char *key, int ownerUid) { 607 char asecFileName[255]; 608 char mountPoint[255]; 609 610 snprintf(asecFileName, sizeof(asecFileName), “%s/%s.asec”, Volume::SEC_ASECDIR, id);//SEC_ASECDIR=/mnt/secure/asec 611 snprintf(mountPoint, sizeof(mountPoint), “%s/%s”, Volume::ASECDIR, id);//ASECDIR=/mnt/asec ….. 总结为什么药先mount sdcard到/mnt/secure/staging/的原因:, “那也就是说android_secure存放的是安装在SDcard的应用程序的的加密档案。那么在挂载的过程需要被保护起来,避免在挂载过程,应用程序访问该档案而被破坏,我觉得就是一个读写的互斥问题。” 2.关于 ASEC文件 What is an asec File? Filetype Android Secure Application File “ File used by Froyo, the version 2.2 release of the Android mobile operating system; stores mobile application data using proprietary encryption; saved to the.android_secure folder of a device’s SD card; can be run with the Android SDKemulator. The secure ASEC format allows applications to exist on mobile devices without being modified or corrupted by other programs. “ References

  1. filefacts.net Files with the .asec file e…
  2. fileinfo.com File used by Froyo, the ver… How to Open .ASEC Files? Program(s) that open .ASEC files Mac OS: Google Android SDK download Windows: Google Android SDK download via fileinfo.com 源文档 <http://asec.filebio.com/asec-file-extension>

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162121.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档