Chromium Linux ARM Build - 如何减小构建的 Chrome 二进制文件的大小?

问题描述

我一直在按照以下页面中详述的步骤为 Linux ARM 设备交叉编译和构建 Chromium (v87):https://chromium.googlesource.com/chromium/src/+/master/docs/linux/build_instructions.md

我已成功为 ARM 目标构建了 chrome 二进制文件,但我现在的目标是尝试减小成功构建后给出的 chrome 二进制输出的大小。目前,chrome 二进制文件的大小为 190mb,考虑到多年前执行的先前的 Chromium (v70) 构建的 chrome 二进制文件输出大小为 ~80mb,这太大了。

我相信尺寸急剧增加可能是由于较新的 Chromium 版本中包含大量依赖项,这意味着 gn gen out/***gn args out/*** 生成了额外的 deps 文件,我一直在寻找尝试的方法删除不需要的库以生成较小的 chrome 二进制文件。我试图修改在 Chromium 目录根目录中找到的根文件 BUILD.GN,将某些 vars 设置为 false 以尝试阻止 gn 命令添加不需要的库/依赖项 deps 文件,但这仍然会导致相同的要放置在我的构建输出文件夹中并执行 autoninja -C out/*** chrome 以构建 chrome 的依赖文件数量会导致再次给出一个大的 chrome 二进制文件 (190mb):

# copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This is the root build file for GN. GN will start processing by loading this
# file,and recursively load all dependencies until all dependencies are either
# resolved or kNown not to exist (which will cause the build to fail). So if
# you add a new build file,there must be some path of dependencies from this
# file to your new one or GN won't kNow about it.

import("//build/config/chromeos/ui_mode.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/features.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
import("//build/gn_logs.gni")
import("//build/util/generate_wrapper.gni")
import("//chrome/browser/buildflags.gni")
import("//chrome/browser/media/router/features.gni")
import("//components/nacl/features.gni") 
import("//device/vr/buildflags/buildflags.gni")  
import("//extensions/buildflags/buildflags.gni")
import("//gpu/vulkan/features.gni") 
import("//media/gpu/args.gni")
import("//media/media_options.gni")
import("//remoting/remoting_enable.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/openh264/openh264_args.gni")
import("//tools/ipc_fuzzer/ipc_fuzzer.gni")
import("//ui/base/ui_features.gni")
import("//ui/gl/features.gni")
import("//v8/gni/snapshot_toolchain.gni") 
import("//v8/gni/v8.gni")

#Variable declarations in an attempt to stop building certain dependencies/packages:
#enable_openscreen   = false
#enable_remoting     = false
#enable_nacl         = false
#media_use_ffmpeg    = false
#use_openh264        = false
#enable_vulkan       = false
#enable_ipc_fuzzer   = false
#enable_vr           = false

下面是我用来构建 190mb 铬二进制文件args.gn 参数:

target_cpu="arm"
arm_version=7
target_os="linux"
arm_arch="armv7-a"
arm_float_abi="hard"
arm_fpu="neon"
arm_tune="cortex-a9"
arm_use_neon=true
arm_use_thumb=true
use_alsa=false
use_jumbo_build=true
use_gnome_keyring=false
is_debug = false
symbol_level = 0
enable_nacl = false
blink_symbol_level=0
# Set build arguments here. See `gn help buildargs`.

任何有关如何减小 chrome 输出文件大小的帮助或指导将不胜感激。

解决方法

看起来您正在构建 Chromium 的调试版本。如果您想要更小的可执行文件或将其分发给最终用户,您应该构建发布版本。

您可以按照以下步骤构建 Chromium 的发布版本:

来自 src 目录

gn args out/YourBuildFolder

它将在编辑器中打开 args.gn。在该编辑器中粘贴以下一个或多个标志:

is_debug = false # Release version

# Other optional flags for reducing executable size
symbol_level = 0 # You won't be able to debug your app from source,if it's level is 0. It's range: 0-2
blink_symbol_level=0 # No symbols from the Blink rendering engine

保存该文件并关闭编辑器。 GN 将相应地准备构建文件夹并通过执行以下命令再次开始编译:

ninja -C out/YourBuildFolder chrome

仅供参考,您可以通过执行以下命令查看目标的所有支持的构建标志:

gn args out/YourBuildFolder --list
,

Chrome进程之所以大,是因为包含调试信息没有被取出,我发现通过剥离调试信息的进程(即使是在构建之后),我也可以将其剪下来从 190MB 到 102MB。

strip 实用程序可作为主机 GNU 工具链的一部分但是如果 chrome 进程是为另一个平台(在我的情况下为 ARM)交叉编译的,那么我们需要使用交叉编译器工具链的等效项strip 实用程序来实现这一点。目前我不确定是否有一个参数可以在 args.gn 中用于构建目录,以便在构建 chrome 期间执行此操作。

(例如)当我使用工具链 fs-toolchain-8.3-armv7ahf 为我的设备构建时,程序 arm-linux-strip 等效于 em>fs-toolchain-8.3-armv7ahf/bin/arm-linux-strip。添加程序的 PATH 位置并将目录更改为我的 chrome 进程所在的位置后,我可以运行以下命令来去除 chrome:

arm-linux-strip -o chrome_stripped chrome (-o 表示将 chrome 的剥离版本存储为 chrome_stripped 而不影响原始文件)。

(此知识归功于我的前辈)