最开始遇到这个问题,我束手无策,只是大致猜想应该是在Bootloarder中操作捕捉标记,应该很麻烦,所以发了个帖子询问。
一个朋友提供了方案A:
对于这种方法,理论上是正确的。我在真机上进行实验,开机后,必须以非常麻利的身手,快速的把cache/recovery/log拷贝出来,赶在android系统跑起来之前,完成这一操作。但是并没有达到我想要的目的,原因是,为了满足客户的要求,提高启动速率,减少进入系统前格式化cache所耗费的时间,我们的工程师对这里做了修改。限制了开机启动对cache的写入,即使是恢复出厂设置,也不会创建recovery目录,更不会有Log文件了。
虽然这个方案落败了,但是幸运的是,又有个朋友提供了方案B:
一般第一次开机或做factory reset后,肯定会报这个错误:
W/EntropyService( 761): unable to load initial entropy (first boot )
W/EntropyService( 761): java.io.FileNotFoundException: /data/system/entropy.dat (No such file or directory)
W/EntropyService( 761): at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
W/EntropyService( 761): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
W/EntropyService( 761): at java.io.FileInputStream.
W/EntropyService( 761): at java.io.FileInputStream.
W/EntropyService( 761): at com.android.server.RandomBlock.fromFile(RandomBlock.java:45)
W/EntropyService( 761): at com.android.server.EntropyService.loadInitialEntropy(EntropyService.java:99)
W/EntropyService( 761): at com.android.server.EntropyService.
W/EntropyService( 761): at com.android.server.EntropyService.
W/EntropyService( 761): at com.android.server.ServerThread.run(SystemServer.java:109)
具体到代码就是EntropyService中的:
private void loadInitialEntropy() {
try {
RandomBlock.fromFile(entropyFile).toFile(randomDevice);
} catch (IOException e) {
Slog.w(TAG, "unable to load initial entropy (first boot )", e);
}
}
在catch中添加想要做的处理就行了。需要特别注意的是:这是android起的第一个服务,如果做的处理比较复杂,要用到android的其他服务,还是建议在此处只设置个标志(比如创建一个临时文件),放到之后再处理。
这个方法简单易操作,而且在系统正常开机或者正常重启时,EntropyService绝不会报错(W or E),真正达到了标记恢复出厂设置的目的。