1.获取ram大小

两种方法:

第一从是从MemoryInfo中获取:

private void getRamInfo1(){ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();manager.getMemoryInfo(info);long memory = info.availMem;long totalMemory = info.totalMem;Log.d(TAG, "memory: "+memory+" totalMemory "+totalMemory);
}

第二是从节点中获取:

可以用adb看一下节点中的信息

 MemTotal:        1638688 kBMemFree:          544920 kBMemAvailable:    1111296 kBBuffers:           16996 kBCached:           588952 kBSwapCached:            0 kBActive:           426960 kBInactive:         457584 kBActive(anon):     281376 kBInactive(anon):      960 kBActive(file):     145584 kBInactive(file):   456624 kBUnevictable:        2436 kBMlocked:            2436 kBHighTotal:       1188988 kBHighFree:         255772 kBLowTotal:         449700 kBLowFree:          289148 kBSwapTotal:             0 kBSwapFree:              0 kBDirty:                28 kBWriteback:             0 kBAnonPages:        281048 kBMapped:           316056 kBShmem:              1860 kBSlab:              74244 kBSReclaimable:      21556 kBSUnreclaim:        52688 kBKernelStack:        8744 kBPageTables:        20236 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:      819344 kBCommitted_AS:   15876760 kBVmallocTotal:     499712 kBVmallocUsed:           0 kBVmallocChunk:          0 kBCmaTotal:              0 kBCmaFree:               0 kB

