您的位置:首页 > 移动开发 > Android开发

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

2012-04-03 17:12 381 查看
原文地址:/article/1608615.html

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

最开始遇到这个问题,我束手无策,只是大致猜想应该是在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),真正达到了标记恢复出厂设置的目的。

我问问题的帖子在:http://topic.csdn.net/u/20110427/14/4df32953-fec5-44c0-8847-375b5a44bee8.html

欢迎交流~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: