zoukankan      html  css  js  c++  java
  • 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("
    ");
            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("
    ");
            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 + "
    ");
                    }
                    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.";
        }
  • 相关阅读:
    iOS开发-文件管理(一)
    浅析栈区和堆区内存分配的区别
    浅谈Block传值-匿名函数(代码块)
    cell的各种使用和赋值 总结
    类方法和对象方法的区别
    属性传值 ,代理传值,单例
    类目,延展,协议
    任意点 并查集
    Codeforces 145E. Lucky Queries 线段树
    Codeforces 103B. Cthulhu 并查集运用
  • 原文地址:https://www.cnblogs.com/larack/p/4498102.html
Copyright © 2011-2022 走看看