编译精简的chromium记录

2025/03/30

Tags: chromium

Table of Contents

0 前言

春节尝试了自己写pytorch模型, 通过我封装的vnc控件,远程docker中的Ubuntu, 采集扫雷游戏的截图, 训练两个模型

前面的识别模型一个星期就成功了,但是强化学习的效果除了花了春节一周时间,还追加了三个星期的周末,都没能成功

不知道是不是强化学习需要的数据量太大导致的,因此只能暂时搁置此学习任务,否则道心不稳,天空好像始终覆盖一层厚重的阴霾

为了走出ddqn的滑铁卢,我把目光转向chromium , 我想编译各平台的精简版本的chromium内核,像electorn一样使用它进行一些web集成到客户端(qt qml 的opengl frame buffer object)中的开发,这样既能享受web前端便利的生态,又能使用qt qml全平台的c++能力,对web在音视频等领域的乏力进行补充.

1 mac os

官方文档

https://github.com/chromium/chromium/blob/main/docs/mac_build_instructions.md

https://bitbucket.org/chromiumembedded/cef/wiki/AutomatedBuildSetup.md#markdown-header-windows-configuration

我们主要完成以下三个步骤

1.0 源码拉取

1.1 切换sdk

src/build/config/mac/mac_sdk.gni里可以确认需要官方编译时的sdk版本

这个版本不一定是要低要救,如果没有这个版本的sdk可以调为你有的版本实验编译,如果编译不过,再安装和他们一样的sdk版本

如果需要安装新的sdk, 可能需要安装对应的xcode版本,在这里下载

什么版本的xcode有什么版本的sdk 看这个说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29


#选择xcode
xcode-select -p
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcodebuild -showsdks

#查看可用sdk
xcodebuild -showsdks
ls `xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/

#查看当前sdk
  xcrun --show-sdk-path 
xcrun --sdk macosx --show-sdk-version



#临时配置sdk
export SDKROOT=`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk

#编译时配置sdk
cd build && xcodebuild -sdk macosx13.3
#or

#cmake 
cmake .. -DCMAKE_OSX_SYSROOT=`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk

#GN
gn gen out/Default --args='mac_sdk_path="`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk"'

1.2 配置depot_tools

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

1
$ export PATH="$PATH:/path/to/depot_tools"

1.3 获取源码

1
2
3
4
$ mkdir chromium && cd chromium
$ caffeinate fetch chromium #防止电脑在拉代码时睡眠
#只拉最新的代码可以用fetch --no-history chromium,想恢复时git fetch --unshallow
#如果网络中断可以不重新开始,使用gclient sync

1.4 配置构建参数

https://www.chromium.org/developers/gn-build-configuration/

1
2
mkdir -p out/arm64 #name可以是任意的,例如这个目录用于生成arm64,就可以取名为arm64
vim out/arm64/args.gn

为了你electorn那样编译精简的版本, args.gn的内容配置为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
chrome_pgo_phase = 0
mac_sdk_path = "/Applications/Xcode16.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk"
#vim  "/Applications/Xcode15.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk"


#支持h264,mp3,专利原因默认不开启
ffmpeg_branding = "Chrome"
enable_proprietary_codecs = true


# 关闭调试信息,减小体积
is_debug = false
is_java_debug = false #android Defaults to is_debug.

dcheck_always_on = false
is_official_build = true
is_chrome_branded = false #googler only
symbol_level = 0
blink_symbol_level=0 
v8_symbol_level=0

# 关闭组件构建,生成单一二进制文件
is_component_build = false

# 目标平台(根据需求设置)
target_cpu = "arm64"  # 或 "arm64"(M1/M2 Mac)
host_cpu = "arm64"  # 或 "arm64"(M1/M2 Mac)
#use_jumbo_build=ture #windows上打开这个会编译比较快

