(原创)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(); }
总结
就那几段代码,也就不做描述,懂反射机制都可以看得明白。相关文章推荐
- Android_获取手机上SD卡和内存中的可用空间的大小
- 通过查询Android系统setting源代码掌握如何获取SD卡大小和可用空间
- android设备的内存空间(RAM)总空间和可用空间大小的获取以及一些思考
- 获取手机系统大小、可用空间大小,设备可用内存及当前应用所占内存等
- Android获取内部和外部内存空间大小
- android获取手机内存空间大小
- android获取有效可用存储空间大小
- Android开发中获取SDcard、手机内存空间大小的源代码
- Android中获取ROM和SD卡剩余可用空间大小
- Android 存储到SD卡,获取SD的大小及可用空间
- 获取手机系统大小、可用空间大小,设备可用内存及当前应用所占内存等
- Android获取外部和内部存储空间总大小和可用大小
- androd i获取 SD卡 总容量 可用空间 内存大小 可用内存
- Android获取内部和外部内存空间大小
- Android获取外部和内部存储空间总大小和可用大小
- Android获取外部和内部存储空间总大小和可用大小
- Android获取内部和外部内存空间大小
- Android获取外部和内部存储空间总大小和可用大小
- Android获取外部和内部存储空间总大小和可用大小
- Android获取内部和外部内存空间大小