android怎么ota升级,Android OTA升级过程
通過網絡或直接本地獲取到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?command=newFileWriter(COMMAND_FILE);
try{
command.write(arg);
command.write("\n");
}?finally{
command.close();
}
//?Having?writtenthe?command?file,?go?ahead?and?reboot
PowerManager?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_OS
if(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.c
SYSCALL_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.c
voidkernel_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.c
voidmachine_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模式的過程在后面的專題中再討論。
總結
以上是生活随笔為你收集整理的android怎么ota升级,Android OTA升级过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中使用unzip_unzip命令
- 下一篇: 微服务之consul(一) - 诗码者