Android 系统信息的获取

Android 系统信息的获取

一、内存(ram):

1android 的内存大小信息存放在系统的 /proc/meminfo 文件里面,通过adb shell 进入 手机目录后,使用 cat /proc/meminfo 可以显示这些信息:

root@m7:/ # cat /proc/meminfo                                                  
MemTotal:        1863064 kB
MemFree:          109396 kB
Buffers:           30892 kB
Cached:           835468 kB
SwapCached:            0 kB
Active:           855868 kB
Inactive:         593304 kB
Active(anon):     424552 kB
Inactive(anon):   162992 kB
Active(file):     431316 kB
Inactive(file):   430312 kB
Unevictable:        2268 kB
Mlocked:               0 kB
HighTotal:       1458172 kB
HighFree:          35356 kB
LowTotal:         404892 kB
LowFree:           74040 kB
SwapTotal:        419428 kB
SwapFree:         412148 kB
Dirty:                60 kB
Writeback:             0 kB
AnonPages:        585116 kB
Mapped:           272388 kB
Shmem:              2460 kB
Slab:              52480 kB
SReclaimable:      23556 kB
SUnreclaim:        28924 kB
KernelStack:       14736 kB
PageTables:        35532 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1350960 kB
Committed_AS:   82837660 kB
VmallocTotal:     409600 kB
VmallocUsed:      181572 kB
VmallocIoRemap:   172600 kB
VmallocAlloc:       8376 kB
VmallocMap:            0 kB
VmallocUserMap:        0 kB
VmallocVpage:       4888 kB
VmallocChunk:      69636 kB
KGSL_ALLOC:        34340 kB
ION_ALLOC:        105376 kB
Kmalloc:            8112 kB
DMA ALLOC:           352 kB
CachedUnmapped:   578420 kB
KgslUnmapped:      19528 kB
Ftrace:            32768 kB

2在代码中可以通过读取 /proc/meminfo 文件来获取相应的信息:

    public void getTotalRamMemory() {
        String str1 = "/proc/meminfo";
        String str2 = "";
        try {
            FileReader fr = new FileReader(str1);
            BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
            while ((str2 = localBufferedReader.readLine()) != null) {
                Log.i(TAG, "---" + str2);
            }
        } catch (IOException e) {
        }
    }

3也可以通过 ActivityManager.MemoryInfo 来获取相应的信息:

    public long getAvailRamMemory(Context context) {
        ActivityManager am = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(mi);
        return mi.availMem;
    } 

二、机身容量(Rom大小)

1、android 机身容量,通过adb shell 进入 手机目录后,使用 df 命令可以显示手机挂载分区详细信息:

root@m7:/ # df 
Filesystem               Size     Used     Free   Blksize
/dev                   909.7M    68.0K   909.6M   4096
/sys/fs/cgroup         909.7M    12.0K   909.7M   4096
/mnt/asec              909.7M     0.0K   909.7M   4096
/mnt/obb               909.7M     0.0K   909.7M   4096
/system               1763.8M  1589.9M   174.0M   4096
/data                 26206.2M  3082.8M  23123.4M   4096
/cache                 629.9M    10.5M   619.4M   4096
/devlog                 19.7M    15.8M     3.9M   4096
/carrier                24.6M     4.0M    20.6M   4096
/firmware/mdm           86.0M    69.1M    16.8M   16384
/data/qcks              20.0M     9.0M    11.0M   4096
/data/efs               20.0M     0.0K    20.0M   4096
/firmware/q6           199.8M     6.4M   193.3M   4096
/data/secure/data      909.7M     0.0K   909.7M   4096
/mnt/shell/emulated   26106.2M  3082.8M  23023.4M   4096
/sqlite_stmt_journals   512.0K     0.0K   512.0K   4096

