完全公升級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
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]);
完全公升級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...