内存显示容量不正确

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

posted @ 2022-08-18 15:43  M-kobe  阅读(801)  评论(0编辑  收藏  举报