2、在代码中可以通过 df  命令来显示机身容量,这个方法也适用与获取sdCard的大小

    /**
     * get "/data" block available size.
     * 
     * @return available size(kB).
     */
    public static long getDataAvailable() {
        // exec cmd "df" & get column as: Filesystem Size Used Free Blksize;
        // the 3th column of /data is dataFreeSize.
        String dataFreeSizeDetailInfo = getDeviceSystemInfo("df", "/data ", 3)
                .trim();
        // remove the last char of the dataFreeSizeDetailInfo
        String dataFreeSizeShotInfo = dataFreeSizeDetailInfo.substring(0,
                dataFreeSizeDetailInfo.length() - 1);
        float dataFreeSize = Float.parseFloat(dataFreeSizeShotInfo);
        float dataFreeKB = dataFreeSize;
        if (dataFreeSizeDetailInfo.endsWith("G")// GB to kB
                || dataFreeSizeDetailInfo.endsWith("g")) {
            dataFreeKB = dataFreeSize * (1024 * 1024);
        } else if (dataFreeSizeDetailInfo.endsWith("M")// MB to kB
                || dataFreeSizeDetailInfo.endsWith("m")) {
            dataFreeKB = dataFreeSize * 1024;
        } else {// kB to kB
        }
        return (long) dataFreeKB;
    }

    /**
     * get device system info by executing shell command.
     * 
     * @param cmd
     *            command to execute by using device shell.
     * @param target
     *            target line or some special line that contain the target
     *            string ,such as "/data"
     * @param column
     *            ={0,1,2,3,...}
     * @return
     */
    public static String getDeviceSystemInfo(String cmd, String target,
            int column) {
        String result = "";
        result = RootCmd.execShellCmd(cmd);
        String[] strs = result.split("\n");
        String info = "-1";
        for (String str : strs) {
            if (str.startsWith(target) && str.contains(target)) {

                Pattern p = Pattern.compile("\\s+");
                Matcher m = p.matcher(str);
                str = m.replaceAll(" ");

                String[] subStr = str.split(" ");
                if (subStr.length < column) {
                    return null;
                }
                String columnInfo = subStr[column];
                info = columnInfo;
            }
        }
        return info;
    }

 3、也可以通过 StatFs 来获取机身容量:

    /**
     * 
     * 获得机身内存大小
     * 
     * @return
     */
    public long getRomTotalSize() {
        File path = Environment.getDataDirectory();
        StatFs statFs = new StatFs(path.getPath());
        long blockSize = statFs.getBlockSizeLong();
        long tatalBlocks = statFs.getBlockCountLong();
        return blockSize * tatalBlocks;
    }

    /**
     * 获得机身可用内存
     * 
     * @return
     */
    private long getRomAvailableSize() {
        File path = Environment.getDataDirectory();
        StatFs statFs = new StatFs(path.getPath());
        long blockSize = statFs.getBlockSizeLong();
        long availableBlocks = statFs.getAvailableBlocksLong();
        return blockSize * availableBlocks;
    }

三、sdCard大小

    /**
     * 
     * 获得sd卡总共容量
     * 
     * @return
     */
    public long getSDTotalSize() {
        /* 获取存储卡路径 */
        File sdcardDir = Environment.getExternalStorageDirectory();
        /* StatFs 看文件体系空间应用景象 */
        StatFs statFs = new StatFs(sdcardDir.getPath());
        long blockSize = statFs.getBlockSizeLong();
        long totalSize = statFs.getBlockCountLong();
        return blockSize * totalSize;
    }

    /**
     * 
     * 获得sd卡残剩容量,即可以大小
     * 
     * @return
     */
    public long getSdAvaliableSize() {
        File path = Environment.getExternalStorageDirectory();
        StatFs statFs = new StatFs(path.getPath());
        long blockSize = statFs.getBlockSizeLong();
        long availableBlocks = statFs.getAvailableBlocksLong();
        return blockSize * availableBlocks;
    }

