(原創)Android 通過反射獲取真實的可用記憶體空間大小
阿新 • • 發佈:2019-01-25
前言
最近應公司需求,需要針對市場上具有虛假記憶體的辨別,獲取到真實的可用記憶體空間,但是獲取真實的記憶體空間需要獲取到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(); }