企业网页与网站区别,北京有几个区哪个区最好,小企业网站建设平台,什么专业会做网站通过网络或直接本地获取到OTA升级包之后#xff0c;通过程序就可开始Android的升级。本文描述这一过程。在获取到OTA升级包之后#xff0c;可以直接通过android.os.RecoverySystem.installPackage()开启OTA升级。RecoverySystem.installPackage()是在API-8之后加入的#xf…通过网络或直接本地获取到OTA升级包之后通过程序就可开始Android的升级。本文描述这一过程。在获取到OTA升级包之后可以直接通过android.os.RecoverySystem.installPackage()开启OTA升级。RecoverySystem.installPackage()是在API-8之后加入的使用它需要权限android.Manifest.permission.REBOOT一、RecoverySystem#installPackage()的实现RecoverySystem.installPackage()就是把传入的文件的文件名通过arg“--update_package”【用具体文件代替】调用bootCommand()实现。bootCommand()的实现FileWriter commandnewFileWriter(COMMAND_FILE);try{command.write(arg);command.write(\n);} finally{command.close();}// Having writtenthe command file, go ahead and rebootPowerManager pm (PowerManager) context.getSystemService(Context.POWER_SERVICE);m.reboot(recovery);COMMAND_FILE 是“/cache/recovery/command”。bootCommand()也就是向/cache/recovery/command里把“--update_package”写入然后通过BinderIPC调用PowerManagerService的reboot()并把“recovery”作为参数传入。二、PowerManagerService#reboot的实现PowerManagerService.reboot(reason: String)是通过启动ShutdownThread.reboot(mContext,finalReason, false)的执行实现。执行顺序图如图所示其中的值- reason: “recovery”;- confirm: false;- rebootOrShutdown的参数分别取值reboot 最后调用的Power.reboot()通过JNI调用它的c实现。在Power.java的JNI实现在android_os_power.cpp中。三、Power.reboot的Native实现Power.reboot()是通过android_os_Power_reboot实现【frameworks/base/core/jni/android_os_power.cpp中】staticvoidandroid_os_Power_reboot(JNIEnv *env, jobject clazz,jstring reason){sync();#ifdef HAVE_ANDROID_OSif(reason NULL) {reboot(RB_AUTOBOOT);} else{constchar*chars env-GetStringUTFChars(reason, NULL);__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, (char*) chars);env-ReleaseStringUTFChars(reason, chars); // In case it fails.}jniThrowIOException(env,errno);#endif}通过系统调用__reboot嵌入内核实现reboot。在内核态进入sys_reboot系统定义。四、sys_reboot的定义与实现sys_reboot的定义与实现要看内核中的代码// kernel/kernel/sys.cSYSCALL_DEFINE4(reboot, int, magic1,int,magic2, unsignedint, cmd,void__user *, arg)//kernel/include/linux/syscalls.h#define __SYSCALL_DEFINEx(x, name, ...) \asmlinkagelong sys##name(__SC_DECL##x(__VA_ARGS__))#define SYSCALL_DEFINEx(x, sname, ...) \__SYSCALL_DEFINEx(x,sname, __VA_ARGS__)#define SYSCALL_DEFINE4(name, ...)SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)所以sys.c中的SYSCALL_DEFINE4(reboot, ...)就实现了sys_reboot()SYSCALL_DEFINE4(reboot,...)中对magic1和magic2进行判别只有符合的magic1及和magic2才会处理否则直接返回。对cmdLINUX_REBOOT_CMD_RESTART2把reboot的reason从用户态拷贝到内核态调用kernel_restart()执行。kernel_restart(char* cmd)先调用kernel_restart_prepare(cmd);然后调用machine_restart(cmd);// kernel/kernel/sys.cvoidkernel_restart_prepare(char*cmd){blocking_notifier_call_chain(reboot_notifier_list,SYS_RESTART, cmd);system_state SYSTEM_RESTART;device_shutdown();sysdev_shutdown();}//kernel/arch/arm/kernel/process.cvoidmachine_restart(char*cmd){arm_pm_restart(reboot_mode,cmd);}arm_pm_restart指向具体平台定义的机器重启的函数指针原型是void(*arm_pm_restart)(char str, const char *cmd)。具体实现与所采用的特定平台相关这里不再讲述。总结本文描述了Android中对OTA升级发起的过程从Framework到JNI再到Kernel层层层关系的分析看到所谓的OTA升级的发起就是通过向/cache/recovery/command里把“--update_package”写入然后通过系统调用转入内核态执行系统调用实现机器重启完成OTA升级的全过程。重启之后进入Recovery模式的过程在后面的专题中再讨论。