# 移除不必要功能
enable_nacl = false
enable_extensions = true  # 关闭扩展支持
enable_plugins = true     # 关闭 Pepper/Flash 插件
enable_pdf = true         # 关闭 PDF 渲染支持
enable_print_preview = true  # 关闭打印预览
enable_webrtc = false      # 关闭 WebRTC(视频通话)
webrtc_enable_screen_capture = false
enable_spellcheck = false  # 关闭拼写检查
enable_reporting = false   # 关闭错误报告
enable_mhtml = false       # 关闭 MHTML(网页存档)
enable_dbus = false        # 关闭 D-Bus(Linux)


# 移除自动更新和远程控制
use_gnome_keyring = false
enable_remoting = false
use_kerberos = false

# 最小化 UI 组件
use_aura = false  # 关闭 Aura UI(仅 CLI 程序时)


# osr
#use_ozone = true  #linux
enable_osr = true

# 关闭无用的依赖
use_cups = true  # 关闭 CUPS 打印支持
use_pulseaudio = false  # 关闭 PulseAudio
use_gio = false  # 关闭 GIO(Linux 文件管理)

# 进一步裁剪大小
enable_media_router = false  # 关闭 Chromecast
enable_resource_allowlist_generation = false  # 关闭资源白名单

如果需要交叉编译,设置

1
2
3
# 目标平台(根据需求设置)
target_cpu = "arm64"  # 或 "arm64"(M1/M2 Mac)
host_cpu = "arm64"  # 或 "arm64"(M1/M2 Mac)

执行配置

1
gn gen out/arm64

1.5 编译

1
2
ulimit -n 524288
#防止打开最多文件数量限制

如果不需要Ui,只是使用库,则使用content_shell选项编译

1
2
3
ninja -C out/Default content_shell
#编译完成后执行启动一个最小化的webview
out/Default/content_shell --disable-gpu

删除不需要的静态库和动态库

1
2
3
4
strip out/Default/chrome  # 去掉调试符号
find out/Default -name "*.a" -delete  # 删除静态库
find out/Default -name "*.so" -delete  # 删除不必要的动态库
find out/Default -name "*.pdb" -delete  # 删除调试符号(Windows)

如果需要有编译有ui

1
2
3
4
ninja -C out/Default chrome
strip out/Default/chrome  # 进一步瘦身
#编译完成后测试执行
out/Default/chrome --no-sandbox --disable-gpu

如果要在vs code中编译,创建tasks.jos

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build-cotent-shell",
            "type": "shell",
            "command": "bash", 
            "args": [
                "-x",
                "-c",
                "ninja -C out/arm64 content_shell"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        }

    ]
}

在vs code中按command + shift + b 编译

1.5 合并为fat模式(同时支持x64和arm64)

1
2
3
4
5
6
7
% ninja -C out/release_x86_64 chrome
% ninja -C out/release_arm64 chrome
% mkdir out/release_universal
% chrome/installer/mac/universalizer.py \
      out/release_x86_64/Chromium.app \
      out/release_arm64/Chromium.app \
      out/release_universal/Chromium.app

1.6 调试

如果出现不允许附加进程调试的情况attach failed: Operation not permitted

1
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

打断点

1
breakpoint set -f inspector_overlay_agent.cc -l 627

1.6.1 前置条件

https://chromium.googlesource.com/chromium/src/+/main/docs/lldbinit.md

按上面这个链接设置完后,在命令行执行lldb 可以正常调试chromium里的程序

但在vs code使用codelldb扩展调试时不行,需要在 launch.json中设置加载脚本

1
2
3
4
5
6
7
        "initCommands": [
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py"
        ],
        "env": {
          "CHROME_LOG_FILE": "/tmp/chrome_debug.log",
          "CHROMIUM_LLDBINIT_SOURCED": "1",
        },

编译时,打开 is_debug ,关掉 is_official_build , symbol_level=2生成一下有调试符号的程序,才能调试

