android修改RAM和ROM在設置中的顯示

所有存儲設備約定成俗,實際容量會比顯示容量小。比如,1TB廠商會以1000GB計算,而不是1024GB,所以顯示的是1000/1024=976GB。
android設備也是如此,對外規格有1+8和2+16,故客戶希望顯示實際的值。

RAM
android RAM是直接讀取/proc/meminfo裏的數值,修改的接口是在framework層,僅需在此修改即可解決設置中顯示的數值。
這裏需要注意的是,無法針對第三方檢測軟件,因爲第三方無需root也能直接讀取/proc/meminfo的值。

P2000L:/ $ cat /proc/meminfo
MemTotal:        1930740 kB
MemFree:          212328 kB
Buffers:           31960 kB
Cached:           808864 kB
SwapCached:            0 kB
Active:           786688 kB
Inactive:         500180 kB
Active(anon):     446392 kB
Inactive(anon):     1124 kB
Active(file):     340296 kB
Inactive(file):   499056 kB
Unevictable:         256 kB
Mlocked:             256 kB
SwapTotal:        524284 kB
SwapFree:         524284 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        446340 kB
Mapped:           279252 kB
Shmem:              1488 kB
Slab:             255676 kB
SReclaimable:      40900 kB
SUnreclaim:       214776 kB
KernelStack:       21264 kB
PageTables:        29404 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1489652 kB
Committed_AS:   40764468 kB
VmallocTotal:   251658176 kB
VmallocUsed:      103424 kB
VmallocChunk:   251454644 kB

通過指令可以獲取MemTotal、MemFree等數值,上層在讀取之後構建數組分別存儲這些數值。
在存儲時做特殊的修改即可。
這裏需要注意,只要是系統直接讀取/proc/meminfo的地方都需要修改,目前作者在測試的協助下找到2處。

Index: frameworks/base/core/jni/android_os_Debug.cpp
===================================================================
--- frameworks/base/core/jni/android_os_Debug.cpp	(版本 491)
+++ frameworks/base/core/jni/android_os_Debug.cpp	(工作副本)
@@ -737,6 +737,11 @@
     };
     long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
+    // @ + for BUG # {
+    static const long RAM_1G = 1048576L;
+    static const long RAM_2G = 2097152L;
+    // @ + for BUG # }
+
     char* p = buffer;
     while (*p && numFound < (sizeof(tagsLen) / sizeof(tagsLen[0]))) {
         int i = 0;
@@ -751,6 +756,15 @@
                     p++;
                 }
                 mem[i] = atoll(num);
+                // @ + for BUG # {
+                if (i == 0) {
+                    if (mem[i] < RAM_1G) {
+                        mem[i] = RAM_1G;
+                    } else if (mem[i] > RAM_1G && mem[i] < RAM_2G) {
+                        mem[i] = RAM_2G;
+                    }
+                }
+                // @ + for BUG # }
                 numFound++;
                 break;
             }
Index: frameworks/base/core/jni/android_util_Process.cpp
===================================================================
--- frameworks/base/core/jni/android_util_Process.cpp	(版本 491)
+++ frameworks/base/core/jni/android_util_Process.cpp	(工作副本)
@@ -609,6 +609,11 @@
 
     size_t numFound = 0;
     jlong mem = 0;
+    
+    // @ + for BUG # {
+    static const long RAM_1G = 1048576L * 1024;
+    static const long RAM_2G = 2097152L * 1024;
+    // @ + for BUG # }
 
     char* p = buffer;
     while (*p && numFound < num) {
@@ -625,6 +630,15 @@
                     if (*p == 0) p--;
                 }
                 mem += atoll(num) * 1024;
+                // @ + for BUG # {
+                if (i == 0) {
+                    if (mem < RAM_1G) {
+                        mem = RAM_1G;
+                    } else if (mem > RAM_1G && mem < RAM_2G) {
+                        mem = RAM_2G;
+                    }
+                }
+                // @ + for BUG # }
                 numFound++;
                 break;
             }

ROM
android rom實現的機制沒有深究,在android N之前的該法:

Index: frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
===================================================================
--- frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java	(版本 495)
+++ frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java	(工作副本)
@@ -222,9 +222,15 @@
 
             try {
                 final StructStatVfs stat = Os.statvfs(path);
-                final long totalSize = stat.f_blocks * stat.f_bsize;
-                final long availSize = stat.f_bavail * stat.f_bsize;
-                return new long[] { totalSize, availSize };
+                if ("/data".equals(path)) { // @  +  
+                    final long totalSize = 8589934592L; // set totalSize (ROM) to 8Gb.
+                    final long availSize = stat.f_bavail * stat.f_bsize;
+                    return new long[] { totalSize, availSize };
+                } else {
+                    final long totalSize = stat.f_blocks * stat.f_bsize;
+                    final long availSize = stat.f_bavail * stat.f_bsize;
+                    return new long[] { totalSize, availSize };
+                }
             } catch (ErrnoException e) {
                 throw new IllegalStateException(e);
             }

android N之後的該法:

Index: frameworks/base/core/java/android/os/storage/StorageManager.java
===================================================================
--- frameworks/base/core/java/android/os/storage/StorageManager.java	(版本 495)
+++ frameworks/base/core/java/android/os/storage/StorageManager.java	(工作副本)
@@ -142,11 +142,8 @@
     };
     private static final int INTERNAL_STORAGE_SECTOR_SIZE = 512;
 
-    // @ + for BUG # {
-    private static final long TOTAL_8G = 8589934592L;
-    private static final long TOTAL_16G = 17179869184L;
-    // @ + for BUG # }
 
+
     private final Context mContext;
     private final ContentResolver mResolver;
 
@@ -939,14 +936,6 @@
         for (String path : INTERNAL_STORAGE_SIZE_PATHS) {
             final long numberBlocks = readLong(path);
             if (numberBlocks > 0) {
-                // @ + for BUG # {
-                if (numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE < TOTAL_8G) {
-                    return TOTAL_8G;
-                } else if (numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE > TOTAL_8G &&
-                    numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE < TOTAL_16G) {
-                    return TOTAL_16G;
-                }
-                // @ +- for BUG # }
                 return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE;
             }
         }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章