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

android之VOLD:staging目录作用与ASEC文件 -总结[通俗易懂]/mnt/secure/staging来看一下mountVol代码 int Volume::mountVol() {    int rc = 0;    char errmsg[255];    const char *mountPath;         char devicePath[255];                sprintf(device

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

  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, falsefalse100010150702true)) {

                    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 tmpfs3)挂载/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 ofStaging 的步骤):
      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中装的软件)的一些libxml文件等数据信息;

    /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 目录中就存放程序加密后的档案。 ”例如:

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

    解密档案:

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

     

    另外注意:

    就是说,在/mnt路径下看到的/mnt/asec目录和/mnt/secure目录并不是真正存在在手机内存或者sd卡的分区挂载目录,他们本省只是根文件系统初始化的时候创建的两个目录,它们只是/mnt/sdcard/.android_secure目录的一个影像而已(也就是挂载点)

    怎么看出来呢? 很简单,打开手机的mass storage。如下:

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

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

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

     

    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:如下

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

     

    4mount完之后/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

  2. filefacts.net Files with the .asec file e…
  3. 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.net/162121.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue-router 多级路由redirect 重定向的问题

    vue-router 多级路由redirect 重定向的问题在做多级路由的时候遇到很多问题,虽然不难,但是如果没有经验,往往要花一整天时间才能解决(可能我笨),况且网上资料也很少。项目需要是这样的:登录页面跳到后台页面重定向,登录页是一级路由对应页面登录后:同时重定向二级和三级页面,这样登录就会重定向了,此时url但又有一个问题:当再次点击底部“堂食”的时候,url变成这样,并且三级页面没有出来解决办法是:在这个“堂食”按键添加一个方法记住,也只…

    2022年7月11日
    86
  • div内图片和文字水平垂直居中「建议收藏」

    div内图片和文字水平垂直居中「建议收藏」大小不固定的图片、多行文字的水平垂直居中本文综述想必写css的都知道如何让单行文字在高度固定的容器内垂直居中,但是您知道或者想过让行数不固定的文字在高度固定的容器内垂直居中呢?本文将会告诉你如何实现多行文字的垂直居中显示。关于图片垂直居中显示,想必很多写css的人都研究过,或者说是搜寻过方法。淘宝团队似乎提供了一种不错的方法,用font-size解决IE下垂直居中的问题,是

    2025年6月26日
    0
  • 分别以递归调用和迭代的方法求数列_迭代算法和递归算法

    分别以递归调用和迭代的方法求数列_迭代算法和递归算法对于数列,递归和迭代的联系非常紧密。a0,a1,a2,…,an−1,ana_0,a_1,a_2,…,a_{n-1},a_na0​,a1​,a2​,…,an−1​,an​数列就是一串数字,数列来源于生活,有用的数列中蕴含着规则。要完整描述一个数列,方法有二:通项公式an=f(n)a_n=f(n)an​=f(n)递推公式其中通项公式是最一般的情况。由通项公式可以求得任意一…

    2022年9月4日
    3
  • BindingNavigator控件[通俗易懂]

    BindingNavigator控件[通俗易懂]WinForm之中BindingNavigator控件的使用在微软WinForm中,BindingNavigator控件主要用来绑定数据。可以将一个数据集合与该控件绑定,以进行数据联动的显示效果。如图下图所示:那么,下面我们就来用BindingNavigator控件做一下上图所示的效果。分析:该案例以BindingNavigator控件为主线,我们定义一个实体类

    2022年7月12日
    30
  • 图文并茂 RAID 技术全解 – RAID0、RAID1、RAID5、RAID10

    图文并茂 RAID 技术全解 – RAID0、RAID1、RAID5、RAID10    RAID技术相信大家都有接触过,尤其是服务器运维人员,RAID概念很多,有时候会概念混淆。这篇文章为网络转载,写得相当不错,它对RAID技术的概念特征、基本原理、关键技术、各种等级和发展现状进行了全面的阐述,并为用户如何进行应用选择提供了基本原则,对于初学者应该有很大的帮助。一、RAID概述  1988年美国加州大学伯克利分校的D.A.Patterson教授等首次…

    2022年7月15日
    24
  • rabbitmq使用mqtt协议[通俗易懂]

    rabbitmq使用mqtt协议[通俗易懂]提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、rabbitmq是什么?二、mqtt协议是什么?三、使用步骤1.引入库2.读入数据总结前言在网上学习物联网,发现有人可以用springboot+rabbitmq可以搭建物联网(IOT)平台,rabbitmq不是消息队列吗,原来rabbitmq有两种协议,消息队列是用的AMQP协议,而用在智能硬件中的是MQTT协议。一、rabbitmq是什么?示例:pandas是基于NumPy的一种工具,该工具是为了解

    2022年10月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号