您的位置:首页 > 移动开发 > Android开发

(原创)Android 通过反射获取真实的可用内存空间大小

2016-09-22 14:30 417 查看

前言

最近应公司需求,需要针对市场上具有虚假内存的辨别,获取到真实的可用内存空间,但是获取真实的内存空间需要获取到libcore.io.StructStatVfs这个Api,问题是:这个Api是隐藏并且是私有的,里面的函数无法通过直接来获取,对于这个需要使用到Android反射机制处理。不多说,看代码。

代码

// 判断是否有Sdcard
if (!Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) return ;
// 获取Sdcard下的可用空间
File path = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(path.getPath());
long blockSize = sf.getBlockSize();
long freeBlocks = sf.getAvailableBlocks();
Log.d(TAG, "<span style="font-family: Arial, Helvetica, sans-serif;">statF </span>size " + freeBlocks * blockSize);// 这种方式获取的值是会是虚假的内存
try {
Field mStatClass = StatFs.class.getDeclaredField("mStat");
mStatClass.setAccessible(true);// 设置可操作属性
Field f_bfree = mStatClass.get(sf).getClass().getDeclaredField("f_bfree");
Field f_bsize = mStatClass.get(sf).getClass().getDeclaredField("f_bsize");
// 通过反射获取的值才是真实可用内存
Log.d(TAG, "mStat size " + (f_bfree.getLong(mStatClass.get(sf)) * f_bsize.getLong(mStatClass.get(sf))));
} catch (Exception e) {
Log.d(TAG, "Exception " + e.toString());
e.printStackTrace();
}


总结

就那几段代码,也就不做描述,懂反射机制都可以看得明白。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息