先把所有的信息都保存到一个list里面

 public List<String> getRamInfo2() {StringBuffer sb = new StringBuffer();List<String> arr = null;try {BufferedReader burf = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/meminfo")));String strInfo = "";arr = new ArrayList<>();while((strInfo = burf.readLine()) != null){Log.d(TAG, "getRamInfo3: "+strInfo);arr.add(strInfo);}burf.close();} catch (Exception e) {e.printStackTrace();}return arr;}

再将里面的数值提取出来,把0-9的数字提取出来

 private String getNumInfo(String strInfo){StringBuffer sb = new StringBuffer();char[] chInfo = strInfo.toCharArray();int size = chInfo.length;for(int i = 0; i < size; i++){if(chInfo[i] <= '9' && chInfo[i] >= '0'){sb.append(chInfo[i]);}}return sb.toString();}

这两种方式获取到的数值是一样的,但是对比设置,发现可用内存不一样,有很大的差距

用dumpsys meminfo查看一下

Total PSS by category:148,769K: .so mmap93,651K: Native71,767K: .apk mmap55,802K: .dex mmap49,099K: Dalvik41,268K: Unknown29,717K: .art mmap29,555K: GL mtrack27,527K: Other mmap20,344K: .oat mmap17,288K: .jar mmap13,091K: Dalvik Other12,095K: .ttf mmap3,264K: Stack1,894K: Other dev1,712K: EGL mtrack436K: Ashmem0K: Cursor0K: Gfx dev0K: Other mtrackTotal RAM: 1,638,688K (status moderate)Free RAM:   924,257K (   56,621K cached pss +   462,048K cached kernel +   405,588K free)Used RAM:   789,278K (  560,658K used pss +   228,620K kernel)Lost RAM:   -74,847KTuning: 128 (large 256), oom   184,320K, restore limit    61,440K (high-end-gfx)

发现将(Free RAM)-(Lost RAM)就是系统设置中显示的了。设置中看一下这些值的获取,在ProcessStatsSummary.java

@Override
public void refreshUi() {Context context = getContext();MemInfo memInfo = mStatsManager.getMemInfo();double usedRam = memInfo.realUsedRam;double totalRam = memInfo.realTotalRam;double freeRam = memInfo.realFreeRam;BytesResult usedResult = Formatter.formatBytes(context.getResources(), (long) usedRam,Formatter.FLAG_SHORTER);String totalString = Formatter.formatShortFileSize(context, (long) totalRam);String freeString = Formatter.formatShortFileSize(context, (long) freeRam);CharSequence memString;CharSequence[] memStatesStr = getResources().getTextArray(R.array.ram_states);int memState = mStatsManager.getMemState();if (memState >= 0 && memState < memStatesStr.length - 1) {memString = memStatesStr[memState];} else {memString = memStatesStr[memStatesStr.length - 1];}mSummaryPref.setAmount(usedResult.value);mSummaryPref.setUnits(usedResult.units);float usedRatio = (float)(usedRam / (freeRam + usedRam));mSummaryPref.setRatios(usedRatio, 0, 1 - usedRatio);mPerformance.setSummary(memString);mTotalMemory.setSummary(totalString);mAverageUsed.setSummary(Utils.formatPercentage((long) usedRam, (long) totalRam));mFree.setSummary(freeString);Log.d("refreshUi"," refreshUi "+freeString+" totalString "+totalString);String durationString = getString(sDurationLabels[mDurationIndex]);int numApps = mStatsManager.getEntries().size();mAppListPreference.setSummary(getResources().getQuantityString(R.plurals.memory_usage_apps_summary, numApps, numApps, durationString));
}

所有的信息都是从MemInfo中取得,接着来看 mStatsManager的初始化

@Override
public void onCreate(Bundle icicle) {super.onCreate(icicle);Bundle args = getArguments();mStatsManager = new ProcStatsData(getActivity(), icicle != null|| (args != null && args.getBoolean(ARG_TRANSFER_STATS, false)));mDurationIndex = icicle != null? icicle.getInt(ARG_DURATION_INDEX): args != null ? args.getInt(ARG_DURATION_INDEX) : 0;mStatsManager.setDuration(icicle != null? icicle.getLong(DURATION, sDurations[0]) : sDurations[0]);
}

在ProcStatsData.java中

public void refreshStats(boolean forceLoad) {if (mStats == null || forceLoad) {load();}pkgEntries = new ArrayList<>();long now = SystemClock.uptimeMillis();memTotalTime = DumpUtils.dumpSingleTime(null, null, mStats.mMemFactorDurations,mStats.mMemFactor, mStats.mStartTime, now);ProcessStats.TotalMemoryUseCollection totalMem = new ProcessStats.TotalMemoryUseCollection(ProcessStats.ALL_SCREEN_ADJ, mMemStates);mStats.computeTotalMemoryUse(totalMem, now);for (int i = 0; i < mMemStates.length; i++) {Log.d(TAG, "refreshStats: "+mMemStates[i]);}//这里的totalMem时最关键的mMemInfo = new MemInfo(mContext, totalMem, memTotalTime);ProcessDataCollection bgTotals = new ProcessDataCollection(ProcessStats.ALL_SCREEN_ADJ, mMemStates, mStates);ProcessDataCollection runTotals = new ProcessDataCollection(ProcessStats.ALL_SCREEN_ADJ, mMemStates, ProcessStats.NON_CACHED_PROC_STATES);createPkgMap(getProcs(bgTotals, runTotals), bgTotals, runTotals);if (totalMem.sysMemZRamWeight > 0 && !totalMem.hasSwappedOutPss) {distributeZRam(totalMem.sysMemZRamWeight);}ProcStatsPackageEntry osPkg = createOsEntry(bgTotals, runTotals, totalMem,mMemInfo.baseCacheRam);pkgEntries.add(osPkg);
}

接着看代码,在ProcessStats.java中computeTotalMemoryUse方法

//计算内存使用量
public void computeTotalMemoryUse(TotalMemoryUseCollection data, long now) {data.totalTime = 0;for (int i=0; i<STATE_COUNT; i++) {data.processStateWeight[i] = 0;data.processStatePss[i] = 0;data.processStateTime[i] = 0;data.processStateSamples[i] = 0;}for (int i=0; i<SYS_MEM_USAGE_COUNT; i++) {data.sysMemUsage[i] = 0;}data.sysMemCachedWeight = 0;data.sysMemFreeWeight = 0;data.sysMemZRamWeight = 0;data.sysMemKernelWeight = 0;data.sysMemNativeWeight = 0;data.sysMemSamples = 0;//这句最为关键final long[] totalMemUsage = mSysMemUsage.getTotalMemUsage();for (int is=0; is<data.screenStates.length; is++) {for (int im=0; im<data.memStates.length; im++) {int memBucket = data.screenStates[is] + data.memStates[im];int stateBucket = memBucket * STATE_COUNT;long memTime = mMemFactorDurations[memBucket];if (mMemFactor == memBucket) {memTime += now - mStartTime;}data.totalTime += memTime;final int sysKey = mSysMemUsage.getKey((byte)stateBucket);long[] longs = totalMemUsage;int idx = 0;if (sysKey != SparseMappingTable.INVALID_KEY) {final long[] tmpLongs = mSysMemUsage.getArrayForKey(sysKey);final int tmpIndex = SparseMappingTable.getIndexFromKey(sysKey);if (tmpLongs[tmpIndex+SYS_MEM_USAGE_SAMPLE_COUNT] >= 3) {SysMemUsageTable.mergeSysMemUsage(data.sysMemUsage, 0, longs, idx);longs = tmpLongs;idx = tmpIndex;}}data.sysMemCachedWeight += longs[idx+SYS_MEM_USAGE_CACHED_AVERAGE]* (double)memTime;data.sysMemFreeWeight += longs[idx+SYS_MEM_USAGE_FREE_AVERAGE]* (double)memTime;data.sysMemZRamWeight += longs[idx + SYS_MEM_USAGE_ZRAM_AVERAGE]* (double) memTime;data.sysMemKernelWeight += longs[idx+SYS_MEM_USAGE_KERNEL_AVERAGE]* (double)memTime;data.sysMemNativeWeight += longs[idx+SYS_MEM_USAGE_NATIVE_AVERAGE]* (double)memTime;data.sysMemSamples += longs[idx+SYS_MEM_USAGE_SAMPLE_COUNT];}}data.hasSwappedOutPss = mHasSwappedOutPss;ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();for (int iproc=0; iproc<procMap.size(); iproc++) {SparseArray<ProcessState> uids = procMap.valueAt(iproc);for (int iu=0; iu<uids.size(); iu++) {final ProcessState proc = uids.valueAt(iu);proc.aggregatePss(data, now);}}}

接着看getTotalMemUsage方法

public long[] getTotalMemUsage() {long[] total = new long[SYS_MEM_USAGE_COUNT];final int N = getKeyCount();for (int i=0; i<N; i++) {final int key = getKeyAt(i);//这个addData就是添加进去的数据final long[] addData = getArrayForKey(key);final int addOff = SparseMappingTable.getIndexFromKey(key);SysMemUsageTable.mergeSysMemUsage(total, 0, addData, addOff);}return total;
}

接着是getArrayForKey方法

/*** Return the raw storage long[] for the given key.*/
public long[] getArrayForKey(int key) {assertConsistency();//从mLong中获取数据return mParent.mLongs.get(getArrayFromKey(key));
}

mLongs的值时如何add进去的?从Parcel中读取出来的

/*** Read the data arrays from the parcel.*/
public void readFromParcel(Parcel in) {mSequence = in.readInt();mNextIndex = in.readInt();Log.d(TAG, "readFromParcel: ",new RuntimeException().fillInStackTrace());mLongs.clear();final int N = in.readInt();for (int i=0; i<N; i++) {final int size = in.readInt();final long[] array = new long[size];readCompactedLongArray(in, array, size);//添加到mLongs中mLongs.add(array);}// Verify that last array's length is consistent with writeToParcelif (N > 0 && mLongs.get(N - 1).length != mNextIndex) {EventLog.writeEvent(0x534e4554, "73252178", -1, "");throw new IllegalStateException("Expected array of length " + mNextIndex + " but was "+ mLongs.get(N - 1).length);}
}

再看看写的方法

/*** Write the data arrays to the parcel.*/
public void writeToParcel(Parcel out) {out.writeInt(mSequence);out.writeInt(mNextIndex);final int N = mLongs.size();out.writeInt(N);for (int i=0; i<N-1; i++) {final long[] array = mLongs.get(i);out.writeInt(array.length);writeCompactedLongArray(out, array, array.length);}// save less for the last one. upon re-loading they'll just start a new array.final long[] lastLongs = mLongs.get(N-1);out.writeInt(mNextIndex);writeCompactedLongArray(out, lastLongs, mNextIndex);
}

也就是说系统设置的中显示的已使用内存时通过writeToParcel写到Parcel中,然后再通过readFromParcel从Parcel读取出来的。

2.获取rom大小

主要时利用反射调用,可以获取到总内存大小,已使用的内存

public void getRomInfo() {StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);try {Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);long total = 0L, used = 0L;int version = Build.VERSION.SDK_INT;for (Object obj : getVolumeInfo) {Field getType = obj.getClass().getField("type");int type = getType.getInt(obj);Log.d(TAG, "type: " + type);if (type == 1) {//TYPE_PRIVATElong totalSize = 0L;//获取内置内存总大小if (version >= Build.VERSION_CODES.O) {Method getFsUuid = obj.getClass().getDeclaredMethod("getFsUuid");String fsUuid = (String) getFsUuid.invoke(obj);反射调用getTotalBytes方法totalSize = getTotalSize(fsUuid);//反射调用getFreeBytes方法long free = getFreeBytes(fsUuid);Log.d(TAG, "query:totalSize " + totalSize + " free " + (totalSize - free));} else if (version >= Build.VERSION_CODES.N_MR1) {//7.1.1//5.0 6.0 7.0没有Method getPrimaryStorageSize = StorageManager.class.getMethod("getPrimaryStorageSize");totalSize = (long) getPrimaryStorageSize.invoke(storageManager);}long systemSize = 0L;Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");boolean readable = (boolean) isMountedReadable.invoke(obj);if (readable) {Method file = obj.getClass().getDeclaredMethod("getPath");File f = (File) file.invoke(obj);Log.d(TAG, "query: " + f.getAbsolutePath());if (totalSize == 0) {//获取data分区的大小totalSize = f.getTotalSpace();}String _msg = "剩余总内存:getTotalSpace " + f.getTotalSpace() + "         " + getUnit(f.getTotalSpace()) + "\n可用内存:" + getUnit(f.getFreeSpace()) + "\n已用内存:" + getUnit(f.getTotalSpace() - f.getFreeSpace());Log.d(TAG, _msg);systemSize = totalSize - f.getTotalSpace();used += totalSize - f.getFreeSpace();total += totalSize;}Log.d(TAG, "totalSize = " + getUnit(totalSize) + " ,used(with system) = " + getUnit(used) + " ,free = " + getUnit(totalSize - used));} else if (type == 0) {//TYPE_PUBLIC//外置存储Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");boolean readable = (boolean) isMountedReadable.invoke(obj);if (readable) {Method file = obj.getClass().getDeclaredMethod("getPath");File f = (File) file.invoke(obj);/*  used += f.getTotalSpace() - f.getFreeSpace();total += f.getTotalSpace();*/long test1 = f.getTotalSpace() - f.getFreeSpace();long test2 = f.getTotalSpace();Log.d(TAG, "query: TYPE_PUBLIC test1 " + test1 + " total test2 " + test2);}} else if (type == 2) {//TYPE_EMULATED}}Log.d(TAG, "总内存 total = " + total + "       " + getUnit(total) + " ,已用 used(with system) = " + used + "      " + getUnit(used) + "\n可用 available = " + (total - used) + "     " + getUnit(total - used));} catch (Exception e) {e.printStackTrace();}}/*** API 26 android O* 获取总共容量大小,包括系统大小*/
@RequiresApi(api = Build.VERSION_CODES.O)
public long getTotalSize(String fsUuid) {try {UUID id;if (fsUuid == null) {id = StorageManager.UUID_DEFAULT;} else {id = UUID.fromString(fsUuid);}StorageStatsManager stats = getSystemService(StorageStatsManager.class);return stats.getTotalBytes(id);} catch (NoSuchFieldError | NoClassDefFoundError | NullPointerException | IOException e) {e.printStackTrace();return -1;}
}@RequiresApi(api = Build.VERSION_CODES.O)
public long getFreeBytes(String fsUuid) {try {UUID id;if (fsUuid == null) {id = StorageManager.UUID_DEFAULT;} else {id = UUID.fromString(fsUuid);}StorageStatsManager stats = getSystemService(StorageStatsManager.class);return stats.getFreeBytes(id);} catch (NoSuchFieldError | NoClassDefFoundError | NullPointerException | IOException e) {e.printStackTrace();return -1;}
}/*** 单位转换*/
private String getUnit(float size) {int index = 0;while (size > 1000 && index < 4) {size = size / 1000;index++;}return String.format(Locale.getDefault(), " %.2f %s", size, units[index]);
}

android如何获取RAM和ROM使用情况相关推荐

  1. android 获得ram大小,Android中获取(RAM)总运存大小跟可用运存大小

    Android中获取(RAM)总运存大小和可用运存大小 //获取可用运存大小 private long getAvailMemory(Context context){ // 获取android当前可 ...

  2. Android性能测试——获取内存和cpu使用情况

    Android性能测试--获取内存和cpu使用情况 在测试Android应用的过程中,内存和cpu值大小是测试的重点之一,本文将列举几种工作中常用的获取方式. 一.使用top获取内存和cpu信息 获取 ...

  3. Keil/MDK(1):查看STM32的RAM和ROM使用情况

    目录 一.概述 二.编译结果 三.map文件 一.概述 本文主要记录下keil环境下,分析空间资源使用情况的基本方法. 二.编译结果 使用keil进行编译后,首先会得到如下信息: 其中: Code 表 ...

  4. 以STM32F103RCT6为例分析单片机的RAM以及ROM使用情况

    1.stm32f103rct6的RAM:48k,ROM:256k 2.如果使用了原子的内存管理,在malloc.h中可以设置一片内存为动态内存,程序中用到的数组或为指针开辟内存就可以使用mymallo ...

  5. android 获得ram大小,Android中获取(RAM)总运存大小和可用运存大小

    //获取可用运存大小 private long getAvailMemory(Context context){ // 获取android当前可用内存大小 ActivityManager am = ( ...

  6. Android中获取手机设备信息、RAM、ROM存储信息,如宽、高、厂商名、手机品牌

    借鉴:https://www.jianshu.com/p/ca869aa2fd72 今天有两个工具类总结,代码里都有注释,直接看代码. 一.首先第一个,主要获取手机设备信息DeviceInfoUtil ...

  7. Android系统信息获取 之一:系统存储信息的获取(RAM,ROM,SDCard)

    Android系统的存储设备一般分为RAM,ROM,SDCard三个部分.其中RAM是Random Access Memory的缩写,是随机存储器,在工作状态时可以随机读写数据,断电以后会丢失数据,即 ...

  8. Unity获取Android手机的RAM和剩余RAM和ROM

    Unity获取Android手机的RAM和剩余RAM和ROM 前言 一.Android工程方法的实现 二.生成aar 三.Untiy中的调用 前言 项目工作需要,在游戏APP运行时,获取当前手机的剩余 ...

  9. android 获取系统的ram和rom,以及可用的

    android设备获取系统的存储空间和运行内存. 亲测可用!!!! //运行内存 public void getTotalRam(){//获取运行内存的信息ActivityManager manage ...

最新文章

  1. 微服务架构如何影响软件开发文化?
  2. 分享一套主流框架源码资料,征服阿里 P7 面试必备!
  3. Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
  4. LeetCode 1971. Find if Path Exists in Graph(图的遍历)
  5. 老板让我搞数字化转型?成功之后,我整理了这套超全的方法论
  6. C++多进程并发框架FFLIB
  7. 信念很简单,把书念下去,然后走出去,不枉活一世 —转自动化所一篇博士论文致谢...
  8. vue computed 传参_Vue的构造选项
  9. 关于无线网卡驱动安装正确,但灯不亮的问题
  10. java.net.SocketException: Unrecognized Windows Sockets error: 10106: create
  11. win10底部任务栏无响应 解决办法
  12. 《当程序员的那些狗日日子》五
  13. MySQL索引(最左匹配查询规则)
  14. 解决 ERROR 1044 (42000): Access denied for user ‘‘@‘localhost‘ to database ‘mysql‘
  15. 二建 项目法律与分类
  16. 内存和CPU占用率过高,该怎么办?
  17. Unity3D键盘输入被输入法屏蔽
  18. 结构化数据和非结构化数据的区别
  19. Flask-自定义头像
  20. 程序员笔试之海康威视2021应用软件开发工程师C/C++单选题收集整理(十二)

热门文章

  1. 夜夜听雨(三)(中国社会科学院 郑哲)
  2. springboot yml文件不是绿叶子问题
  3. flv.js php,flv.js的使用详解
  4. color key在倒车显示功能上的至关重要性
  5. 排列组合中关于捆绑法、插空法、插隔板法
  6. leetcode 18. 四数之和 (C++)
  7. 免费的移动硬盘数据恢复软件EasyRcovery15
  8. 华为机试真题 Python 实现【相同数字的积木游戏】【2022.11 Q4 新题】
  9. Lettuce: Connection to xxx not allowed. This partition is not known in the cluster view.
  10. linux开机启动出现grup,开机出现grub解决方法