google低儲存方案設計(略微修改)
一.概述
當手機剩餘儲存過低時系統可能會無儲存可用,從而導致系統崩潰或無法開機問題。為了解決這類問題我們制定了一套低儲存方案,引導使用者清理垃圾騰出儲存空間,和預留空間給系統應用使用,降低儲存導致的系統崩潰或無法開機的問題。該方案主要從應用,Framework,檔案系統層三層來深入展開。應用層,這一層主要是清理應用中的垃圾。Framework層,這層主要是給應用提供資料支撐,和情非得以的情況下刪除一下應用的下載檔案等。檔案系統層,這一層是我們的最後防線,它主要是提供了128M的預留空間給系統關鍵程序使用。
二.整體框架
整體框架由應用層,Framework層,檔案系統層這三層組成,每層的分工不一樣,應用層主要幫助使用者清理垃圾,Framework層為應用層和使用者提供通知,檔案系統層為系統重要程序提供能使用的預留空間。
我們針對儲存空間不足進行了分級,劃分為3級,每級對應不同的策略:
1.剩餘儲存較低(小於1G),發出系統通知,溫和提示使用者清理垃圾
2.嚴重低(小於500M),彈出對話方塊,警告使用者清理垃圾
3.危險(小於100M),直接進入清理頁面,只有清理垃圾並恢復至非危險狀態才可退出此頁面
三.應用層
應用層,這一層主要是提醒引導使用者清理垃圾,幫忙手機騰出儲存空間,從而降低儲存導致低導致系統崩潰的情況。應用主要負責的事情是清理應用快取,垃圾檔案,安裝包,解除安裝殘留。
四.框架層
Framework層,這一層主要是提醒使用者手機儲存空間不足,需要清理垃圾,並且啟動應用程式來清理垃圾。儲存監控的邏輯主要實現是在DeviceStorageMonitorService,監控邏輯如下圖:
DeviceStorageMonitorService中會每隔一分鐘讀一次當前的儲存情況然後根據不同的等級做不同的處理:
1.如果儲存等級等於一,並且和上次等級不一樣,那麼會發送等級一的通知,使用者點選通知後會彈出垃圾清理應用。
2.如果儲存等級等於二,並且和上次等級不一樣,那麼會發送等級二的通知,並且會彈出垃圾清理提示框,這時候無論使用者點選通知欄的訊息還是垃圾清理提示框都會彈出垃圾清理應用。
3.如果儲存等級等於三,並且和上次等級不一樣,那麼會發出等級三的通知,並且直接彈出手機瘦身讓使用者清理垃圾,這時候點選通知欄的訊息彈出的也會是手機瘦身。
當處於第三等級的時候每此解鎖手機都會彈出手機瘦身,提示使用者清理垃圾,主要邏輯如下:
當DeviceStorageMonitorService接收到解鎖廣播後,會判斷一下當前的等級是不是第二級,如果是的話會判斷這個廣播是不是解鎖廣播,如果是的話會再次讀取現在的儲存等級 如果是第三等級的情況下會彈出手機瘦身,讓使用者清理垃圾。
五.檔案系統層
檔案系統層是我們的最後一層防護了,這一層主要是預留了128M的儲存空間,一般程序無法使用,在O上只有配置了ACCESS_REVERSED_DISK許可權的程序才能夠使用這預留的儲存空間,目前在小米機器上有Zygote,system_server,SystemUI配置了該許可權。具體實現原理:
首先在fstab檔案中宣告要預留的儲存空間是多少,例如這裡宣告的是128M
/dev/block/bootdevice/by-name/userdata /data ext4 nosuid,nodev,barrier=1,noauto_da_alloc,discard wait,check,reservedsize=128M,fileencryption=ice
然後在fs_mgr_fstab.c中的parse_flags方法中會去解析定義好的預留空間大小,詳細程式碼如下:
{ "reservedsize=", MF_RESERVEDSIZE },
} else if ((fl[i].flag == MF_RESERVEDSIZE) && flag_vals) {
/* The reserved flag is followed by an = and the
* reserved size of the partition. Get it and return it.
*/
flag_vals->reserved_size = parse_size(strchr(p, '=') + 1);
}
接著:
//reserved_blocks大小就是128M
snprintf(buf, sizeof (buf), "-r %lu", reserved_blocks);
char *tune2fs_argv[] = {
TUNE2FS_BIN, //system/bin/tune2fs
buf, //預留大小
blk_device, //對應data塊
};
ret = android_fork_execvp_ext(ARRAY_SIZE(tune2fs_argv), tune2fs_argv,
&status, true, LOG_KLOG | LOG_FILE,
true, NULL, NULL, 0);
這裡通過tune2fs命令來修改了保留塊的大小。然後配置了CAP_SYS_RESOURCE許可權的程序可以使用該保留塊(N的機型)。因為O上android o system.te 檔案中限制了capability sys_resource許可權:neverallow system_server system_server:capability sys_resource,所以system_server在O上會被阻止對sys_resource的訪問,這個配置CAP_SYS_RESOURCE許可權的方案在O上失效了。最後我們根據GOOGLE的建議:用resuid, resgid的方式可以繞開selinux許可權,訪問分割槽預留空間。我們在允許擁有ACCESS_REVERSED_DISK許可權的程序訪問這個保留塊。
六.總結
這套低儲存方案由應用,Frameork,檔案系統這三層全面保障系統擁有良好的剩餘儲存環境。我們經過層層防護也減少了大量因為沒有儲存導致的系統崩潰以及無法開機問題,並且大大減少了工程師重複分析問題的時間,提高了很多工作效率。