zoukankan      html  css  js  c++  java
  • chromium的安装程序

    转自: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 buildgyp_chromium -D"component=static_library"

    可能重新编译之前需要清空之前编译的结果,清空完成后运行编译程序。

    ninja -C outRelease -t clean
    ninja -C outRelease mini_installer

    这个步骤会把之前的chromium重新编译了,所以在清空之前需要考虑之前使用shared_library编译的chromium是否需要保存。

    关于static_library和shared_library的区别,我个人的理解是:

    static library:程序运行时依赖的库函数在编译时被包含到编译的目标代码中,所以程序可以在没有这些库的机器上运行。
    shared library:程序运行时依赖的库函数在编译时没有被包含到编译的目标代码中,而是把这些函数属于哪个库和它们在库中的地址等信息记录下来。
    当使用到这些函数时,会根据已记录下的信息把函数所属的库加载进来。

    mini_installer的工程在srcchromeinstaller下,入口就是mini_installer.cc

    mini_installer.exe的工作比较简单,主要是进行了以下几个工作。

    1. 确定工作目录,这个工作目录也就是解压包的目录,这个目录通过GetTempPath函数确定,在win7下为C:Users\%USERNAME%AppDataLocalTemp,%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_USERSoftwareChromium下加入一项。该项的名称为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%AppDataLocal

    上述的基础路径下,会加上ChromiumApplication得到目标路径,这个路径在InstallerState::Initialize函数中生成,并保存在target_path_中。

    调用安装函数InstallProducts,该函数的主要工作在InstallProductsHelper完成。

    1、CreateTemporaryAndUnpackDirectories函数

    生成temp_path:C:Users\%USERNAME%AppDataLocalChromiumApplicationTemp

    生成解压路径unpack_path:C:Users\%USERNAME%AppDataLocalChromiumApplicationTempsource

    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()进行回滚。

  • 相关阅读:
    OpenGL学习之路(四)
    OpenGL学习之路(三)
    ajax请求成功后新开窗口window.open()被拦截解决方法
    Mysql日志解析
    Kibana+Logstash+Elasticsearch 日志查询系统
    谈谈Redis的SETNX
    常用前端开发工具合集
    Media Queries 详解
    启动mysql时显示:/tmp/mysql.sock 不存在的解决方法
    找不到mysql.sock,mysql.sock丢失问题解决方法
  • 原文地址:https://www.cnblogs.com/x_wukong/p/5036082.html
Copyright © 2011-2022 走看看