android move to sdcard 和 app 大小 相关知识

android move to sdcard 和 app 大小 相关知识

理论部分

引题

android手机在某些机型和系统上,自带了move to sdcard功能,其实该功能是尽可能把数据存储放在外部存储上,减少app在内部存储所占用的内存。因为在手机里面,内部存储的大小是远远小于外部存储的大小的。内部存储价格也更昂贵一些。

内部存储和外部存储

提到这部分首先要说一些这两者的区别。

android 系统下的data目录就是内部存储,需要权限才能打开这个文件夹,不过我们可以访问里面的数据。

外部存储是我们可以经常去操作的空间,一般是android系统下的/storage/目录,在不同的机型上,也可能是/mnt/目录。

其下面的/sdcard/目录,是经常去操作的空间,有时系统会把sdcard/目录单独拿出来,而在storage下的/primary/目录下提供了sdcard/目录的引用链接。

安装app时发生的操作

首先在安装app后,会在data目录下(data目录下有两个文件夹名字分别为data和app),data 里存放/data/包名/cache, /data/包名/files, /data/包名/databases, /data/包名/shared_prefs, app目录下存放apk文件:/app/包名.apk, 以上在安装时便会创建。称之为内部存储app占用部分;

move to sdcard时发生的操作

当去move to sdcard时,会在storage/sdcard/下创建一个该以该app为包名的文件夹,里面存放相关内容,在该包名目录下,其他的所有文件夹都和在内部存储的一样,然后,系统会移动内部存储目录下的内容到该目录下;(注意:有一些lib和缓存是不能移动过去的,同时还有一部分记录该app位置信息的内存仍在内部存储下。)

这是引起,在移动app后导致app的总大小变大的原因,是系统去做的一些文件处理。

实现逻辑部分

move to sdcard ,既然有移动,必然涉及到app的大小和app可移动的大小以及sdcard的大小问题。

获取app大小

获取app应用程序大小: 应用程序总大小 = cach(缓存) + code (应用程序包大小) + data(数据存储)。

需要涉及到部分AIDL

  • IPackageDataObserver.aidl
  • IPackageStatsObserver.aidl
  • PackageStats.aidl

因为app的大小数据存放在一个叫PackageStats里面,需要利用aidl,反射的机制去获取到。其中:

packageStats.codeSize; 程序大小
packageStats.cacheSize; 缓存大小
packageStats.dataSize; 数据大小
packageStats.packageName; 包名

获取app可移动大小

这部分网上的资料很少,因为显示出的数据大小与app的各项数据均不相同。最后没办法,只好反编译,去看一下具体是如何实现的。最终得到了一个答案,答案比较简单,计算了该app为包名的目录的大小,如下:


//获取applicationInfo
packageManager.getApplicatioinInfo("packageName", int);

//获取包的路径及文件的大小
new File (applicationInfo.sourceDir()).length();

但其实,仍然没有搞明白为什么这样获取的大小和上面app各项大小都不相同……

获取sdcard大小和剩余空间

首先判断是否支持sdcard移动

private boolean isSDCardMounted() {
    if(”mounted”.equals(Environment.getExternalStoragestate())) {
        return true;
    }
    
    return false;
}

...
//等等,其他条件

获取sdcard大小

private long getSDCardSize() {
    if (isSDCardMounted()) {
        StatFs fs = new StatFs(getSDCardBaseDir());
       long count = fs.getBlockCountLong();
       long size = fs.getBlockSizeLong();
       return size * count;
    }
    
    return 0;
}

获取sdcard剩余大小

private long getSDCardAvailableSize() {
    if (isSDCardMounted()) {
        StatFs fs = new StatFs(getSDCardBaseDir());
       long count = fs.getAvailableBlocksLong();
       long size = fs.getBlockSizeLong();
       return size * count;
    }
    
    return 0;
}

以上是对android move to sdcard 方面知识的总结,有错误地方和理解不深刻地方还请指出,谢谢

参考链接 android 中的内部存储与外部存储

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容