Android 如何才能捕获系统的恢复出厂设置事件


点击恢复出厂设置后,系统重启,再次进入系统后,一切数据都被清空,怎样可以得知之前到底是否恢复出厂设置了呢?怎样可以标记 恢复出厂设置事件 ?我希望在系统重启后,根据客户需求,判断出刚刚恢复过出厂设置,然后添加一些响应和处理,同时还要区别于正常开机或者重启,怎么做呢?

     最开始遇到这个问题,我束手无策,只是大致猜想应该是在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 (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.<init>(FileInputStream.java:82)
W/EntropyService( 761): at java.io.FileInputStream.<init>(FileInputStream.java:134)
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.<init>(EntropyService.java:86)
W/EntropyService( 761): at com.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 (IOException e) {
            Slog.w(TAG,
"unable to load initial entropy (first boot?)", e);
        }
    }

     在catch中添加想要做的处理就行了。需要特别注意的是:这是android起的第一个服务,如果做的处理比较复杂,要用到android的其他服务,还是建议在此处只设置个标志(比如创建一个临时文件),放到之后再处理。

  这个方法简单易操作,而且在系统正常开机或者正常重启时,EntropyService绝不会报错(W or E),真正达到了标记恢复出厂设置的目的。

相关内容