chromium之mini_installer


 

轉自:http://www.xue163.com/182/6/1822338.html#pinglun

 

這篇文章主要簡單講解chromium的安裝程序mini_installer

在編譯mini_installer時,要更改編譯的參數把component設置為static_library,不然編譯出來的mini_staller會報“mini_installer.exe is incompatible with the component build”的錯誤

 

python build\gyp_chromium -D"component=static_library"

 

可能重新編譯之前需要清空之前編譯的結果,清空完成后運行編譯程序。

 

ninja -C out\Release -t clean
ninja -C out\Release mini_installer

這個步驟會把之前的chromium重新編譯了,所以在清空之前需要考慮之前使用shared_library編譯的chromium是否需要保存。

 

關於static_library和shared_library的區別,我個人的理解是:

static library:程序運行時依賴的庫函數在編譯時被包含到編譯的目標代碼中,所以程序可以在沒有這些庫的機器上運行。
shared library:程序運行時依賴的庫函數在編譯時沒有被包含到編譯的目標代碼中,而是把這些函數屬於哪個庫和它們在庫中的地址等信息記錄下來。
當使用到這些函數時,會根據已記錄下的信息把函數所屬的庫加載進來。

mini_installer的工程在src\chrome\installer下,入口就是mini_installer.cc

mini_installer.exe的工作比較簡單,主要是進行了以下幾個工作。

 

  1. 確定工作目錄,這個工作目錄也就是解壓包的目錄,這個目錄通過GetTempPath函數確定,在win7下為C:\Users\%USERNAME%\AppData\Local\Temp,%USERNAME%就是當前用戶的名稱。在Temp目錄下會創建一個格式類似CR_B4D84.tmp的文件夾,這個包用來解壓安裝文件。
  2. 解壓安裝文件,在CR_B4D84.tmp文件夾中會得到兩個文件setup.exe和CHROME.PACKED.7Z
  3. 創建進程運行setup.exe,並等待安裝程序完成程序的安裝。
  4. 刪除CR_B4D84.tmp臨時文件夾。是否刪除CR_B4D84.tmp臨時文件夾,由函數ShouldDeleteExtractedFiles決定。為了能夠讓程序不刪除CR_B4D84.tmp臨時文件夾,需要在注冊表\HKEY_CURRENT_USER\Software\Chromium下加入一項。該項的名稱為ChromeInstallerCleanup,類型為字符串值,值為"0"。

 

 

以上就是mini_installer.exe的工作,在這個過程中,會創建進程運行setup.exe。

 

setup.exe的代碼看起來比較復雜,它的實現在代碼,setup_main.cc中,主要工作包括:

確定安裝目錄,chromium的安裝分為兩種,一種是system install,另一種是user install,都是通過PathProviderWin函數獲取安裝路徑,具體代碼在base_paths_win.cc。

如果是system install,安裝目錄CSIDL_PROGRAM_FILES,對應C:\Program Files

如果是user install,安裝目錄CSIDL_LOCAL_APPDATA,我win7系統下對應C:\Users\%USERNAME%\AppData\Local\

上述的基礎路徑下,會加上Chromium\Application\得到目標路徑,這個路徑在InstallerState::Initialize函數中生成,並保存在target_path_中。

 

調用安裝函數InstallProducts,該函數的主要工作在InstallProductsHelper完成。

1、CreateTemporaryAndUnpackDirectories函數

生成temp_path:C:\Users\%USERNAME%\AppData\Local\Chromium\Application\Temp

生成解壓路徑unpack_path:C:\Users\%USERNAME%\AppData\Local\Chromium\Application\Temp\source

2、初始化rchivePatchHelper實例archive_helper

UncompressAndPatchChromeArchive函數

進行第一次解壓,在unpack_path目錄下解壓CHROME.PACKED.7Z,得到chrome.7Z

UnPackArchive函數

進行第二次解壓,解壓chrome.7Z得到Chrome-bin目錄

從Chrome-bin目錄下得到當前安裝的版本號installer_version

3、調用InstallOrUpdateProduct函數安裝程序

該函數中調用InstallNewVersion函數,其中install_list包含了安裝程序進行的一系列操作,包括創建目錄、拷貝文件和修改注冊表等。

在AddInstallWorkItems函數中為install_list添加安裝的操作,然后調用install_list->Do()執行操作。

如果安裝過程中出現錯誤,則調用install_list->Rollback()進行回滾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM