1. 上层应用的设置->隐私权->恢复出厂设置对应的java代码在如下路径文件:
packages/apps/Settings/src/com/android/settings/MasterClear.java
MasterClear:mFinalClickListener()函数会发送一个广播出去:
sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
2. 这个广播的接收者在收到广播之后会开启一个java服务线程:MasterClearReceiver:RebootThread
frameworks/base/services/java/com/android/server/MasterClearReceiver.java -- TAG = "MasterClear"
public void onReceive(Context context, Intent intent) {
在线程的run函数中会调用函数:RecoverySystem.rebootWipeUserData(mContext);这个方法是RecoverySystem类的静态方法。
3. RecoverySystem类定义于文件:frameworks/base/core/java/android/os/RecoverySystem.java -- TAG = "RecoverySystem"
4. PowerManager类定义于文件:frameworks/base/core/java/android/os/PowerManager.java -- TAG = "PowerManager"
5. mService指向的是PowerManagerService类,这个类定义于文件:
6. ShutdownThread类在下列文件中实现:
流程:reboot() --> shutdown() --> beginShutdownSequence() --> sInstance.start() --> run() --> Power.reboot(mRebootReason).
最后调用Power类的reboot方法。
7. Power类定义于文件:frameworks/base/core/java/android/os/Power.java ---
调用本地JNI接口rebootNative().
8.Power类对应的JNI接口函数定义于文件:
上面的各种宏定义于文件:bionic/libc/kernel/common/linux/reboot.h
9. libc中__reboot的实现
bionic/libc/arch-arm/syscalls/__reboot.S
10. reboot系统调用实现
kernel/kernel/sys.c
可以看出,recovery和reset都是往RTC_PDN1的bit5:bit4上分别写01和10来标识。
12.正常的log如下:
13. uboot中会先后检查三种方式进入recovery是否成立:第一种是kernel直接写一个寄存器来标记下次启动将进入recovery模式;第二种是快捷键:powerkey+downVOL;第三中就是上层应用发送下来的回复出厂设置的命令,这个命令在restart之前kernel会往MISC分区中写command(boot-recovery)。这项工作在文件:bootable/bootloader/uboot/board/mt6516/mt6516_recovery.c完成。
recovery_check_key_trigger()
recovery_check_command_trigger()
14. g_boot_mode = RECOVERY_BOOT这个成立之后,uboot将会从RECOVERY分区加载recovery.img进SDRAM来运行。
其实这个recovery.img和boot.img结构类似,zImage一样,所不同的是ramdisk.img不同而已。
在运行recovery这个elf的时候会从/cache/recovery/comamnd中读取参数,这个参数是android的上层应用写进入的,--wipe-data,
之后会清除USERDATA和CACHE分区,在将recovery的log文件放在/cache/recovery/下,将原来的command文件删除,最后
调用函数reboot(RB_AUTOBOOT)来重新启动系统。
bootable/recovery/recovery.c
最后需要注意的一个问题是,recovery这个elf在编译user-release版本软件的时候没有copy到/system/bin下面去,需要修改
bootable/recovery/Android.mk文件中的如下地方:
/* BENGIN: lizhiguo 2011-07-27, copy recovery to /system/bin for user builds.*/
#LOCAL_MODULE_TAGS := eng
/* END: lizhiguo 2011-07-27 */
如果放开这行,将只会在eng版本软件中有copy到/system/bin的动作。
分享到:
相关推荐
android recovery模式下可用的较大的字体,直接将此头文件放到bootable\recovery\minui目录下,修改graphics.cpp中对原字体头文件的引用为本文件即可。
通过按下某个按键,使android进入recovery模式,是很好的参考资料
Android recovery原理讲解,讲解Android recovery启动模式的解析及升级过程。
Android系统Recovery模式的工作原理,摘录自网页
Android系统Recovery模式的工作原理 在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及怎样获得主系统发送给Recovery服务的命令,这一系列...
非常全面的介绍详解android Recovery模式,以及相关的OTA升级,update.zip制作,和刷机基础。
android recovery升级教程
Android Recovery模式下选择关机,实际是重启,修改为关机
android recovery代码分析
Android11 修复user版本,按电源键+音量减键进入recovery模式会进入no command 界面问题.patch
关于Android Recovery模式的介绍,包括流程图,对于了解OTA升级应该是很有用的
如何进入Recovery模式 安卓手机进入Recovery模式方法大全
7-Data Android Recovery 是由 SharpNight LLC 出品的一款安卓数据恢复软件。7-Data Android Recovery 是 7-Data 文件恢复系列中的一员。大眼仔介绍过很多针对 Android 的数据恢复软件,其实大眼仔一款都没有用过,...
android-recovery移植汉化
Android recovery资料大全---网上找了很久
在这里有必要理一下android的启动过程:图1android启动过程系统上电之后,首先是完成一系列的初始化过程,如cpu、串口、中断、timer、DDR等等硬件设备,然后接着加载bootdefaultenvironmet,为后面内核的加载作好...
解决Android手机刷机失败 无法进入Recovery模式 无法开机
Android手机Recovery模式取证方法研究.pdf
b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写 c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常...