android 检查存储空间,android检查存储空间小结

这几天事情比较少,于是对前面用到的一些东西时行了总结。

android手机上面的存储空间主要有手机本身的存储空间和SD卡的存储空间。之前用的最多的是SD卡的存储空间,在总结的时候看了一下系统的源代码,很有收获。在手机安装应用时,系统会自动在/data/data目录下面以应用的主包名创建一个目录,默认还会在最后的那个目录里面创建一个lib目录。下面看一下系统获取存储空间的代码:

来自android2.3.3系统源代码/packages/apps/Settings/src/com/android/settings/applications/ManageApplications.java

531.mDataFileStats = new StatFs("/data");

532.mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString());

748.mDataFileStats.restat("/data");

try {

totalStorage = (long)mDataFileStats.getBlockCount() *

mDataFileStats.getBlockSize();

freeStorage = (long) mDataFileStats.getAvailableBlocks() *

mDataFileStats.getBlockSize();

} catch (IllegalArgumentException e) {

}

final int N = mApplicationsAdapter.getCount();

for (int i=0; i

734.mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString());

try {

totalStorage = (long)mSDCardFileStats.getBlockCount() * mSDCardFileStats.getBlockSize();

freeStorage = (long) mSDCardFileStats.getAvailableBlocks() * mSDCardFileStats.getBlockSize();

} catch (IllegalArgumentException e) {

// use the old value of mFreeMem

}

第531行代码是计算系统的空间,第532行是检查SD卡的空间。可以看出,系统检查的是/data目录下面的空间。手机都有一个参数ROM,那么ROM指的是什么空间?比如说G7,ROM是512M,那么空间是怎么分配的呢?还好手中的G7有root权限,不知道以下的操作需不需要root权限,有手机的同学可以试试。找到SDK中adb.exe文件所在目录,2.3以前的是在tools目录中,以后是在platform-tools目录中,从命令行中进入到该目录。如果配置了环境变量就不需要,直接启动命令行窗口执行adb shell,就会进入系统文件目录,然后执行df,就会看到一些信息,下面是G7(也可以用模拟器试试)的信息:

Filesystem           1K-blocks      Used Available Use% Mounted on

tmpfs                   207628        32    207596   0% /dev

tmpfs                   207628         0    207628   0% /mnt/asec

tmpfs                   207628         0    207628   0% /mnt/obb

/dev/block/mtdblock3    256000    145736    110264  57% /system

/dev/block/mtdblock5    151168    102396     48772  68% /data

/dev/block/mtdblock4     40960      1204     39756   3% /cache

/dev/block/vold/179:1

942848     49232    893616   5% /mnt/sdcard

/dev/block/vold/179:1

942848     49232    893616   5% /mnt/secure/asec

可以看出有一个分区是挂载到了/data目录下面,已经使用了48772K,还剩102396K,也就是512M的ROM最后系统只给用户分配151168K,不足150M,其余的被系统占用,其它的就不说了,不敢在linux大神面前班门弄斧。从上面的代码可以看出,系统给应用还有一定的缓存空间,最后还被计算到可用空间中去了。看过的同学可以用下面的代码测试一下,获取/data目录和/data/data目录下面的空间会不一样,有一点点小差别,貌似应该就是缓存空间吧。SD卡就不说了,从上面的信息也可以看出来,SD卡有1个G,挂载在/mnt/sdcard目录下面。

下面是个人整理的检查手机的存储空间的有关代码,仅供参考。

import java.io.File;

import android.os.Environment;

import android.os.StatFs;

/**

* 存储空间管理

* @author maylian7700@126.com

*

*/

public class MemorySpaceCheck

{

/**

* 计算剩余空间

* @param path

* @return

*/

private static long getAvailableSize(String path)

{

StatFs fileStats = new StatFs(path);

fileStats.restat(path);

return (long) fileStats.getAvailableBlocks() * fileStats.getBlockSize(); // 注意与fileStats.getFreeBlocks()的区别

}

/**

* 计算总空间

* @param path

* @return

*/

private static long getTotalSize(String path)

{

StatFs fileStats = new StatFs(path);

fileStats.restat(path);

return (long) fileStats.getBlockCount() * fileStats.getBlockSize();

}

/**

* 计算SD卡的剩余空间

* @return 剩余空间

*/

public static long getSDAvailableSize()

{

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

{

return getAvailableSize(Environment.getExternalStorageDirectory().toString());

}

return 0;

}

/**

* 计算系统的剩余空间

* @return 剩余空间

*/

public static long getSystemAvailableSize()

{

// context.getFilesDir().getAbsolutePath();

return getAvailableSize("/data");

}

/**

* 是否有足够的空间

* @param filePath 文件路径,不是目录的路径

* @return

*/

public static boolean hasEnoughMemory(String filePath)

{

File file = new File(filePath);

long length = file.length();

if (filePath.startsWith("/sdcard") || filePath.startsWith("/mnt/sdcard"))

{

return getSDAvailableSize() > length;

}

else

{

return getSystemAvailableSize() > length;

}

}

/**

* 获取SD卡的总空间

* @return

*/

public static long getSDTotalSize()

{

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

{

return getTotalSize(Environment.getExternalStorageDirectory().toString());

}

return 0;

}

/**

* 获取系统可读写的总空间

* @return

*/

public static long getSysTotalSize()

{

return getTotalSize("/data");

}

}

如果想要在系统的存储空间中写入数据,可以用context.getFilesDir().getAbsolutePath(),获取该应用的可写目录,也就是/data/data/应用主包名/files目录,可以往里面写入数据,在应用被卸载时,也一并被删除,不用担心会产生垃圾,灰常给力。如果不妥之处,欢迎批评指正!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值