轉自: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的工作比較簡單,主要是進行了以下幾個工作。
- 確定工作目錄,這個工作目錄也就是解壓包的目錄,這個目錄通過GetTempPath函數確定,在win7下為C:\Users\%USERNAME%\AppData\Local\Temp,%USERNAME%就是當前用戶的名稱。在Temp目錄下會創建一個格式類似CR_B4D84.tmp的文件夾,這個包用來解壓安裝文件。
- 解壓安裝文件,在CR_B4D84.tmp文件夾中會得到兩個文件setup.exe和CHROME.PACKED.7Z
- 創建進程運行setup.exe,並等待安裝程序完成程序的安裝。
- 刪除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()進行回滾。