admin管理员组

文章数量:1530842

文章目录

  • 1. gn工具生成
    • 1.1 问题,找不到last_commit_position.h文件
      • 问题描述如下:
      • 解决方法
    • 1.2 ninja文件不是对应架构问题
      • 问题描述:
      • 解决方法
    • 1.3 问题3:clang++找不到
      • 问题描述
      • 解决方法
  • 2. electron 编译参数生成
    • 2.1 下载对应版本debian_bullseye_arm64-sysroot
      • 错误描述
      • 解决方法
    • 2.2 node找不到
    • 2.3 electron版本找不到
  • 3. electron ninja编译
    • 3.1 electron版本问题
    • 3.2 node版本不对
    • 3.3 npm找不到
    • 3.4 ModuleNotFoundError: No module named '_bz2'
    • 3.5 python3错误
    • 3.6 FileNotFoundError: [Errno 2] No such file or directory: 'gperf': 'gperf'
    • 3.7 运行时崩溃
      • 错误原因:
      • 修改办法:
    • 3.8 ModuleNotFoundError: No module named 'importlib_metadata'
    • 3.9 crp打包平台,打包arm版本错误

1. gn工具生成

在arm64下需要构建对应架构的gn文件。
源代码下载,并且切换到对应的版本。
将代码同步到electron/src/tools/gn目录中

git clone https://gn.googlesource/gn
cd gn
git checkout 5a004f9427a0

将gn源码放在src/tools/gn目录下,内容如下图

1.1 问题,找不到last_commit_position.h文件

问题描述如下:

执行命令,以下命令用于生成gn文件

