总存储大小计算原理:
系统获取存储大小是通过获取”/system”和”/data” 两个Directory 的和来计算的,即Environment.getDataDirectory().getTotalSpace()
+ Environment.getRootDirectory().getTotalSpace()
问题一 :实际存储大小大于等于16G,设置-存储 存储总大小显示不正确
问题分析:
USERDATAIMAGE 大小配置不正确,导致系统获取的总存储大小异常;
USERDATAIMAGE配置规则和方法:
修改的代码及路径:
对应项目工程的BoardConfig.mk,将BOARD_USERDATAIMAGE_PARTITION_SIZE修改成上面计算的大小值
如:sc126\qcm2290-iot-spf-2.0\fibo\projects\SN129-13-00-00\LA.UM.9.15.2
device\qcom\sc126_32go\BoardConfig.mk
BOARD_USERDATAIMAGE_PARTITION_SIZE := 24000000000
问题二:实际存储大小为8G,设置-存储 存储总大小显示不正确
问题分析:
存储大小为8G,查看各分区占用情况发现super分区占用在2.7G左右,userdata分区占用2.8G左右;系统打印的getTotalBytes只有1.9G; 无法通过配置userdata大小使getTotalBytes 达到4G以上来向上取到8G内存;
问题根本原因是系统总内存太小,导致super占用内存比例太大导致。
解决思路:
通过获取系统内存节点来获取总内存大小"sys/class/block/mmcblk0/size";但不同平台对应的节点存在差异,所以移植到其它平台时,需查找平台对应的内存大小的节点
修改的代码及路径:
a/fibo/common/LA.QSSI.12.0.r1/frameworks/base/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/fibo/common/LA.QSSI.12.0.r1/frameworks/base/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -86,7 +86,11 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
-
+//[JIRA:MC0350-218] Modified by luoyalong for memory display error in Settings 2023-8-25 start
+import android.util.Log;
+import java.io.BufferedReader;
+import java.io.FileReader;
+//[JIRA:MC0350-218] Modified by luoyalong for memory display error in Settings 2023-8-25 end
public class StorageStatsService extends IStorageStatsManager.Stub {
private static final String TAG = "StorageStatsService";
@@ -217,9 +221,23 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
@Override
public long getTotalBytes(String volumeUuid, String callingPackage) {
// NOTE: No permissions required
-
+ //[JIRA:MC0350-218] Modified by luoyalong for memory display error in Settings 2023-8-25 start
+ //romInfo,Different platforms correspond to different nodes
+ String romInfo = "sys/class/block/mmcblk0/size";
+ int cutSize = 2;
+ int unit = 1000;
if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- return FileUtils.roundStorageSize(mStorage.getPrimaryStorageSize());
+ String romSize = readCmd(romInfo);
+ double totalRom = Math.ceil(Double.parseDouble(romSize)/cutSize/unit/unit);
+ Log.e(TAG, "totalROM = " + totalRom);
+ if (totalRom < 16 && totalRom > 0) {
+ long totalBytes = new Double(totalRom).longValue() * unit * unit * unit;
+ Log.e(TAG, "totalBytes = " + totalBytes);
+ return totalBytes;
+ }else{
+ return FileUtils.roundStorageSize(mStorage.getPrimaryStorageSize());
+ }
+ //[JIRA:MC0350-218] Modified by luoyalong for memory display error in Settings 2023-8-25 end
} else {
final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
if (vol == null) {
@@ -229,7 +247,29 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
return FileUtils.roundStorageSize(vol.disk.size);
}
}
-
+ //[JIRA:MC0350-218] Modified by luoyalong for memory display error in Settings 2023-8-25 start
+ public String readCmd(String sys_path) {
+ String prop = "waiting";
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new FileReader(sys_path));
+ prop = reader.readLine();
+ } catch (IOException e) {
+ e.printStackTrace();
+ Log.e(TAG, " ***ERROR*** " + e.getMessage());
+ } finally {
+ if(reader != null){
+ try {
+ reader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ Log.e(TAG, "readFile cmd from "+sys_path + ",data"+" -> prop = "+prop);
+ return prop;
+ }
+ //[JIRA:MC0350-218] Modified by luoyalong for memory display error in Settings 2023-8-25 end
@Override
public long getFreeBytes(String volumeUuid, String callingPackage) {
// NOTE: No permissions required