1

我一直按照以下页面中详细说明的步骤为 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/***or生成的额外 deps 文件gn args out/***,我一直在寻找方法来尝试删除不需要的库以生成更小的 chrome 二进制文件。我试图修改在BUILD.GNchromium 目录的根目录中找到的根文件,将某些 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 输出文件大小的帮助或指导将不胜感激。

4

2 回答 2

1

看起来您正在构建 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
于 2021-01-08T17:44:32.010 回答
0

Chrome进程很大的原因是因为包含没有被取出的调试信息,我发现通过剥离调试信息的进程(即使在构建之后),我能够将它从190MB削减到102MB。

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

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

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

(这方面的知识归功于我的前辈)

于 2021-02-08T12:42:12.857 回答