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());
- <pre name="code" class="java">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<N; i++) {
- ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);
- appStorage += ae.codeSize + ae.dataSize;
- }
- freeStorage += mApplicationsState.sumCacheSizes();<pre name="code" class="java"><pre>
- 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
- }
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目录下面。
下面是个人整理的检查手机的存储空间的有关代码,仅供参考。
- <pre name="code" class="java"><pre name="code" class="java">
- 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");
- }
- }
评论暂时关闭