./tools/gn/bootstrap/bootstrap.py --skip-generate-buildfiles
Traceback (most recent call last):
  File "/data/home/uos/electron/src/./tools/gn/bootstrap/bootstrap.py", line 143, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/data/home/uos/electron/src/./tools/gn/bootstrap/bootstrap.py", line 124, in main
    shutil.copy2(
  File "/usr/local/python3.9.17/lib/python3.9/shutil.py", line 444, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/usr/local/python3.9.17/lib/python3.9/shutil.py", line 264, in copyfile
    with open(src, 'rb') as fsrc:
FileNotFoundError: [Errno 2] No such file or directory: '/data/home/uos/electron/src/tools/gn/bootstrap/last_commit_position.h'

解决方法

cd gn 
build/gen.py

在out目录下会生成last_commit_position.h文件,将该文件拷贝到electron/src/tools/gn/bootstrap目录中。

1.2 ninja文件不是对应架构问题

问题描述:

因为在PATH中使用了depot_tools的地址,因此在执行脚本./tools/gn/bootstrap/bootstrap.py --skip-generate-buildfiles时,使得ninja使用depot_tools中的ninja.py这个文件,这个文件会指定使用
electron/src/third_party/ninja/ninja中的文件,electron/src/third_party/ninja/ninja这个文件时一个amd64架构的文件因此造成错误。

 ./tools/gn/bootstrap/bootstrap.py --skip-generate-buildfiles
Traceback (most recent call last):
  File "/home/uos/depot_tools/ninja.py", line 94, in <module>
    sys.exit(main(sys.argv))
  File "/home/uos/depot_tools/ninja.py", line 87, in main
    return subprocess.call([ninja_path] + args[1:])
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 349, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 1837, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/data/home/uos/electron/src/third_party/ninja/ninja'
Traceback (most recent call last):
  File "/data/home/uos/electron/src/./tools/gn/bootstrap/bootstrap.py", line 143, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/data/home/uos/electron/src/./tools/gn/bootstrap/bootstrap.py", line 129, in main
    subprocess.check_call(cmd)
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 373, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['ninja', '-C', '/data/home/uos/electron/src/out/Release/gn_build', '-w', 'dupbuild=err', 'gn']' returned non-zero exit status 1.

解决方法

在PATH中移除depot_tools地址
安装ninja-build

sudo apt install ninja-build

查看ninja版本

1.3 问题3:clang++找不到

问题描述

执行命令,找不到clang++

./tools/gn/bootstrap/bootstrap.py --skip-generate-buildfiles

爆出错误如下

ninja: Entering directory `/data/home/uos/electron/src/out/Release/gn_build'
[1/195] CXX src/base/command_line.o
FAILED: src/base/command_line.o 
clang++ -MMD -MF src/base/command_line.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/command_line -o src/base/command_line.o
/bin/sh: 1: clang++: not found
[2/195] CXX src/base/environment.o
FAILED: src/base/environment.o 
clang++ -MMD -MF src/base/environment.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/environment -o src/base/environment.o
/bin/sh: 1: clang++: not found
[3/195] CXX src/base/files/file.o
FAILED: src/base/files/file.o 
clang++ -MMD -MF src/base/files/file.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/file -o src/base/files/file.o
/bin/sh: 1: clang++: not found
[4/195] CXX src/base/files/file_enumerator.o
FAILED: src/base/files/file_enumerator.o 
clang++ -MMD -MF src/base/files/file_enumerator.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/file_enumerator -o src/base/files/file_enumerator.o
/bin/sh: 1: clang++: not found
[5/195] CXX src/base/files/file_path.o
FAILED: src/base/files/file_path.o 
clang++ -MMD -MF src/base/files/file_path.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/file_path -o src/base/files/file_path.o
/bin/sh: 1: clang++: not found
[6/195] CXX src/base/files/file_path_constants.o
FAILED: src/base/files/file_path_constants.o 
clang++ -MMD -MF src/base/files/file_path_constants.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/file_path_constants -o src/base/files/file_path_constants.o
/bin/sh: 1: clang++: not found
[7/195] CXX src/base/files/file_util.o
FAILED: src/base/files/file_util.o 
clang++ -MMD -MF src/base/files/file_util.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/file_util -o src/base/files/file_util.o
/bin/sh: 1: clang++: not found
[8/195] CXX src/base/files/scoped_file.o
FAILED: src/base/files/scoped_file.o 
clang++ -MMD -MF src/base/files/scoped_file.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/scoped_file -o src/base/files/scoped_file.o
/bin/sh: 1: clang++: not found
[9/195] CXX src/base/files/scoped_temp_dir.o
FAILED: src/base/files/scoped_temp_dir.o 
clang++ -MMD -MF src/base/files/scoped_temp_dir.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/files/scoped_temp_dir -o src/base/files/scoped_temp_dir.o
/bin/sh: 1: clang++: not found
[10/195] CXX src/base/json/json_parser.o
FAILED: src/base/json/json_parser.o 
clang++ -MMD -MF src/base/json/json_parser.o.d -I../../../tools/gn/src -I. -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -DNDEBUG -O3 -fdata-sections -ffunction-sections -Werror -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -pthread -pipe -fno-exceptions -fno-rtti -fdiagnostics-color -Wall -Wextra -Wno-unused-parameter -Wextra-semi -Wundef -std=c++17 -Wrange-loop-analysis -Wextra-semi-stmt -c ../../../tools/gn/src/base/json/json_parser -o src/base/json/json_parser.o
/bin/sh: 1: clang++: not found
ninja: build stopped: subcommand failed.
Traceback (most recent call last):
  File "/data/home/uos/electron/src/./tools/gn/bootstrap/bootstrap.py", line 143, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/data/home/uos/electron/src/./tools/gn/bootstrap/bootstrap.py", line 129, in main
    subprocess.check_call(cmd)
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 373, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['ninja', '-C', '/data/home/uos/electron/src/out/Release/gn_build', '-w', 'dupbuild=err', 'gn']' returned non-zero exit status 1.

解决方法

编译对应版本的LLVM
编译方法查看文章
https://arv000.blog.csdn/article/details/135367062
将安装的文件替换
third_party/llvm-build/Release+Asserts
内容如下图:

设置clang地址

export PATH=$PATH:/data/home/uos/electron/src/third_party/llvm-build/Release+Asserts/bin

注意执行./tools/gn/bootstrap/bootstrap.py --skip-generate-buildfiles前需要将out/Release/gn_build文件删除。

2. electron 编译参数生成

2.1 下载对应版本debian_bullseye_arm64-sysroot

错误描述

执行命令

out/Release/gn gen out/Release --args="import(\"//electron/build/args/release.gn\")"

错误提示:

ERROR at //build/config/sysroot.gni:62:7: Assertion failed.
      assert(
      ^-----
Missing sysroot (//build/linux/debian_bullseye_arm64-sysroot). To fix, run: build/linux/sysroot_scripts/install-sysroot.py --arch=arm64                                                                              
See //build/config/sysroot.gni:63:11: 
          exec_script("//build/dir_exists.py",
          ^-----------------------------------
This is where it was set.                                                                                                                                                                                            
See //third_party/rust/cxx/chromium_integration/rust_cxx.gni:7:1: whence it was imported.
import("//build/config/sysroot.gni")
^----------------------------------
See //build/rust/rust_target.gni:12:3: whence it was imported.                                                                                                                                                       
  import("//third_party/rust/cxx/chromium_integration/rust_cxx.gni")
  ^----------------------------------------------------------------
See //build/rust/rust_static_library.gni:5:1: whence it was imported.                                                                                                                                                
import("//build/rust/rust_target.gni")
^------------------------------------
See //testing/test.gni:14:1: whence it was imported.                                                                                                                                                                 
import("//build/rust/rust_static_library.gni")
^--------------------------------------------
See //testing/libfuzzer/fuzzer_test.gni:9:1: whence it was imported.                                                                                                                                                 
import("//testing/test.gni")
^--------------------------
See //media/media_options.gni:12:1: whence it was imported.                                                                                                                                                          
import("//testing/libfuzzer/fuzzer_test.gni")
^-------------------------------------------
See //BUILD.gn:28:1: whence it was imported.                                                                                                                                                                         
import("//media/media_options.gni")
^---------------------------------

解决方法

方法一:(推荐)
查看electron/script/sysroots.json内容

地址需要自己拼装拿到下载地址
https://dev-cdn.electronjs/linux-sysroots/2354ab6674a0725d0c4f304b47f908eba6e3b8c7/debian_bullseye_arm64_sysroot.tar.xz
将debian_bullseye_arm64_sysroot.tar.xz放在
方法二:
执行脚本

build/linux/sysroot_scripts/install-sysroot.py --arch=arm64

会自动下载,并且安装

2.2 node找不到

执行命令

out/Release/gn gen out/Release --args="import(\"//electron/build/args/release.gn\")"

错误提示如下:

ERROR at //electron/BUILD.gn:110:20: Script returned non-zero exit code.
electron_version = exec_script("script/print-version.py",
                   ^----------
Current dir: /home/uos/electron/src/out/Release/                                                                                                                                                                     
Command: python3 /home/uos/electron/src/electron/script/print-version.py
Returned 1.
stderr:

Traceback (most recent call last):
  File "/home/uos/electron/src/electron/script/print-version.py", line 3, in <module>
    print(get_electron_version())
  File "/home/uos/electron/src/electron/script/lib/util.py", line 144, in get_electron_version
    cached_electron_version = str.strip(execute([
  File "/home/uos/electron/src/electron/script/lib/util.py", line 122, in execute
    output = subprocess.check_output(argv, stderr=subprocess.STDOUT,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 505, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 1837, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'node'

See //electron/build/args/all.gn:2:21: which caused the file to be included.
root_extra_deps = [ "//electron" ]
                    ^-----------

2.3 electron版本找不到

问题原因
由于我删除了原来.git文件,导致无法通过git命令获取版本,因此需要修改关于版本获取的代码问题。
执行脚本

out/Release/gn gen out/Release --args="import(\"//electron/build/args/release.gn\")"

错误提示:

ERROR at //electron/BUILD.gn:110:20: Script returned non-zero exit code.
electron_version = exec_script("script/print-version.py",
                   ^----------
Current dir: /home/uos/electron/src/out/Release/                                                                                                                                                                     
Command: python3 /home/uos/electron/src/electron/script/print-version.py
Returned 1 and printed out:

b"<Buffer 66 61 74 61 6c 3a 20 e6 b2 a1 e6 9c 89 e5 8f 91 e7 8e b0 e5 90 8d e7 a7 b0 ef bc 8c e6 97 a0 e6 b3 95 e6 8f 8f e8 bf b0 e4 bb bb e4 bd 95 e4 b8 9c e8 ... >\n/home/uos/electron/src/electron/script/lib/get-version.js:19\n    throw new Error('Failed to get current electron version');\n    ^\n\nError: Failed to get current electron version\n    at Object.module.exports.getElectronVersion (/home/uos/electron/src/electron/script/lib/get-version.js:19:11)\n    at [eval]:1:37\n    at Script.runInThisContext (vm.js:122:20)\n    at Object.runInThisContext (vm.js:329:38)\n    at Object.<anonymous> ([eval]-wrapper:6:22)\n    at Module._compile (internal/modules/cjs/loader.js:778:30)\n    at evalScript (internal/bootstrap/node.js:590:27)\n    at startup (internal/bootstrap/node.js:265:9)\n    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)\n"

stderr:

Traceback (most recent call last):
  File "/home/uos/electron/src/electron/script/print-version.py", line 3, in <module>
    print(get_electron_version())
  File "/home/uos/electron/src/electron/script/lib/util.py", line 144, in get_electron_version
    cached_electron_version = str.strip(execute([
  File "/home/uos/electron/src/electron/script/lib/util.py", line 129, in execute
    raise e
  File "/home/uos/electron/src/electron/script/lib/util.py", line 122, in execute
    output = subprocess.check_output(argv, stderr=subprocess.STDOUT,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['node', '-p', 'require("./script/lib/get-version").getElectronVersion()']' returned non-zero exit status 1.

See //electron/build/args/all.gn:2:21: which caused the file to be included.
root_extra_deps = [ "//electron" ]
                    ^-----------

解决方案
修改src/electron/script/lib/get-version.js直接返回版本

3. electron ninja编译

3.1 electron版本问题

3.2 node版本不对

由于在arm架构下编译,他的原始对应的架构是amd架构导致node的架构不匹配,需要下载对应的架构进行替换。

下载对应版本的node
https://nodejs/download/release/v16.3.0/
替换掉/home/uos/electron/src/third_party/node/linux/node-linux-x64内容

OSError: [Errno 8] Exec format error: '/home/uos/electron/src/third_party/node/linux/node-linux-x64/bin/node'

建议amd64版本也替换,因为在真实构架环境是docker环境,里面可能没有对应的node,在原始的代码中,只有node没有npm等相关内容。

3.3 npm找不到

执行命令

ninja  -C  out/Release electron

错误信息如下:

ninja: Entering directory `out/Release'
[588/44261] ACTION //electron:npm_pre_flight_default_app_js(//build/toolchain/linux:clang_arm64)
FAILED: gen/electron/npm_pre_stamps/npm_pre_flight_default_app_js.stamp 
python3 ../../electron/build/npm-run.py --silent pre-flight -- --stamp /home/uos/electron/src/out/Release/gen/electron/npm_pre_stamps/npm_pre_flight_default_app_js.stamp
Traceback (most recent call last):
  File "/home/uos/electron/src/out/Release/../../electron/build/npm-run.py", line 16, in <module>
    subprocess.check_output(args, stderr=subprocess.STDOUT)
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 505, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 1837, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'npm'
[597/44261] CXX obj/third_party/swiftshader/third_party/SPIRV-Tools/spvtools_opt/folding_rules.o
ninja: build stopped: subcommand failed.

处理办法

export PATH=/home/uos/electron/src/third_party/node/linux/node-linux-x64/bin:$PATH

3.4 ModuleNotFoundError: No module named ‘_bz2’

由于切换了python版本导致的,其实系统版本3.7.3就可以使用不需要进行过切换,切换版本的原因是因为需要下载代码导致。
操作系统使用的时3.7.3版本我自己修改了版本python3.9,其实没有必要更换

ninja: Entering directory `out/Release'
[25/43654] ACTION //electron:generate_config_gypi(//build/toolchain/linux:clang_arm64)
FAILED: gen/config.gypi 
python3 ../../electron/script/generate-config-gypi.py /home/uos/electron/src/out/Release/gen/config.gypi arm64
Traceback (most recent call last):
  File "/home/uos/electron/src/electron/../third_party/electron_node/configure.py", line 14, in <module>
    import bz2
  File "/usr/local/python3.9.17/lib/python3.9/bz2.py", line 18, in <module>
    from _bz2 import BZ2Compressor, BZ2Decompressor
ModuleNotFoundError: No module named '_bz2'
Traceback (most recent call last):
  File "/home/uos/electron/src/out/Release/../../electron/script/generate-config-gypi.py", line 69, in <module>
    sys.exit(main(sys.argv[1], sys.argv[2]))
  File "/home/uos/electron/src/out/Release/../../electron/script/generate-config-gypi.py", line 50, in main
    run_node_configure(target_cpu)
  File "/home/uos/electron/src/out/Release/../../electron/script/generate-config-gypi.py", line 28, in run_node_configure
    subprocess.check_call([sys.executable, configure] + args)
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 373, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/uos/electron/src/electron/../third_party/electron_node/configure.py', '--dest-cpu', 'arm64', '--experimental-enable-pointer-compression', '--openssl-no-asm']' returned non-zero exit status 1.
[34/43654] CXX obj/skia/skia_core_and_effects/GlyphRun.o
ninja: build stopped: subcommand failed.
  1. 找到lib-dynload位置
sudo find / -name lib-dynload
  1. 拷贝文件
    ·
cd /usr/lib/python3.7/lib-dynload
sudo cp _bz2.cpython-37m-aarch64-linux-gnu.so  /usr/local/python3.9.17/lib/python3.9/lib-dynload
cd  /usr/local/python3.9.17/lib/python3.9/lib-dynload
sudo mv _bz2.cpython-37m-aarch64-linux-gnu.so _bz2.cpython-39-aarch64-linux-gnu.so
sudo chmod +x _bz2.cpython-39-aarch64-linux-gnu.so 

3.5 python3错误

切换会原来的版本3.7.3系统版本

inja: Entering directory `out/Release'
[23/43608] ACTION //electron:generate_config_gypi(//build/toolchain/linux:clang_arm64)
FAILED: gen/config.gypi 
python3 ../../electron/script/generate-config-gypi.py /home/uos/electron/src/out/Release/gen/config.gypi arm64
Traceback (most recent call last):
  File "/home/uos/electron/src/out/Release/../../electron/script/generate-config-gypi.py", line 69, in <module>
    sys.exit(main(sys.argv[1], sys.argv[2]))
  File "/home/uos/electron/src/out/Release/../../electron/script/generate-config-gypi.py", line 50, in main
    run_node_configure(target_cpu)
  File "/home/uos/electron/src/out/Release/../../electron/script/generate-config-gypi.py", line 28, in run_node_configure
    subprocess.check_call([sys.executable, configure] + args)
  File "/usr/local/python3.9.17/lib/python3.9/subprocess.py", line 373, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/uos/electron/src/electron/../third_party/electron_node/configure.py', '--dest-cpu', 'arm64', '--experimental-enable-pointer-compression', '--openssl-no-asm']' died with <Signals.SIGBUS: 7>.
[32/43608] CXX obj/skia/skia_core_and_effects/SkPathWriter.o
ninja: build stopped: subcommand failed.

解决办法:

cd /usr/bin
sudo rm -rf python3
sudo ln -s python3.7 python3

3.6 FileNotFoundError: [Errno 2] No such file or directory: ‘gperf’: ‘gperf’

ninja: Entering directory `out/Release'
[406/43577] ACTION //electron:generate_config_gypi(//build/toolchain/linux:clang_arm64)
WARNING: --openssl-no-asm will result in binaries that do not take advantage
         of modern CPU cryptographic instructions and will therefore be slower.
         Please refer to BUILDING.md
WARNING: warnings were emitted in the configure phase
INFO: configure completed successfully
[4786/43577] ACTION //third_party/blink/renderer/core:make_core_generated_css_value_keywords(//build/toolchain/linux:clang_arm64)
FAILED: gen/third_party/blink/renderer/core/css_value_keywords gen/third_party/blink/renderer/core/css_value_keywords.h 
python3 ../../third_party/blink/renderer/build/scripts/run_with_pythonpath.py -I ../../third_party/blink/renderer/build/scripts -I ../../third_party -I ../../tools ../../third_party/blink/renderer/build/scripts/core/css/make_css_value_keywords.py ../../third_party/blink/renderer/core/css/css_value_keywords.json5 --output_dir gen/third_party/blink/renderer/core --gperf gperf
Traceback (most recent call last):
  File "/home/uos/electron/src/third_party/blink/renderer/build/scripts/gperf.py", line 29, in generate_gperf
    universal_newlines=True)
  File "/usr/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'gperf': 'gperf'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "../../third_party/blink/renderer/build/scripts/core/css/make_css_value_keywords.py", line 83, in <module>
    json5_generator.Maker(CSSValueKeywordsWriter).main()
  File "/home/uos/electron/src/third_party/blink/renderer/build/scripts/json5_generator.py", line 345, in main
    writer.write_files(args.output_dir)
  File "/home/uos/electron/src/third_party/blink/renderer/build/scripts/json5_generator.py", line 303, in write_files
    self._write_file_if_changed(output_dir, generator(), file_name)
  File "/home/uos/electron/src/third_party/blink/renderer/build/scripts/gperf.py", line 71, in generator_internal
    return generate_gperf(gperf_path, gperf_input, gperf_args)
  File "/home/uos/electron/src/third_party/blink/renderer/build/scripts/gperf.py", line 53, in generate_gperf
    127, cmd, output='Command not found.')
subprocess.CalledProcessError: Command '['gperf', '--key-positions=*', '-P', '-n', '-m', '50', '-D', '-Q', 'CSSValueStringPool']' returned non-zero exit status 127.
[4795/43577] ACTION //third_party/blink/renderer/bindings:web_idl_database(//build/toolchain/linux:clang_arm64)
ninja: build stopped: subcommand failed.

解决方案:

sudo  apt install gperf

3.7 运行时崩溃

执行命令

uos@uos-PC:~/electron/src/out/Release$ ./electron --no-sandbox --disable-gpu 

崩溃信息如下:

Electron 25.9.8 - Build cross platform desktop apps with JavaScript, HTML, and CSS
Usage: electron [options] [path]

A path to an Electron app may be specified. It must be one of the following:
  - index.js file.
  - Folder containing a package.json file.
  - Folder containing an index.js file.
  - .html/.htm file.
  - http://, https://, or file:// URL.

Options:
  -i, --interactive     Open a REPL to the main process.
  -r, --require         Module to preload (option can be repeated).
  -v, --version         Print the version.
  -a, --abi             Print the Node ABI version.
[20266:0109/165301.051713:ERROR:object_proxy(590)] Failed to call method: org.freedesktop.portal.Settings.Read: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.portal.Desktop was not provided by any .service files
*** stack smashing detected ***: <unknown> terminated
Received signal 6
#0 0xaaaadaf6fac8 base::debug::CollectStackTrace()
#1 0xaaaadaf31ea4 base::debug::StackTrace::StackTrace()
#2 0xaaaadaf31e44 base::debug::StackTrace::StackTrace()
#3 0xaaaadaf6f908 base::debug::(anonymous namespace)::StackDumpSignalHandler()
#4 0xffff8c9e5698 ([vdso]+0x697)
#5 0xffff8ad0c884 gsignal
#6 0xffff8acfa968 abort
#7 0xffff8ad46868 (/usr/lib/aarch64-linux-gnu/libc-2.28.so+0x6c867)
#8 0xffff8adbab24 (/usr/lib/aarch64-linux-gnu/libc-2.28.so+0xe0b23)
#9 0xffff8adbaad8 __stack_chk_fail
#10 0xaaaadaf7bd3c __stack_chk_fail
#11 0xaaaae7f8617c content::RenderFrameImpl::PrepareFrameForCommit()
#12 0xaaaae7f851f0 content::RenderFrameImpl::CommitNavigationWithParams()
#13 0xaaaae7fbd74c base::internal::FunctorTraits<>::Invoke<>()
#14 0xaaaae7fbd480 base::internal::InvokeHelper<>::MakeItSo<>()
#15 0xaaaae7fbd2a0 base::internal::Invoker<>::RunImpl<>()
#16 0xaaaae7fbd0a4 base::internal::Invoker<>::RunOnce()
#17 0xaaaae7fa05e8 base::OnceCallback<>::Run()
#18 0xaaaae7f840f4 content::RenderFrameImpl::CommitNavigation()
#19 0xaaaae80a1644 content::NavigationClient::CommitNavigation()
#20 0xaaaad1b4254c content::mojom::NavigationClientStubDispatch::AcceptWithResponder()
#21 0xaaaae80a2ba4 content::mojom::NavigationClientStub<>::AcceptWithResponder()
#22 0xaaaadb6182c8 mojo::InterfaceEndpointClient::HandleValidatedMessage()
#23 0xaaaadb617eec mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept()
#24 0xaaaadb639e60 mojo::MessageDispatcher::Accept()
#25 0xaaaadb61a2d0 mojo::InterfaceEndpointClient::HandleIncomingMessage()
#26 0xaaaadc1e5d0c IPC::(anonymous namespace)::ChannelAssociatedGroupController::AcceptOnEndpointThread()
#27 0xaaaadc1d7f80 base::internal::FunctorTraits<>::Invoke<>()
#28 0xaaaadc1d7ec8 base::internal::InvokeHelper<>::MakeItSo<>()
#29 0xaaaadc1d7e4c base::internal::Invoker<>::RunImpl<>()
#30 0xaaaadc1d7db0 base::internal::Invoker<>::RunOnce()
#31 0xaaaacc5f21a4 base::OnceCallback<>::Run()
#32 0xaaaadaddf730 base::TaskAnnotator::RunTaskImpl()
#33 0xaaaadae459a0 base::TaskAnnotator::RunTask<>()
#34 0xaaaadae4568c base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl()
#35 0xaaaadae44c74 base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork()
#36 0xaaaadacb0fcc base::MessagePumpDefault::Run()
#37 0xaaaadae46014 base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run()
#38 0xaaaadad5fdb8 base::RunLoop::Run()
#39 0xaaaae811dc28 content::RendererMain()
#40 0xaaaacd461250 content::RunZygote()
#41 0xaaaacd461998 content::RunOtherNamedProcessTypeMain()
#42 0xaaaacd462c48 content::ContentMainRunnerImpl::Run()
#43 0xaaaacd45ed4c content::RunContentProcess()
#44 0xaaaacd45f37c content::ContentMain()
#45 0xaaaacc5e13f4 main
#46 0xffff8acfada4 __libc_start_main
#47 0xaaaacc5af034 (/home/uos/electron/src/out/Release/electron+0xe0a3033)
[end of stack trace]

错误原因:

由于c++编译时传递编译参数stack-protector使得对运行时对栈强制检测,因此导致崩溃。修改编译参数只是避免了不检测,但是不是完全的解决问题,需要找到对应的代码进行检测。

修改办法:

修改config/compiler/BUILD.gn内容
修改为

 cflags += [ "-fstack-protector" ]
 cflags += [ "-fno-stack-protector" ]

3.8 ModuleNotFoundError: No module named ‘importlib_metadata’

问题,因为缺少python3的依赖,我使用的python版本是3.7.3默认不携带这个包。

Traceback (most recent call last):
  File "../../third_party/blink/renderer/bindings/scripts/generate_bindings.py", line 12, in 
    import bind_gen
  File "/build/org.deepin.electron-0.0.2/src/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py", line 36, in 
    from .callback_function import generate_callback_functions
  File "/build/org.deepin.electron-0.0.2/src/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py", line 8, in 
    from .blink_v8_bridge import blink_class_name
  File "/build/org.deepin.electron-0.0.2/src/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py", line 8, in 
    from .code_node import FormatNode
  File "/build/org.deepin.electron-0.0.2/src/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py", line 13, in 
    from .mako_renderer import MakoRenderer
  File "/build/org.deepin.electron-0.0.2/src/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py", line 7, in 
    import mako.runtime
  File "/build/org.deepin.electron-0.0.2/src/third_party/mako/mako/mako/runtime.py", line 14, in 
    from mako import compat
  File "/build/org.deepin.electron-0.0.2/src/third_party/mako/mako/mako/compat.py", line 68, in 
    import importlib_metadata  # noqa
ModuleNotFoundError: No module named 'importlib_metadata'

解决方案有两种,
方案一:

  1. 安装python的依赖包就可以了。

方案二:
由于我们操作系统在打包编译的时候使用的纯净环境,不允许下载因此我只能修改代码的方式解决这个问题。
修改python脚本使其是依赖importlib_metadata


3.9 crp打包平台,打包arm版本错误

python3 ../../mojo/public/tools/mojom/mojom_parser.py --input-root ../.. --input-root gen --output-root gen --mojom-file-list=gen/mojo/public/mojom/base/base__parser.rsp --check-imports gen/mojo/public/mojom/base/base.build_metadata --enable-feature file_path_is_string --enable-feature is_posix --enable-feature is_linux --add-module-metadata webui_module_path=chrome://resources/mojo/mojo/public/mojom/base
Traceback (most recent call last):
  File "../../mojo/public/tools/mojom/mojom_parser.py", line 496, in 
    Run(sys.argv[1:])
  File "../../mojo/public/tools/mojom/mojom_parser.py", line 491, in Run
    args.enabled_features, module_metadata, allowed_imports)
  File "../../mojo/public/tools/mojom/mojom_parser.py", line 305, in _ParseMojoms
    for mojom_abspath, ast in _Shard(_ParseAstHelper, map_args):
  File "../../mojo/public/tools/mojom/mojom_parser.py", line 245, in _Shard
    pool = multiprocessing.Pool(processes=processes)
  File "/usr/lib/python3.7/multiprocessing/context.py", line 119, in Pool
    context=self.get_context())
  File "/usr/lib/python3.7/multiprocessing/pool.py", line 158, in __init__
    self._setup_queues()
  File "/usr/lib/python3.7/multiprocessing/pool.py", line 251, in _setup_queues
    self._inqueue = self._ctx.SimpleQueue()
  File "/usr/lib/python3.7/multiprocessing/context.py", line 112, in SimpleQueue
    return SimpleQueue(ctx=self.get_context())
  File "/usr/lib/python3.7/multiprocessing/queues.py", line 332, in __init__
    self._rlock = ctx.Lock()
  File "/usr/lib/python3.7/multiprocessing/context.py", line 67, in Lock
    return Lock(ctx=self.get_context())
  File "/usr/lib/python3.7/multiprocessing/synchronize.py", line 162, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)
  File "/usr/lib/python3.7/multiprocessing/synchronize.py", line 59, in __init__
    unlink_now)
OSError: [Errno 38] Function not implemented

由于打包平台是linux环境隔离的,在打包环境中,缺少了/dev/shm共享内存的挂在,导致python3版本多线程无法使用。
方法一:
更新python脚本的版本,使用python3
方法二:
chatgpt答案:没有经过验证

在 Docker 中,你可以通过在容器中创建一个共享内存的挂载点,将宿主机上的 /dev/shm 挂载到容器内部。这可以通过在运行容器时使用 -v 选项来实现。以下是具体步骤:

docker run -v /dev/shm:/dev/shm your_image

这个命令将宿主机的 /dev/shm 目录挂载到容器内的相同路径。这样,在容器内部对 /dev/shm 的访问将实际上是对宿主机上的 /dev/shm 的访问。

请注意,在默认情况下,Docker 容器是可以访问宿主机的 /dev/shm 的,因此这样的挂载可能并不总是必需的。如果你的应用程序没有特殊的需求,可能无需手动挂载。

如果你想要设置更多的共享内存大小,可以通过在 Docker run 命令中使用 --shm-size 选项来指定大小。例如:

docker run --shm-size=1g your_image

上述命令将设置容器的共享内存大小为 1GB。你可以根据实际需求调整这个值。

本文标签: 架构长征路electron