1. 程式人生 > >(原創)Android 通過反射獲取真實的可用記憶體空間大小

(原創)Android 通過反射獲取真實的可用記憶體空間大小

前言

最近應公司需求,需要針對市場上具有虛假記憶體的辨別,獲取到真實的可用記憶體空間,但是獲取真實的記憶體空間需要獲取到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();
        }

總結

就那幾段程式碼,也就不做描述,懂反射機制都可以看得明白。