1. 程式人生 > >Android adb方式獲取手機總記憶體和可用記憶體資訊

Android adb方式獲取手機總記憶體和可用記憶體資訊

原始碼下載:

https://download.csdn.net/download/qq_31939617/10406578 下載

這篇文章主要介紹了Android系統檢測程式記憶體佔用各種方法,並對記憶體資訊的詳細介紹
通過讀取檔案”/proc/meminfo”的資訊能夠獲取手機Memory的總量,而通過ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo)方法可以獲取當前的可用Memory量。
“/proc/meminfo”檔案記錄了android手機的一些記憶體資訊,在命令列窗口裡輸入”adb shell”,進入shell環境,輸入”cat /proc/meminfo”即可在命令列裡顯示meminfo檔案的內容

具體如下所示。

C:\Users\Figo>adb shell
# cat /proc/meminfo
cat /proc/meminfo
MemTotal: 94096 kB           所有可用RAM大小。
MemFree: 1684 kB           LowFree與HighFree的總和,被系統留著未使用的記憶體。
Buffers: 16 kB           用來給檔案做緩衝大小
Cached: 27160 kB   被高速緩衝儲存器(cache memory)用的記憶體的大小(等於diskcache minus SwapCache)。


SwapCached: 0 kB           被高速緩衝儲存器(cache memory)用的交換空間的大小。已經被交換出來的記憶體,仍然被存放在swapfile中,用來在需要的時候很快的被替換而不需要再次開啟I/O埠。
Active: 35392 kB          在活躍使用中的緩衝或高速緩衝儲存器頁面檔案的大小,除非非常必要,否則不會被移作他用。
Inactive: 44180 kB           在不經常使用中的緩衝或高速緩衝儲存器頁面檔案的大小,可能被用於其他途徑。

Active(anon): 26540 kB          
Inactive(anon): 28244 kB          
Active(file): 8852 kB          
Inactive(file): 15936 kB          
Unevictable: 280 kB          
Mlocked: 0 kB          
SwapTotal: 0 kB           交換空間的總大小。
SwapFree: 0 kB           未被使用交換空間的大小。
Dirty: 0 kB          等待被寫回到磁碟的記憶體大小。
Writeback: 0 kB          正在被寫回到磁碟的記憶體大小。
AnonPages: 52688 kB          未對映頁的記憶體大小。
Mapped: 17960 kB          裝置和檔案等對映的大小。
Slab: 3816 kB          核心資料結構快取的大小,可以減少申請和釋放記憶體帶來的消耗。
SReclaimable: 936 kB          可收回Slab的大小。
SUnreclaim: 2880 kB          不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
PageTables: 5260 kB          管理記憶體分頁頁面的索引表的大小。
NFS_Unstable: 0 kB          不穩定頁表的大小。
Bounce: 0 kB         
WritebackTmp: 0 kB         
CommitLimit: 47048 kB         
Committed_AS: 1483784 kB         
VmallocTotal: 876544 kB         
VmallocUsed: 15456 kB         
VmallocChunk: 829444 kB         

要獲取android手機總記憶體大小,只需讀取”/proc/meminfo”檔案的第1行,並進行簡單的字串處理即可。

下面直接給出詳細步驟,大家可以根據實際情況進行相應擴充套件。

這裡寫圖片描述
MainActivity.class

package com.example.sz.readsystemmemory;

import android.app.ActivityManager;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;

