铺捉factoryreset的事件 ---转载
点击恢复出厂设置后,系统重启,再次进入系统后,一切数据都被清空,怎样可以得知之前到底是否恢复出厂设置了呢?怎样可以标记 恢复出厂设置事件 ?我希望在系统重启后,根据客户需求,判断出刚刚恢复过出厂设置,然后添加一些响应和处理,同时还要区别于正常开机或者重启,怎么做呢?
最开始遇到这个问题,我束手无策,只是大致猜想应该是在Bootloarder中操作捕捉标记,应该很麻烦,所以发了个帖子询问。
一个朋友提供了方案A:
这个要修改bootable下的recovery.c文件,让他在擦除了usrdata分区之后,再cache分区中加一个标志文件。我的建议是恢复出厂设置的时候会在cache分区的recovery下有log文件,你开机后可以立马去读这个文件,看做了什么,等Android跑起来后会清空cache/recovery/log文件,所以要在适当的时候做处理。
对于这种方法,理论上是正确的。我在真机上进行实验,开机后,必须以非常麻利的身手,快速的把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(Nosuchfileordirectory)
W/EntropyService(761):atorg.apache.harmony.luni.platform.OSFileSystem.openImpl(NativeMethod)
W/EntropyService(761):atorg.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
W/EntropyService(761):atjava.io.FileInputStream.<init>(FileInputStream.java:82)
W/EntropyService(761):atjava.io.FileInputStream.<init>(FileInputStream.java:134)
W/EntropyService(761):atcom.Android.server.RandomBlock.fromFile(RandomBlock.java:45)
W/EntropyService(761):atcom.Android.server.EntropyService.loadInitialEntropy(EntropyService.java:99)
W/EntropyService(761):atcom.Android.server.EntropyService.<init>(EntropyService.java:86)
W/EntropyService(761):atcom.Android.server.EntropyService.<init>(EntropyService.java:76)
W/EntropyService( 761): at com.Android.server.ServerThread.run(SystemServer.java:109)具体到代码就是EntropyService中的:
private void loadInitialEntropy() {
try{
RandomBlock.fromFile(entropyFile).toFile(randomDevice);
}catch(IOExceptione){
Slog.w(TAG,"unabletoloadinitialentropy(firstboot?)",e);
}
}
在catch中添加想要做的处理就行了。需要特别注意的是:这是Android起的第一个服务,如果做的处理比较复杂,要用到android的其他服务,还是建议在此处只设置个标志(比如创建一个临时文件),放到之后再处理。这个方法简单易操作,而且在系统正常开机或者正常重启时,EntropyService绝不会报错(W or E),真正达到了标记恢复出厂设置的目的。