android如何获取RAM和ROM使用情况
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使用情况相关推荐
- android 获得ram大小,Android中获取(RAM)总运存大小跟可用运存大小
Android中获取(RAM)总运存大小和可用运存大小 //获取可用运存大小 private long getAvailMemory(Context context){ // 获取android当前可 ...
- Android性能测试——获取内存和cpu使用情况
Android性能测试--获取内存和cpu使用情况 在测试Android应用的过程中,内存和cpu值大小是测试的重点之一,本文将列举几种工作中常用的获取方式. 一.使用top获取内存和cpu信息 获取 ...
- Keil/MDK(1):查看STM32的RAM和ROM使用情况
目录 一.概述 二.编译结果 三.map文件 一.概述 本文主要记录下keil环境下,分析空间资源使用情况的基本方法. 二.编译结果 使用keil进行编译后,首先会得到如下信息: 其中: Code 表 ...
- 以STM32F103RCT6为例分析单片机的RAM以及ROM使用情况
1.stm32f103rct6的RAM:48k,ROM:256k 2.如果使用了原子的内存管理,在malloc.h中可以设置一片内存为动态内存,程序中用到的数组或为指针开辟内存就可以使用mymallo ...
- android 获得ram大小,Android中获取(RAM)总运存大小和可用运存大小
//获取可用运存大小 private long getAvailMemory(Context context){ // 获取android当前可用内存大小 ActivityManager am = ( ...
- Android中获取手机设备信息、RAM、ROM存储信息,如宽、高、厂商名、手机品牌
借鉴:https://www.jianshu.com/p/ca869aa2fd72 今天有两个工具类总结,代码里都有注释,直接看代码. 一.首先第一个,主要获取手机设备信息DeviceInfoUtil ...
- Android系统信息获取 之一:系统存储信息的获取(RAM,ROM,SDCard)
Android系统的存储设备一般分为RAM,ROM,SDCard三个部分.其中RAM是Random Access Memory的缩写,是随机存储器,在工作状态时可以随机读写数据,断电以后会丢失数据,即 ...
- Unity获取Android手机的RAM和剩余RAM和ROM
Unity获取Android手机的RAM和剩余RAM和ROM 前言 一.Android工程方法的实现 二.生成aar 三.Untiy中的调用 前言 项目工作需要,在游戏APP运行时,获取当前手机的剩余 ...
- android 获取系统的ram和rom,以及可用的
android设备获取系统的存储空间和运行内存. 亲测可用!!!! //运行内存 public void getTotalRam(){//获取运行内存的信息ActivityManager manage ...
最新文章
- 微服务架构如何影响软件开发文化?
- 分享一套主流框架源码资料,征服阿里 P7 面试必备!
- Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
- LeetCode 1971. Find if Path Exists in Graph(图的遍历)
- 老板让我搞数字化转型?成功之后,我整理了这套超全的方法论
- C++多进程并发框架FFLIB
- 信念很简单,把书念下去,然后走出去,不枉活一世 —转自动化所一篇博士论文致谢...
- vue computed 传参_Vue的构造选项
- 关于无线网卡驱动安装正确,但灯不亮的问题
- java.net.SocketException: Unrecognized Windows Sockets error: 10106: create
- win10底部任务栏无响应 解决办法
- 《当程序员的那些狗日日子》五
- MySQL索引(最左匹配查询规则)
- 解决 ERROR 1044 (42000): Access denied for user ‘‘@‘localhost‘ to database ‘mysql‘
- 二建 项目法律与分类
- 内存和CPU占用率过高,该怎么办?
- Unity3D键盘输入被输入法屏蔽
- 结构化数据和非结构化数据的区别
- Flask-自定义头像
- 程序员笔试之海康威视2021应用软件开发工程师C/C++单选题收集整理(十二)
热门文章
- 夜夜听雨(三)(中国社会科学院 郑哲)
- springboot yml文件不是绿叶子问题
- flv.js php,flv.js的使用详解
- color key在倒车显示功能上的至关重要性
- 排列组合中关于捆绑法、插空法、插隔板法
- leetcode 18. 四数之和 (C++)
- 免费的移动硬盘数据恢复软件EasyRcovery15
- 华为机试真题 Python 实现【相同数字的积木游戏】【2022.11 Q4 新题】
- Lettuce: Connection to xxx not allowed. This partition is not known in the cluster view.
- linux开机启动出现grup,开机出现grub解决方法