App2sd功能和Asec文件

2014/08/25

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

  • 1. asec 文件是什么?

    asec的全称是Android Secure External Caches

    以前app安装好之后,app和app的数据都是放在data分区,而data分区经常存储空间不够,

    于是从Android 2.2, Froyo版本开始,Android开始支持App2Sd功能,

    所谓的App2Sd就是安装apk时把apk安装到Sd卡,apk的数据也放到sd卡,

    官方的app2sd功能比较鸡肋,由开发者自己决定是否支持app2sd功能,这样大部分应用不支持app2sd功能

    而民间的app2sd功能实现时,直接把sdcard挂载到data目录,这样所有的数据都会放在sdcard上,

    如果sdcard够大的话,便能解决手机data分区不够的问题。

    官方的app2sd功能实现时会建立/sdcard/android_secure,

    然后在该目录为每个支持app2sd功能的应用建立asec文件

  • 2.官方app2sd功能的最初实现

    官方实现的app2sd功能,最初是在/sdcard目录下建立一个android_secure目录,

    然后在该目录下为支持app2sd功能的应用建立一个对应包名的asec文件,

    比如com.shuame.mobile,那么建立的文件是com.shuame.mobile.asec,

    asec文件是一个镜像文件,Android利用该文件建立一个loop设备,

    Android还会为每个应用创建一个挂载点,例如:/asec/com.shuame.mobile

    然后将建立好的loop设备挂载到/asec/com.shuame.mobile

  • 3. asec文件存在哪个目录

    最初asec文件存放在/sdcard/android_secure目录,

    后来存放在/sdcard/.android_secure目录下

  • 4. 为了保护sdcard目录下的android_secure目录不被其它第三方应用搞坏,所采取的措施

    为了保护sdcard目录下的android_secure目录不被其它第三方应用搞坏,

    最先采取的措施是采取挂载一个只读并且零字节的临时文件系统到/sdcard/android_secure目录,

    这样第三方应用就不能操作该目录

    为了实现该目的,采取的步骤如下所示:

    1) Mount checked media at a secure location (/mnt/secure/staging)

    2) Ensure /android_secure exists on the media, (creating if it doesnt)

    3) Bind-mount /mnt/secure/staging/android_secure -> /mnt/secure/asec

    (where only root can access it)

    4) Mount an RDONLY zero-sized tmpfs over /mnt/secure/staging/android_secure

    5) Atomically move /mnt/secure/staging to the publicly accessable storage

    directory (/mnt/sdcard),move挂载时,其实是使用了MS_BIND选项

    采取这个措施后, Android还为每个应用创建的挂载点也变化了,

    放在/mnt/asec目录,例如/mnt/asec/com.shuame.mobile,

    所以在支持app2sd功能的手机上常常可以看到很多/mnt/asec/* 的挂载点

    后来为了进一步保护android_secure目录,

    将android_secure目录重命名为.android_secure目录

  • 5. /data/app-asec目录用途

    /*Path to external storage where *only* root can access ASEC image files*/

    const char *Volume::SEC_ASECDIR_EXT = "/mnt/secure/asec";

    /*Path to internal storage where *only* root can access ASEC image files*/

    const char *Volume::SEC_ASECDIR_INT = "/data/app-asec";

    /mnt/secure/asec对应外置sd卡上的.android_secure目录,

    /data/app-asec对应内置sd卡上的.android_secure目录,

    该目录下一般用于存放asec文件,Android系统会将这些asec镜像文件挂载到/mnt/asec/com.*

¥打赏5毛

取消

感谢您的支持,我会继续努力的!

扫码支持
赏个5毛,支持我把

打开支付宝扫一扫,即可进行扫码打赏哦

本篇目录