四、取得的rom容量和sdcard容量时,常常需要将数据格式化,转换成KB,MB,GB,下面是一个格式化数据的方法: 保留两位小数。

    /**
     * convert size to KB or MB or GB
     * 
     * @param size
     * @return
     */
    protected String formatSize(long originSize) {
        String suffix = null;
        float fSize = 0;

        if (originSize >= 1024) {
            suffix = "KB";
            fSize = originSize / 1024;
            if (fSize >= 1024) {
                suffix = "MB";
                fSize /= 1024;
            }
            if (fSize >= 1024) {
                suffix = "GB";
                fSize /= 1024;
            }
        } else {
            fSize = originSize;
        }
        java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
        StringBuilder resultBuffer = new StringBuilder(df.format(fSize));
        if (suffix != null)
            resultBuffer.append(suffix);
        return resultBuffer.toString();
    }

五、CPU信息

1、通过adb shell 进入 手机目录后,使用 cat /proc/cpuinfo 可以显示 CPU 详细信息,/proc/cpuinfo文件中第一行是CPU的型号,第二行是CPU的频率

root@m7:/ # cat /proc/cpuinfo
Processor    : ARMv7 Processor rev 0 (v7l)
processor    : 0
BogoMIPS    : 13.52

processor    : 1
BogoMIPS    : 13.52

processor    : 2
BogoMIPS    : 13.52

processor    : 3
BogoMIPS    : 13.52

Features    : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 
CPU implementer    : 0x51
CPU architecture: 7
CPU variant    : 0x1
CPU part    : 0x06f
CPU revision    : 0

Hardware    : UNKNOWN
Revision    : 0002
Serial        : 0000000000000000

2、在代码中可以通过读取 /proc/cpuinfo 文件来获取CPU相应的信息:

    /**
     * get CPU info
     * 
     * @return
     */
    private String getCPUInfo() {
        StringBuffer sb = new StringBuffer();
        sb.append("abi: ").append(Build.CPU_ABI).append("\n");
        if (new File("/proc/cpuinfo").exists()) {
            try {
                BufferedReader br = new BufferedReader(new FileReader(new File(
                        "/proc/cpuinfo")));
                String aLine;
                while ((aLine = br.readLine()) != null) {
                    sb.append(aLine + "\n");
                }
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

六、系统的版本信息:

    /**
     * get system version
     * 
     * @return
     */
    public String[] getVersion() {
        String[] version = { "null", "null", "null", "null" };
        String str1 = "/proc/version";
        String str2;
        String[] arrayOfString;
        try {
            FileReader localFileReader = new FileReader(str1);
            BufferedReader localBufferedReader = new BufferedReader(
                    localFileReader, 8192);
            str2 = localBufferedReader.readLine();
            arrayOfString = str2.split("\\s+");
            version[0] = arrayOfString[2];// KernelVersion
            localBufferedReader.close();
        } catch (IOException e) {
        }
        version[1] = Build.VERSION.RELEASE;// firmware version
        version[2] = Build.MODEL;// model
        version[3] = Build.DISPLAY;// system version
        return version;
    }

七、MAC地址:

    /**
     * 
     * @return
     */
    public String getMacInfo(Context context) {
        String macInfo;
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        if (wifiInfo.getMacAddress() != null) {
            macInfo = wifiInfo.getMacAddress();
        } else {
            macInfo = "Fail";
        }
        return macInfo;
    }

八、电池电量:

    /**
     * register battery broadcast receiver
     * 
     * @param context
     */
    public void registerBatteryReceiver(Context context) {
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        context.registerReceiver(batteryReceiver, filter, null, null);
    }

    /**
     * unregister battery broadcast receiver
     * 
     * @param context
     */
    public void unregisterBatteryReceiver(Context context) {
        context.unregisterReceiver(batteryReceiver);
    }

    private BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int level = intent.getIntExtra("level", 0);
            // level加%就是当前电量了
            System.out.print("Current battery level:" + level);
        }
    };

九、开机时间:

    /**
     * 
     * @return
     */
    private String getStartTimes(Context context) {
        long ut = SystemClock.elapsedRealtime() / 1000;
        if (ut == 0) {
            ut = 1;
        }
        int m = (int) ((ut / 60) % 60);
        int h = (int) ((ut / 3600));
        return h + " hours," + m + " minutes.";
    }

 

posted @ 2015-05-12 17:56  狐狸已化妖  阅读(825)  评论(0编辑  收藏  举报