Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...
在一次需求的實現過程中需要在remcovery模式下,在/cache/recovery/目錄下創建一個日志文件用于記錄相關的日志信息,以便于在開機后讀取這些日志信息,再根據日志信息做出相應的處理,但是奇怪的是每當開機完成該文件不被系統自動刪除,而系統中原有的日志文件(如升級log---last_log_r)等卻依然保留,因此在全局中搜索關鍵字”/cache/recovery/“發現了這其中的原因。
也就是說系統會在系統啟動完成后刪除/cache/recovery/目錄下不是以”last_"為前綴的文件,那么具體是如何實現的呢,我們一起來看一下。
首先在framework層有一個BootReceiver這樣一個類,用于處理系統啟動完成后的善后工作,例如刪除舊的無關的日志信息等。
第一步:在framework/base/core/res下的清單文件AndroidManifest.xml中注冊廣播接收器BootReceiver,用于接收系統啟動完成的廣播如下:
android:primaryUserOnly="true">
intent-filter>
receiver>
第二步:當系統啟動完成后,這個廣播接收器會接收到系統啟動完成的廣播之后在onReceive下執行logBootEvents函數,并執行RecoverySystem下的handleAftermath()函數,最終刪除在/cache/recovery下不是以last_為前綴的文件。具體函數如下:
/**
*?Called?after?booting?to?process?and?remove?recovery-related?files.
*?@return?the?log?file?from?recovery,?or?null?if?none?was?found.
*
*?@hide
*/
publicstaticString?handleAftermath()?{
//?Record?the?tail?of?the?LOG_FILE
Log.d(TAG,"Entering?the?handleAftermath?method");
String?log?=?null;
try{
log?=?FileUtils.readTextFile(LOG_FILE,?-LOG_FILE_MAX_LENGTH,?"...\n");
}?catch(FileNotFoundException?e)?{
Log.i(TAG,?"No?recovery?log?file");
}?catch(IOException?e)?{
Log.e(TAG,?"Error?reading?recovery?log",?e);
}
//?Delete?everything?in?RECOVERY_DIR?except?those?beginning
//?with?LAST_PREFIX
String[]?names?=?RECOVERY_DIR.list();
for(inti?=0;?names?!=null&&?i
if(names[i].startsWith(LAST_PREFIX))continue;
File?f?=?newFile(RECOVERY_DIR,?names[i]);
if(!f.delete())?{
Log.e(TAG,?"Can't?delete:?"+?f);
}?else{
Log.i(TAG,?"Deleted:?"+?f);
}
}
returnlog;
}
注:如果我們需要在/cache/recovery/目錄下保存文件,我們可以以"last_"為前綴進行命名也可以在RecoverySystem中修改相關的邏輯。
總結
以上是生活随笔為你收集整理的Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android找工作 2019,2019
- 下一篇: android studio gradl