
ChromiumOS | 拉取代码和编译Chromium
最近做的工作和ChromeOS有关。小结一下到目前已知的信息。
有关的项目
ChromeOS
ChromeOS是Google开发的以云服务为核心的操作系统,本质来说就是Linux+Chromium+Google Cloud。大部分操作都是Chromium + 插件 + Webapp完成。也有一些界面是用C++写的,有一些功能有c++做后端支持。
除了官方的ChromeOS以外,以开源的ChromiumOS为基础的ChromeOS发行版还有CloudReady和FydeOS。
其中FydeOS是国内公司做的,到这篇博客写作的时间为止,使用的体验是少部分服务替换为了FydeOS自己的,剩下的在线服务似乎缺失比较多。CloudReady沿用了Google的大部分服务。
下面说的ChromeOS和CrOS也大都指开源的ChromiumOS。
Chromium & ChromiumOS
ChromiumOS是ChromeOS的开源版本。仓库在 https://chromium.googlesource.com/chromiumos/ 。
拉取代码需要depot_tools,AOSP也用到了depot_tools中的repo: https://chromium.googlesource.com/chromium/tools/depot_tools/ 。
ChromiumOS仓库最主要的就是两部分:Chromium和一套完整的构建工具。没错,ChromeOS带了几乎完整的工具,chroot进去的时候会完全用ChromiumOS自己的工具链。
工具链看起来借用了一部分Gentoo的portage,但是据同事说魔改了很多,我自己还没有求证。毕竟这两天才把Gentoo虚拟机装起来,并不熟悉这一套东西。构建过程基本上和Gentoo安装很像,就是在一个文件上分出来不同的卷,挂载以后解压目录然后执行ebuild脚本。也带了不少工具用来写镜像啊调试啊什么的。
Chromium就是平时我们用的Chromium浏览器,但是我们平时用的Chromium相比ChromiumOS的,少了很多部分的内容,比如说不带ash(类似于xfwm,窗口管理器,处理窗口的边框啊标题栏啊这些decoration)、不带login manager、不带电源和网络管理,诸如此类的。
depot tools & gerrit
上面提到了depot tools,这是一个构建CrOS必备的工具集。其中常用的主要是
- repo: 管理大型项目中的子项目
- cros/cros_sdk: CrOS环境
- fetch: 下载gclient管理的仓库
- gclient: 仓库同步
- gn: 生成构建配置和脚本,比如说要构建桌面的Chromium还是CrOS的Chromium,这类参数都通过gn配置
- autoninja: 构建Chromium
构建 CrOS
基本环境
官方推荐Ubuntu 18.04,实际上我在Ubuntu 20.04上也没有问题。需要安装一些依赖并且配置好git。
包依赖
Debian Buster+/Ubuntu 18.04+:
sudo apt-get install git gitk git-gui curl xz-utils \
python3-pkg-resources python3-virtualenv python3-oauth2client
其他系统至少需要装git curl xz-utils python3
,包管理如果有pkg-resources virtualenv和oauth2client的话用包管理装上就好,没有的话可以建一个venv。
装depot_tools
说是安装,其实把仓库拉下来,然后放到PATH里面就好了。
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
echo 'export PATH=/path/to/depot_tools:$PATH' >> ~/.${SHELL}rc # bash/zsh
Google API Keys
需要Google Cloud上API库的APIKey和OAuth2的ClientID和ClientSecret。
拉取源码
之前ChromiumOS在国内有镜像,但是现在似乎不好找了。需要可以访问Google的网络环境,不止拉取代码的时候需要,构建的时候最好也设置好环境,否则代码会等很久才退出。
整个项目比较庞大,使用repo管理,repo的使用流程基本上就是init,然后反复sync和编译就行。repo会自动根据manifests仓库的xml拉取源码到指定目录、checkout文件并且运行hook脚本。
repo init -u <URL of manifest>
repo sync
其中URL是CrOS的manifests仓库的URL,建议建一个镜像,办公室大家都可以用。Google原本的在https://chromium.googlesource.com/chromiumos/manifest.git。
构建
depot_tools中有一个工具叫cros_sdk,实际上是建立了一个chroot的环境。通过执行cros_sdk –enter就可以配置好整个工具链然后chroot进去。
设置一下编译的系统的目标环境:
setup_board --board=amd64-generic --default
设置环境变量
./set_shared_user_password.sh
编译
./build_packages
打包
./build_image --noenable_rootfs_verification test
单独构建Chromium
所有事情之前
还是需要API Key,需要depot_tools。
但是Chromium的编译需要python2。Ubuntu可以装python-is-python3的包,其他系统也可以建一个虚拟环境,激活以后继续编译。
拉取源码
Chromium的源码需要用gclient来拉取。
mkdir -pv ${workspace}/Chromium
cd ${workspace}/Chromium
# 第一次
fetch chromium
# fetch以后,之后都重复同步就ok
gclient sync --nohooks
gclient runhooks
编译
Chromium源码都在${workspace}/Chromium/src
中,cd到这个目录继续。
chromium使用ninja/autoninja编译,生成ninja脚本的是gn
gn gen <编译以及输出的路径>
编译:
autoninja -C <编译路径> chrome
执行
<编译路径>/chrome
在Linux上直接运行
在这里有一个特别的情况是,直接这样生成ninja脚本编译我们会得到本地平台上的浏览器Chromium,但是在Linux上我们可以指定目标是chromeos,这样就会编译一个可以直接在当前桌面版上运行的近似于ChromeOS环境的Chromium,带有ash和login manager,可以走通所有的ChromeOS流程。
如果你希望在Linux上开发针对ChromeOS的Chromium,可以在生成的时候指定target:
gn gen <编译以及输出的路径> --args='target_os="chromeos"'
或者在已经生成好配置的环境里面修改参数:
echo 'target_os = "chromeos"' >> <编译路径>/args.gn
然后正常编译就行。但是,但是Ubuntu20.04或者类似的比较新的系统,运行的时候可能会遇到libffi共享库找不到的问题,find一下库的名字找到路径,然后用LD_PRELOAD这个环境变量预加载一下就好了。