8.1插入SD卡后机器本身内存显示不一致

8.1 Setting中,当插入SD卡,会显示两个界面,一个内存显示已使用3.42GB,一个显示已使用3.89GB,差异比较大,如下图
8.1插入SD卡后机器本身内存显示不一致_第1张图片 图1
8.1插入SD卡后机器本身内存显示不一致_第2张图片图2
经查看代码,图1代码位置是
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/StorageSettings.java 调用的是
mStorageManager = context.getSystemService(StorageManager.class);
final List<VolumeInfo> volumes = mStorageManager.getVolumes();
final File path = vol.getPath();
privateUsedBytes += (volumeTotalBytes - path.getFreeSpace());
也就是调用了File 的 getFreeSp加粗样式ace() 方法。

图2的代码位置是
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/StorageDashboardFragment.java 调用的是:
private void onReceivedSizes() {
if (mStorageInfo != null) {
long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
mSummaryController.updateBytes(privateUsedBytes, mStorageInfo.totalBytes);
可以找到调用的是frameworks/base/core/java/android/app/usage/StorageStatsManager.java下面的getFreeBytes,IStorageStatsManager.aidl是它的aidl,最后代码实现在frameworks/base/services/usage/java/com/android/server/usage/StorageStatsService.java
public long getFreeBytes(String volumeUuid, String callingPackage) {
… return path.getUsableSpace() ; …
也就是调用了File 的 getUsableSpace()

通过log打印证实了两个获取的值不一样,百度了一下
https://segmentfault.com/a/1190000004245393?tdsourcetag=s_pcqq_aiomsg
获取磁盘空间信息
File提供了三个方法可以让你得知某个分区的磁盘空间的信息:
long getFreeSpace() //获取剩余空间
long getTotalSpace() //获取总空间大小
long getUsableSpace() //获取剩余可用空间
尽管getFreeSpace和getUsableSpace看起来差不多,但实际上是有差别的,getUsableSpace会进行更多细致的检查,比如当前JVM进程是否对该目录有写权限,以及另外一些操作系统的限制等。
所以才会导致图2的已使用的值偏大。

解决方法一(统一从getFreeSpace获取值):
frameworks/base/services/usage/java/com/android/server/usage/StorageStatsService.java
public long getFreeBytes(String volumeUuid, String callingPackage) {

  •            return path.getUsableSpace();
    
  •            //return path.getUsableSpace();
    
  •           return path.getFreeSpace();//zhuangwf
           }
    

这种方法显示已使用空间偏小,但是在设置-存储-释放空间 ,进入file Go 时,显示不一致,google apk无法修改,如下图
8.1插入SD卡后机器本身内存显示不一致_第3张图片

解决方法二(统一从getUsableSpace获取值):
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/StorageSettings.java
if (vol.isMountedReadable()) {
final File path = vol.getPath();

  •           privateUsedBytes += (volumeTotalBytes - path.getFreeSpace());
    
  •          privateUsedBytes += (volumeTotalBytes - path.getUsableSpace());//zhuangwf
    

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/StorageVolumePreference.java

  •        final long freeBytes = path.getFreeSpace();
    
  •       final long freeBytes = path.getUsableSpace();//zhuangwf
           final long usedBytes = totalBytes - freeBytes;
    

vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java

  •    final long freeBytes = mVolume.getPath().getFreeSpace();
    
  •    //final long freeBytes = mVolume.getPath().getFreeSpace();
    
  •   final long freeBytes = mVolume.getPath().getUsableSpace();//zhuangwf
       final long usedBytes = mTotalSize - freeBytes;
    

显示已用空间偏大,但这样就和file Go 显示统一了。

你可能感兴趣的:(Android,8.1)