完全公升級OTA包的安裝流程(上)

2021-06-28 20:55:15 字數 3214 閱讀 4085

完全公升級ota包的安裝流程(上)

從bootloader 進入recovery 模式後,首先也是執行linux核心,該核心跟普通模式沒有區別(減輕了bsp開發者的任務)。區別從執行檔案系統開始。 recovery 模式的細節就隱藏在其根檔案系統中。

下面,我們就看看進入recovery 根檔案系統都幹些啥。

init.rc

和正常啟動一樣,核心進入檔案系統會執行/init, init 的配置檔案就是 /init.rc, 前面文章講過,這個檔案來自:bootable/recovery/etc/init.rc,下面,我們看看它的內容。

on init

export path /sbin

export android_root /system

export android_data /data

export external_storage /sdcard

symlink /system/etc /etc

mkdir /sdcard

mkdir /system

mkdir /data

mkdir /cache

mount /tmp /tmp tmpfs

on boot

service recovery /sbin/recovery

service adbd /sbin/adbd recovery

disabled

socket adbd stream 660 system system

# always start adbd on userdebug and eng builds

on property:ro.debuggable=1

write /sys/class/android_usb/android0/enable 1

start adbd

可以看到,它很非常簡單:

1)   設定幾個環境變數。備用。

2)   建立 etc 鏈結。

3)   造幾個目錄。備用。

4)   mount /tmp 目錄為記憶體檔案系統 tmpfs,後面會用到。

5)   trival 設定,不必關心。

6)   啟動 recovery主程式。

7)   如果是eng模式(此時persist.service.adb.enable),啟動adb

當然,init主程式還會裝載屬性配置檔案 /default.prop, 它包含了很多系統屬性設定,比如,ro.build.*, 等等。

很明顯,這裡最重要的就是recovery主程式,下面,我們分析它。

先看一段注釋

recovery 主程式

intmain(int argc, char **argv)

}device_recovery_start();

這個函式沒幹什麼。看名字,它給裝置製造商提供了乙個呼叫機會,可寫入裝置相關初始化**。

fprintf(stderr, "command:");

for (arg = 0; arg < argc; arg++)

fprintf(stderr, "/n/n");

列印出命令,比如,正常啟動進入recovery模式,會列印:command: "/sbin/recovery"

property_list(print_property, null);

fprintf(stderr, "/n");

列印出所有的系統屬性(from default.prop)到log檔案。

int status = install_success;

if (update_package != null) else if (wipe_data) else if (wipe_cache) else

根據使用者提供引數,呼叫各項功能,比如,安裝乙個公升級包,擦除cache分割槽, 擦除user data分割槽,install_package比較複雜,後面專門分析,其它都很簡單。忽略。

if (status != install_success) ui_set_background(background_icon_error);

if (status != install_success) prompt_and_wait();

如果前面已經做了某項操作並且成功,則進入重啟流程。否則,等待使用者選擇具體操作。

而使用者可選操作為: reboot, 安裝update.zip,除cache分割槽, 擦除user data分割槽,如前所述,只有安裝package 比較複雜,其它簡單。

// otherwise, get ready to boot the main system...

finish_recovery(send_intent);

它的功能如下:

1)將前面定義的intent字串寫入(如果有的話):cache:recovery/command

2)將 /tmp/recovery.log 複製到 "cache:recovery/log";

3)清空 misc 分割槽,這樣重啟就不會進入recovery模式

4)刪除command 檔案:cache:recovery/command;

ui_print("rebooting.../n");

sync();

reboot(rb_autoboot);

return exit_success;

}重啟。

下面我們分析核心函式 install_package

intinstall_package(const char* path, int* wipe_cache, const char* install_file)

else

int result = really_install_package(path, wipe_cache);

if (install_log)

return result;

}該函式主要呼叫了really_install_package

static int

really_install_package(const char *path, int* wipe_cache)

close(pipefd[1]);

1,通過execv(binary, (char* const*)args);呼叫meta-inf/com/google/android路徑下的可執行檔案:update-binary;

2,由update-binary對meta-inf/com/google/android路徑下的的指令碼檔案(updater-script)進行解析。

完全公升級OTA包的安裝流程(上)

完全公升級ota包的安裝流程 上 從bootloader 進入recovery 模式後,首先也是執行linux核心,該核心跟普通模式沒有區別 減輕了bsp開發者的任務 區別從執行檔案系統開始。recovery 模式的細節就隱藏在其根檔案系統中。下面,我們就看看進入recovery 根檔案系統都幹些啥...

OTA公升級包的解釋和公升級方法

ota公升級是什麼意思?ota公升級以後會不會刪除手機端的聯絡人,應用程式等資料 正常情況ota公升級是不會影響手機上的任何資訊的,包括應用程式,也就是說ota公升級以後除了系統軟體有所改變並且介面有所變化以外,其它資料不會受到任何影響,但是請注意,我說的是在正常情況下,而如果你的手機在公升級過程中...

Linux上Python的安裝公升級

cd usr local src wget 2 安裝,在 usr local目錄下建立python3.5目錄,將python安裝到該目錄下 建立資料夾 mkdir usr local python3.5 解壓 tar xvf python 3.5.tgz cd python 3.5 安裝 confi...