内存显示容量不正确
platform:rk3288
os:android7.1
问题描述:在设置-存储的内容显示中,显示的内存只有3.79G,而且贴的emmc是8G的,这就相差就太大了。
设置中获取存储容量的方法:
Settings\src\com\android\settings\deviceinfo\StorageSettings.java @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); final Context context = getActivity(); mStorageManager = context.getSystemService(StorageManager.class); mStorageManager.registerListener(mStorageListener); if (sTotalInternalStorage <= 0) { sTotalInternalStorage = mStorageManager.getPrimaryStorageSize(); } addPreferencesFromResource(R.xml.device_info_storage); mInternalCategory = (PreferenceCategory) findPreference("storage_internal"); mExternalCategory = (PreferenceCategory) findPreference("storage_external"); mInternalSummary = new StorageSummaryPreference(getPrefContext()); setHasOptionsMenu(true); }
sTotalInternalStorage = mStorageManager.getPrimaryStorageSize();
这个调用的是framework层的接口:
frameworks\base\core\java\android\os\storage\StorageManager.java
private static final String[] INTERNAL_STORAGE_SIZE_PATHS = {
//"/sys/block/mmcblk0/size",
//"/sys/block/sda/size"
};
private static final String[] INTERNAL_STORAGE_SIZE_PATHS_ALTERNATIVE = {
"/sys/block/mmcblk1/size",
"/sys/block/sda/size",
"/sys/block/rknand_userdata/size"
};
private static boolean alternative_path=platform.equals("rk3368")||platform.equals("rk3399");
public long getPrimaryStorageSize() { if(alternative_path){ for (String path : INTERNAL_STORAGE_SIZE_PATHS_ALTERNATIVE) { final long numberBlocks = readLong(path); if (numberBlocks > 0) { return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE; } } } else{ for (String path : INTERNAL_STORAGE_SIZE_PATHS) { final long numberBlocks = readLong(path); if (numberBlocks > 0) { return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE; } } } return 0; }
从这里可以看出rk3288调用的是INTERNAL_STORAGE_SIZE_PATHS ,这里竟然是屏蔽掉的,return 0,难怪读出来的内存相差这么大。
直接读emmc块的大小:
MT100:/ # cat /proc/partitions major minor #blocks name 1 0 8192 ram0 1 1 8192 ram1 1 2 8192 ram2 1 3 8192 ram3 1 4 8192 ram4 1 5 8192 ram5 1 6 8192 ram6 1 7 8192 ram7 1 8 8192 ram8 1 9 8192 ram9 1 10 8192 ram10 1 11 8192 ram11 1 12 8192 ram12 1 13 8192 ram13 1 14 8192 ram14 1 15 8192 ram15 254 0 520912 zram0 179 0 7634944 mmcblk2 179 1 4096 mmcblk2p1 179 2 4096 mmcblk2p2 179 3 4096 mmcblk2p3 179 4 16384 mmcblk2p4 179 5 24576 mmcblk2p5 179 6 32768 mmcblk2p6 179 7 32768 mmcblk2p7 179 8 114688 mmcblk2p8 179 9 131072 mmcblk2p9 179 10 2097152 mmcblk2p10 179 11 16384 mmcblk2p11 179 12 524288 mmcblk2p12 179 13 524288 mmcblk2p13 179 14 4100096 mmcblk2p14 179 96 512 mmcblk2rpmb 179 64 4096 mmcblk2boot1 179 32 4096 mmcblk2boot0
MT100:/ # cat /sys/block/mmcblk2/size 15269888
于是,可以修改INTERNAL_STORAGE_SIZE_PATHS 如下:
private static final String[] INTERNAL_STORAGE_SIZE_PATHS = {
//"/sys/block/mmcblk0/size", //"/sys/block/sda/size"
"/sys/block/mmcblk1/size",
"/sys/block/mmcblk2/size"
};
实际大小为:15269888*512/1024/1024/1024 = 7.28G
但这种方式,还是跟实际的8G有些许的偏小。
参考Android11新实现的getPrimaryStorageSize,可以获取到实际大小,比如8G的EMMC,显示共8.00G。
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java old mode 100644 new mode 100755 index 8e24caf..1434f20 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -752,4 +752,17 @@ public class FileUtils { public static @Nullable File newFileOrNull(@Nullable String path) { return (path != null) ? new File(path) : null; } + + public static long roundStorageSize(long size) { + long val = 1; + long pow = 1; + while ((val * pow) < size) { + val <<= 1; + if (val > 512) { + val = 1; + pow *= 1024; + } + } + return val * pow; + } } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java old mode 100644 new mode 100755 index b10c7cd..c25d6a3 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -939,24 +939,28 @@ public class StorageManager { /** {@hide} */ public long getPrimaryStorageSize() { - if(alternative_path){ - for (String path : INTERNAL_STORAGE_SIZE_PATHS_ALTERNATIVE) { - final long numberBlocks = readLong(path); - if (numberBlocks > 0) { - return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE; - } - } - } - else{ - for (String path : INTERNAL_STORAGE_SIZE_PATHS) { - final long numberBlocks = readLong(path); - if (numberBlocks > 0) { - return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE; - } - } - } - return 0; - } + return FileUtils.roundStorageSize(Environment.getDataDirectory().getTotalSpace() + + Environment.getRootDirectory().getTotalSpace()); + } + // public long getPrimaryStorageSize() { + // if(alternative_path){ + // for (String path : INTERNAL_STORAGE_SIZE_PATHS_ALTERNATIVE) { + // final long numberBlocks = readLong(path); + // if (numberBlocks > 0) { + // return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE; + // } + // } + // } + // else{ + // for (String path : INTERNAL_STORAGE_SIZE_PATHS) { + // final long numberBlocks = readLong(path); + // if (numberBlocks > 0) { + // return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE; + // } + // } + // } + // return 0; + // } private long readLong(String path) { try (final FileInputStream fis = new FileInputStream(path);
现在实际显示如下:
参考:https://blog.csdn.net/ansondroider/article/details/109463949
https://blog.csdn.net/layuetian2011/article/details/110110348
分类:
RockChip-3288
, android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!