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;
             }
         }
### 寻找减少 FreeRTOS 占用最小 RAM 的方法 #### 配置优化选项 为了使 FreeRTOS 使用尽可能少的 RAM,可以调整多个配置项。这些配置通常位于 `FreeRTOSConfig.h` 文件中: - **降低任务栈大小**:通过设置 `configMINIMAL_STACK_SIZE` 来减小默认的任务堆栈尺寸[^1]。 - **禁用不必要的功能**:如果不需要某些特性(如事件组、消息队列),可以在编译时关闭它们以节省内存空间。 - **精简内核组件**:只启用应用程序实际使用的那些部分,比如定时器服务或软件计数器等[^2]。 ```c #define configUSE_TIMERS 0 /* 如果不使用定时器 */ #define configUSE_COUNTING_SEMAPHORES 0 /* 不需要计数信号量的话设为0 */ ``` #### 调整调度策略 采用静态分配而非动态分配的方式创建对象能够有效控制并限制最大可能消耗的 RAM 数量。这涉及到修改宏定义来指定固定数量的工作区给特定资源池而不是让系统自行决定所需多少存储单元[^3]: ```c // 启用静态内存分配支持 #define configSUPPORT_STATIC_ALLOCATION 1 ``` #### 应用程序层面的改进措施 除了上述针对操作系统的改动外,在编写基于此平台的应用逻辑时也应遵循良好的实践原则: - 尽早释放不再使用的句柄; - 循环利用已存在的缓冲区代替频繁申请新的实例; - 对于临时数据结构考虑使用局部变量替代全局声明的形式; 通过以上几个方面的综合考量与实施,能够在很大程度上实现对 FreeRTOS 所需运行期工作集的有效压缩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值