日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android怎么ota升级,Android OTA升级过程

發(fā)布時間:2023/12/10 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android怎么ota升级,Android OTA升级过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通過網(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。