android怎么ota升级,Android OTA升级过程
通過網(wǎng)絡(luò)或直接本地獲取到OTA升級包之后,通過程序就可開始Android的升級。本文描述這一過程。
在獲取到OTA升級包之后,可以直接通過android.os.RecoverySystem.installPackage()開啟OTA升級。
RecoverySystem.installPackage()是在API-8之后加入的,使用它需要權(quán)限:android.Manifest.permission.REBOOT
一、RecoverySystem#installPackage()的實現(xiàn)
RecoverySystem.installPackage()就是把傳入的文件的文件名通過arg“--update_package=”【用具體文件代替】,調(diào)用bootCommand()實現(xiàn)。
bootCommand()的實現(xiàn):
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調(diào)用PowerManagerService的reboot(),并把“recovery”作為參數(shù)傳入。
二、PowerManagerService#reboot的實現(xiàn)
PowerManagerService.reboot(reason: String)是通過啟動ShutdownThread.reboot(mContext,finalReason, false)的執(zhí)行實現(xiàn)。
執(zhí)行順序圖如圖所示,其中的值:
- reason: “recovery”;
- confirm: false;
- rebootOrShutdown的參數(shù)分別取值:reboot
最后調(diào)用的Power.reboot(),通過JNI調(diào)用它的c實現(xiàn)。
在Power.java的JNI實現(xiàn)在android_os_power.cpp中。
三、Power.reboot的Native實現(xiàn)
Power.reboot()是通過android_os_Power_reboot實現(xiàn)【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
}
通過系統(tǒng)調(diào)用__reboot,嵌入內(nèi)核,實現(xiàn)reboot。
在內(nèi)核態(tài),進(jìn)入sys_reboot系統(tǒng)定義。
四、sys_reboot的定義與實現(xiàn)
sys_reboot的定義與實現(xiàn)要看內(nèi)核中的代碼
//?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, ...)就實現(xiàn)了sys_reboot()
SYSCALL_DEFINE4(reboot,...)中對magic1和magic2進(jìn)行判別,只有符合的magic1及和magic2才會處理,否則直接返回。
對cmdLINUX_REBOOT_CMD_RESTART2:把reboot的reason從用戶態(tài)拷貝到內(nèi)核態(tài),調(diào)用kernel_restart()執(zhí)行。
kernel_restart(char* cmd)先調(diào)用kernel_restart_prepare(cmd);然后調(diào)用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指向具體平臺定義的機器重啟的函數(shù)指針,原型是void(*arm_pm_restart)(char str, const char *cmd)。
具體實現(xiàn)與所采用的特定平臺相關(guān),這里不再講述。
總結(jié)
本文描述了Android中對OTA升級發(fā)起的過程,從Framework到JNI,再到Kernel層,層層關(guān)系的分析,看到所謂的OTA升級的發(fā)起,就是通過向/cache/recovery/command里把“--update_package=”寫入,然后通過系統(tǒng)調(diào)用轉(zhuǎn)入內(nèi)核態(tài)執(zhí)行系統(tǒng)調(diào)用,實現(xiàn)機器重啟,完成OTA升級的全過程。
重啟之后,進(jìn)入Recovery模式的過程在后面的專題中再討論。
總結(jié)
以上是生活随笔為你收集整理的android怎么ota升级,Android OTA升级过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中使用unzip_unzip命令
- 下一篇: android使碎片切换界面,玩转And