android检查存储空间小结
来源:互联网 发布:ransac算法原理 编辑:程序博客网 时间:2024/04/29 02:36
这几天事情比较少,于是对前面用到的一些东西时行了总结。
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<N; i++) { ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i); appStorage += ae.codeSize + ae.dataSize; } freeStorage += mApplicationsState.sumCacheSizes();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目录,可以往里面写入数据,在应用被卸载时,也一并被删除,不用担心会产生垃圾,灰常给力。如果不妥之处,欢迎批评指正!
- android检查存储空间小结
- android检查存储空间小结
- android存储空间
- 如何检查Linux存储空间不足情况
- Android存储空间——外部存储空间和内部存储空间
- android存储空间的检测
- Android存储空间不足
- android 获取存储空间信息
- Android 获取手机存储空间
- android 获取存储空间大小
- android获取存储空间
- android存储空间的分类
- Android存储空间讲解
- 【Tricks】 Android 存储空间相关
- 修改Android模拟器的存储空间
- 修改Android模拟器的存储空间
- Android使用笔记--存储空间管理
- Android获取SD卡存储空间
- 1Java程序通过JNI调用本地C++_第一个示例_HelloWorld
- Disable Back Button in Browser using JavaScript
- Jtable表头换行显示
- 使用UrlRewrite实现URL伪静态化
- 程序员懒人网站
- android检查存储空间小结
- Android camera preview callback 的使用
- 在struts的action创建out对象
- vc中实现控件的隐藏与显示
- CSDN博文精选:最受欢迎的系列专栏博客推荐
- ecTable 导出Excle 科学计数法问题
- 有效控制Android应用程序的耗电量
- Linux的TOP系统实时监控命令
- 海量、多页数据导出到Excel(C#版本)