生成compile_command.json后, 设置到 IDE中, 用于ide符号跳转

调试时通过命令行传参 --no-sandbox ,关掉沙箱,否则调试可能会不正常

1.6.2 调试主进程

创建vs的调试用的launch.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "Debug Content Shell",
        "type": "lldb",
        "request": "launch",
        "program": "${workspaceFolder}/out/arm64/Content Shell.app/Contents/MacOS/Content Shell",
        "args": [
          "--no-sandbox",
          "--disable-logging",
          "--off-screen-rendering-enabled",
          "--v=0",
          "--remote-debugging-port=9222"
        ],
        "cwd": "${workspaceFolder}",
        "env": {
          "CHROME_LOG_FILE": "/tmp/chrome_debug.log",
          "CHROMIUM_LLDBINIT_SOURCED": "1",
        },

        "stopOnEntry": false, 
        "initCommands": [
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py",
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/chromium_visualizers.py"
        ],
        "postRunCommands": [
          "image list" // 可选:启动后列出加载的模块
        ]

        //"sourceMap": {
        //  "/b/s/w/ir/cache/src": "${workspaceFolder}" // 替换为调试信息中的源码路径
        //},


        //"preLaunchTask": "build", 
      }
    ]
  }

如果要在命令行使用lldb调度时传入参数

1
lldb -- out/arm64/Content\ Shell.app/Contents/MacOS/Content\ Shell -- --no-sandbox --disable-logging --off-screen-rendering-enabled --v=0 --remote-debugging-port=9222

1.6.3 调试子进程

调试子进程,只能使用附加进程的方式

1
2
lldb
(lldb) attach -p 12345

content shell 启动后,打开百度

使用 ps 观察启动了几个线程

1
2
ps aux|grep chromium
#启动了3个渲染进程,1个gpu进程,一个网络进程,一个存储进程

按需要附加进程即可

如果要用vs code调试,在launch.json中添加一个配置

在program中写入想调试的进程的路径,

如果只有一个进程,可以使用 "program": "path to executanble"指定 调试的程序路径,

或使用"processId": "${command:pickProcess}" 选择一个进程

如果有多个进程,只能使用"pid": "25951" 指定具体的pid 附加某个进程调试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
      {
        "name": "attach to Content Shell",
        "type": "lldb",
        "request": "attach",
        //"program": "${workspaceFolder}/out/arm64/Content Shell.app/Contents/MacOS/Content Shell",
        //"program": "${workspaceFolder}/out/arm64/Content Shell.app/Contents/Frameworks/Content Shell Framework.framework/Helpers/Content Shell Helper (Renderer).app/Contents/MacOS/Content Shell Helper (Renderer)",
        //"processId": "${command:pickProcess}",
        "pid": "25951",
        "cwd": "${workspaceFolder}",
        "initCommands": [
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py",
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/chromium_visualizers.py"
        ],
        "postRunCommands": [
          "image list" // 可选:启动后列出加载的模块
        ]

        //"sourceMap": {
        //  "/b/s/w/ir/cache/src": "${workspaceFolder}" // 替换为调试信息中的源码路径
        //},
      }

如果想自动附加调试, 设置

在主程序的配置中设置 "settings set target.process.follow-fork-mode child"并不能生效,因为设置这个需要先有断点信息,再设置settings set target.process.follow-fork-mode child

1
2
3
4
5
        "initCommands": [
            "settings set target.process.follow-fork-mode child",
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py",
            "command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/chromium_visualizers.py"
        ],

vs code有一个lldb的扩展,通过监视进程自动附加

https://marketplace.visualstudio.com/items?itemName=thebestnom.auto-attach-child-processes

或者手动在lldb 调试控制台录入settings set target.process.follow-fork-mode child

总结,还是自己使用lldb 控制台控制比较合理,因为如果有多个子进程, 用插件始终只能附加到第一个子进程

>> Home

Comments