import android.app.ActivityManager.MemoryInfo;
import android.text.format.Formatter;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    TextView tv1 = null;
    TextView tv2 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv1 = findViewById(R.id.system_memory1);
        tv2 = findViewById(R.id.system_memory2);
        //第一種方式:
        tv1.setText("第一種方式:手機總記憶體: " + this.getTotalMemory() + ", " + "可用記憶體: "
                + this.getAvailMemory());

        //第二種方法:手用java的反射機制來獲取手機的記憶體的一些資訊。
        show();
}


    private String getAvailMemory() {// 獲取android當前可用記憶體大小

        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo mi = new MemoryInfo();
        am.getMemoryInfo(mi);
        //mi.availMem; 當前系統的可用記憶體

        return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 將獲取的記憶體大小規格化
    }

    private String getTotalMemory() {
        String str1 = "/proc/meminfo";// 系統記憶體資訊檔案
        String str2;
        String[] arrayOfString;
        long initial_memory = 0;

        try {
            FileReader localFileReader = new FileReader(str1);
            BufferedReader localBufferedReader = new BufferedReader(
                    localFileReader, 8192);
            str2 = localBufferedReader.readLine();// 讀取meminfo第一行,系統總記憶體大小

            arrayOfString = str2.split("\\s+");
            for (String num : arrayOfString) {
                Log.i(str2, num + "\t");
            }

            initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 獲得系統總記憶體,單位是KB,乘以1024轉換為Byte
            localBufferedReader.close();

        } catch (IOException e) {
        }
        return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte轉換為KB或者MB,記憶體大小規格化
    }


    public void show(){
        Method _readProclines = null;
        try {
            Class procClass;
            procClass = Class.forName("android.os.Process");
            Class parameterTypes[]= new Class[] {String.class, String[].class, long[].class };
            _readProclines = procClass.getMethod("readProcLines", parameterTypes);
            Object arglist[] = new Object[3];
            final String[] mMemInfoFields = new String[] {"MemTotal:",
                    "MemFree:", "Buffers:", "Cached:"};
            long[] mMemInfoSizes = new long[mMemInfoFields.length];
            mMemInfoSizes[0] = 30;
            mMemInfoSizes[1] = -30;
            arglist[0] = new String("/proc/meminfo");
            arglist[1] = mMemInfoFields;
            arglist[2] = mMemInfoSizes;
            if(_readProclines!=null){
                _readProclines.invoke(null, arglist);
                for (int i=0; i<mMemInfoSizes.length; i++) {
                    Log.d("GetFreeMem", mMemInfoFields[i]+" : "+mMemInfoSizes[i]/1024);
                    tv2.setText("第二種方式:手機總記憶體: " + this.getTotalMemory() + ", " + "可用記憶體: "
                            + this.getAvailMemory());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/system_memory1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textStyle="bold" />

    <TextView
        android:layout_marginTop="50dp"
        android:id="@+id/system_memory2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textStyle="bold" />
</LinearLayout>

原始碼下載:

https://download.csdn.net/download/qq_31939617/10406578 下載

相關推薦

Android adb方式獲取手機記憶體可用記憶體資訊

原始碼下載: https://download.csdn.net/download/qq_31939617/10406578 下載 這篇文章主要介紹了Android系統檢測程式記憶體佔用各種方法,並對記憶體資訊的詳細介紹 通過讀取檔案”/proc/mem

獲取Android手機記憶體可用記憶體最佳方案

Android手機的記憶體大小資訊存放在手機系統的/proc/meminfo檔案中,可以通過讀取這個檔案來獲取記憶體資訊。 adb shell檢視 通過adb shell命令,進入終端 adb shell 執行cat /proc/meminfo,檢視記憶體資

獲取Android手機記憶體可用記憶體

   在android開發中,有時候我們想獲取手機的一些硬體資訊,比如android手機的總記憶體和可用記憶體大小。這個該如何實現呢?通過讀取檔案"/proc/meminfo"的資訊能夠獲取手機Memory的總量,而通過ActivityManager.getMemoryInfo(ActivityManage

獲取手機應用列表APP應用資訊

各種獲取應用資訊小功能,做個筆記: /** * 獲取版本名 * * @param context * @return 獲取版本名 */ public static String getVersionName(Context

Android之如何獲取手機程式列表以及程式相關資訊並啟動指定程式

效果圖: 程式列表: 啟動程式,獲取程式資訊: 程式碼如下: 建立一個AppInfo類來表示應用程式 <pre name="code" class="java">public class AppInfo { public

c#中利用WMI物件獲取實體記憶體可用記憶體大小資訊

通常我們在獲取記憶體資訊時會呼叫Win32 API的GlobalMemoryStatus和GlobalMemoryStatusEx函式,但是,當您的電腦上裝有2根或2根以上的記憶體條時,這兩個API只能獲取1根記憶體條的使用資訊,並不能正確獲取記憶體資訊。 經過一番折騰

android裝置的記憶體空間(RAM)空間可用空間大小的獲取以及一些思考

在專案中我們會遇到這樣的需求,那就是獲取android裝置可用記憶體(ram)空間的大小和總空間的大小.關於這個問題我們分為兩個部分探討. 一,通常情況下我們使用系統提供的api獲取可用記憶體空間和總記憶體空間的方法. 程式碼如下: private void getMem

Android獲取SD卡及內部儲存空間大小可用大小

android.os下的StatFs類主要用來獲取檔案系統的狀態,能夠獲取sd卡的大小和剩餘空間,獲取系統內部空間也就是/system的大小和剩餘空間等等。 看下讀取sd卡的: void readSDCard() { String

如何獲取裝置的容量可用容量 網路運營商 3g/wifi判斷 手機型號

鑌哥最近開發需獲取手機容量,其實這你是一個很好的例子 //硬碟容量 - (float)getTotalDiskSpace {     float totalSpace;     NSError * error; NSDictionary * infoDic =

Android獲取外部內部儲存空間大小可用大小

android.os下的StatFs類主要用來獲取檔案系統的狀態,能夠獲取sd卡的大小和剩餘空間,獲取系統內部空間也就是/system的大小和剩餘空間等等。       看下讀取sd卡的: Java程式碼   void readSDCard() {       

Android開發之獲取手機硬體狀態資訊(CPU資訊/頻率/使用率、DDR頻率/使用率、電池瞬時電流/電壓/庫倫counter)

有時候我們想要知道當前手機的一些狀態資訊,可以使用app(root 或者系統簽名 )來顯示獲取。 OK,接下來看一下一些關鍵的程式碼。 我這裡使用的是高通的手機,不同硬體平臺的機型,其獲取資訊的節點可能不一樣。 /** * 獲取當前瞬時電流

Android獲取手機中已安裝apk檔案資訊(PackageInfo、ResolveInfo)(應用圖片、應用名、包名等)

眾所周知,通過PackageManager可以獲取手機端已安裝的apk檔案的資訊,具體程式碼如下 PackageManager packageManager = this.getPackageManager();  List<PackageInfo> pac

獲取手機的機型運營商

對於特殊機型的問題,經常會遇到對當前的APP所在手機做運營商(華為,三星,小米,魅族等)和機型的判斷,主要是通過如下兩個系統的方法判斷。更多資訊也是通過類似的方式獲取,此處只是給個思路,網上的參考很多,但是有些解釋容易誤解。 下面的兩個函式分別是用來獲取當前手

獲取手機mac地址串號IMEI

IMEI 是國際移動裝置身份碼的縮寫,國際移動裝備辨識碼,是由15位數字組成的"電子串號",它與每臺手機一一對應,而且該碼是全世界唯一的。每一隻手機在組裝完成後都將被賦予一個全球唯一的一組號碼,這個號碼從生產到交付使用都將被製造生產的廠商所記錄。 OK。

android adb shell 模擬廣播發送鍵值事件

1.模擬傳送廣播adb shell am broadcast -a 定義的廣播action string2.模擬上下左右 確定鍵值adb shell input keyevent  "value"va

Android基礎:獲取手機聯絡人工具類

Bean: public class ContactInfo { public String id; public String name; public String phone; } Co

關於Android的Native記憶體Dalvik記憶體

1.   Dalvik記憶體 每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機器例項,其程式碼在虛擬機器的解釋下得以執行。 很多人認為Dalvik虛擬機器是一個Java虛擬機器,因為Android的程式語言恰恰就是Java語言。但是這種說法並不

Unity獲取手機電量 網路時間

廢話不多說 直接上指令碼 using UnityEngine; using System.Collections; using System; using UnityEngine.UI; public class BatteryAndTime : MonoBehaviou

android 如何去獲取手機Gps的訊號強度

1,看到別人寫的app裡面有展示Gps訊號強度的功能,我們的app也需要這個功能,我是先百度了一圈(沒有發現要找到的內同,百度果然有些東西搜尋不到),還是翻牆去的谷歌看到了,你也可以先去應用市場裡面下載幾個Gps相關的軟體,比如:Gps工具箱, GpsStatus.List

android:webview獲取網頁登陸賬號密碼

使用webview獲取html頁面資訊 需求:抓取webview開啟的頁面中登陸資訊,簡單點說就是獲取第三方的賬號和密碼。(咋一想,這尼瑪有點坑啊,獲取別人的資訊,怎麼都不太好吧。但是也得實現呀。。。) 本文將以抓取百度賬號資訊為例。(這尼瑪也是一個坑。。。