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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2023/12/10 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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升级过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。