1. 程式人生 > >8.1插入SD卡後機器本身記憶體顯示不一致

8.1插入SD卡後機器本身記憶體顯示不一致

8.1 Setting中,當插入SD卡,會顯示兩個介面,一個記憶體顯示已使用3.42GB,一個顯示已使用3.89GB,差異比較大,如下圖
在這裡插  入圖片描述 圖1
在這裡插入圖片描述圖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無法修改,如下圖
在這裡插入圖片描述

解決方法二(統一從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 顯示統一了。