编译环境准备
Chrome的编译和WebKit相比起来,难度上来说,简直是一元二次方程求解和偏微分方程求解的对比(我到现在还没有完整的把WebKit编译出来, 鄙视一下自己)。虽然Chrome也是从WebKit演进过来,差不多也就是把WebKit的JS引擎替换成了V8。但是不得不承认Google把 WebKit的编译难度降低了几个数量级。
言归正传,Chrome官方网站上公布的是基于Visual Studio 2005进行编译,网上也有兄弟基于Visual Studio 2008编译成功过,但我手头上没有Visual Stdio 2008,所以无从得知。本文也是以Visual Studio2005环境为例。我曾经在自己家里的电脑上用Visual C++ 2005 Express版本编译过,没有成功。在XP Professional和Vista Home两个操作系统上均编译成功。
在下载Chrome代码前,需要安装下面几个软件:
1. 安装Visual Studio 2005.
2. 安装 Visual Studio 2005 Service Pack 1 .
3. 安装热补丁 Hotfix 947315 .
4. 如果操作系统是Vista,还需要安装 Visual Studio 2005 Service Pack 1 Update for Windows Vista 。
5. 安装 Windows 2008 SDK 。按照网上说法,如果是Visual Studio 2008,就不需要安装这个了。
6. 配置Windows 2008 SDK。在开始->程序->Microsoft Windows SDK v6.1 > Visual Studio Registration > Windows SDK Configuration Tool.。选择make current按钮,幸运的话,应该能一次成功。如果不能成功,Chrome官方网站上有一个 手动配置 的帮助,大家可以参考。
下载代码
Google为Chrome提供了一个一个部署工具 depot_tools ,包括下载代码、同步代码、上传代码等功能。这个工具采用Python编写的,其中还包含了一些Javascript脚本。 depot_tools 中包含了一个gclient工具,是我们需要关注的重点。
下载代码有几种方式:
1. Chrome官网上提供了一个 源代码包 ,可以直接下载下来。不过这个包并不是最新的包。我采用的是这种方法进行下载的,相对来说比较快。
2. 采用SVN客户端工具进行下载,比如TortoiseSVN客户端工具,SVN服务器地址是http://src.chromium.org/svn/trunk/src。
3. 采用google提供的 depot_tools 工具。
(1) 下载和安装 depot_tools 。
(2) 把depot_tools的安装目录设置到系统目录(系统Path环境变量)中。
(3) 创建一个存放Chrome代码的目录,比如d:/chrome。目录不要包含空格。
(4) 在命令行下,先将当前目录切换到chrome代码的目录,例如上面的(d:/chrome)。
(5) 运行gclient config http://src.chromium.org/svn/trunk/src命令。Gclient将会先下载svn工具和python工具,然后调用svn进行代码同步。
注意:gclient中下载svn和python采用的是javascript实现。如果在需要设置proxy的环境中,则需要需要修改一下脚本。
1.打开X:/depot_tools/bootstrap/win/get_file.js文件。其中X是你的安装盘符。
将Line9-Line22行之间的代码
try {
xml_http = new ActiveXObject("MSXML2.ServerXMLHTTP");
xml_http = new ActiveXObject("MSXML2.ServerXMLHTTP");
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": Cannot create Active-X object (" + e.description) + ").";
WScript.Quit(1);
}
try {
xml_http.open("GET", url, false);
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": invalid URL.");
WScript.Quit(1);
}
修改成
try {
xml_http = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0 ");
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": Cannot create Active-X object (" + e.description) + ").";
WScript.Quit(1);
}
try {
xml_http.setProxy(2, proxyIP:Port); //Proxy IP和Port
xml_http.open("GET", url, false);
xml_http.setProxyCredentials(username,pwd); //用户名和密码
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": invalid URL.");
WScript.Quit(1);
}
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": Cannot create Active-X object (" + e.description) + ").";
WScript.Quit(1);
}
try {
xml_http.open("GET", url, false);
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": invalid URL.");
WScript.Quit(1);
}
修改成
try {
xml_http = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0 ");
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": Cannot create Active-X object (" + e.description) + ").";
WScript.Quit(1);
}
try {
xml_http.setProxy(2, proxyIP:Port); //Proxy IP和Port
xml_http.open("GET", url, false);
xml_http.setProxyCredentials(username,pwd); //用户名和密码
} catch (e) {
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
": invalid URL.");
WScript.Quit(1);
}