Windows编译Flutter引擎

总结:编译出现的各种问题,几乎全是第一步的编译工具下载及环境配置没有正常完成引起。一般来说源码下载不会出现什么问题,但编译工具往往不能成功下载,以及DEPS配置的hooks任务未能正常执行,导致编译过程提示各种缺失及其他异常,如package_config.json文件不存在等。

编译所需物料主要为以下3部分:

  • 源码
  • 编译工具:编译使用,如gn、ninja等
  • 初始化脚本:生成一些编译依赖的配置文件

一、同步代码阶段

1、配置命令行代理

flutter相关的仓库都是google服务器,国内不能正常访问,需配置命令行代理。配置好后可在命令行访问http地址、git仓库。注意要使用cmd.exe,使用powershell可能会出现一些莫名其妙的问题。

set http_proxy=http://127.0.0.1:1189
set http_proxy=https://127.0.0.1:1189

2、同步代码

官方给出的教程比较麻烦,将引擎的仓库clone到自己的仓库,并配置ssh等,这个是没有必须的,直接使用flutter引擎的git仓库即可。另外在git仓库源码下载完成后再回退到指定的commitId,这样操作需要下载全部的git记录,会浪费大量的下载时间及磁盘空间。
为加快下载速度,可直接指定要下载的引擎commitId,如当前flutter最新稳定版本为3.7.1,安装后可以从安装目录下的bin\internal\engine.version文件中看到引擎的commitId,我们可以以此引擎为基线下载引擎源码。另外可使用--no-history只clone指定commitId的一层代码,防止将分支所有记录都下载到本地。

  1. 命令行创建.gclient文件并指明要下载的仓库地址
# 配置flutter仓库地址,同时指明要clone的commitId
gclient config https://github.com/flutter/engine.git@800594f1f4a6674010a6f1603c07a919b4d7ebd7
  1. 手动修改.gclient文件内容。将name值修改成源码存放路径src/flutter
solutions = [
  { 
  	"name"        : 'src/flutter',
    "url"         : 'https://github.com/flutter/engine.git@800594f1f4a6674010a6f1603c07a919b4d7ebd7',
    "deps_file"   : 'DEPS',
    "managed"     : False,
    "custom_deps" : {
    },
    "custom_vars": {},
  },
]
  1. 同步代码
gclient sync --no-history -v

二、生成编译脚本阶段

1、编译步骤

1、环境配置

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community

2、生成编译脚本

.\flutter\tools\gn --no-full-dart-sdk --no-build-web-sdk --unoptimized --verbose

2、相关异常

未设备set DEPOT_TOOLS_WIN_TOOLCHAIN=0

C:\Users\client\Downloads\engine2\src>flutter\tools\gn --unoptimized
GOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA.
Using prebuilt Dart SDK binary. If you are editing Dart sources and wish to compile the Dart SDK, set `--no-prebuilt-dart-sdk`.
Generating GN files in: out\host_debug_unopt
Toolchain is out of date. Run "gclient runhooks" to update the toolchain, or set DEPOT_TOOLS_WIN_TOOLCHAIN=0 to use the locally installed toolchain.
Traceback (most recent call last):
  File "C:/Users/client/Downloads/engine2/src/build/vs_toolchain.py", line 560, in <module>
    sys.exit(main())
  File "C:/Users/client/Downloads/engine2/src/build/vs_toolchain.py", line 556, in main
    return commands[sys.argv[1]](*sys.argv[2:])
  File "C:/Users/client/Downloads/engine2/src/build/vs_toolchain.py", line 533, in GetToolchainDir
    runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
  File "C:/Users/client/Downloads/engine2/src/build/vs_toolchain.py", line 71, in SetEnvironmentAndGetRuntimeDllDirs
    update_result = Update(no_download=True)
  File "C:/Users/client/Downloads/engine2/src/build/vs_toolchain.py", line 504, in Update
    subprocess.check_call(get_toolchain_args)
  File "C:\depot_tools\.cipd_bin\3.8\bin\Lib\subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['C:\\Users\\client\\.vpython-root\\7b2594\\Scripts\\python.exe', 'C:\\depot_tools\\win_toolchain\\get_toolchain_if_necessary.py', '--output-json', 'C:\\Users\\client\\Downloads\\engine2\\src\\build\\win_toolchain.json', '1023ce2e82', '--no-download']' returned non-zero exit status 1.
ERROR at //build/config/win/visual_studio_version.gni:27:7: Script returned non-zero exit code.
      exec_script("//build/vs_toolchain.py", [ "get_toolchain_dir" ], "scope")
      ^----------
Current dir: C:/Users/client/Downloads/engine2/src/out/host_debug_unopt/
Command: C:/Users/client/.vpython-root/7b2594/Scripts/python.exe C:/Users/client/Downloads/engine2/src/build/vs_toolchain.py get_toolchain_dir
Returned 1.
See //build/toolchain/win/BUILD.gn:19:1: whence it was imported.
import("//build/config/win/visual_studio_version.gni")
^----------------------------------------------------
See //BUILD.gn:5:1: which caused the file to be included.
group("default") {
^------------------

未设置Visual Studio编译环境

未设置set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community

C:\Users\client\Downloads\engine2\src>flutter\tools\gn --unoptimized --no-prebuilt-dart-sdk
GOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA.
Generating GN files in: out\host_debug_unopt
Traceback (most recent call last):
  File "C:/Users/client/Downloads/engine2/src/build/toolchain/win/setup_toolchain.py", line 156, in <module>
    main()
  File "C:/Users/client/Downloads/engine2/src/build/toolchain/win/setup_toolchain.py", line 123, in main
    args = _SetupScript(cpu, win_sdk_path)
  File "C:/Users/client/Downloads/engine2/src/build/toolchain/win/setup_toolchain.py", line 73, in _SetupScript
    return [os.path.normpath(os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
  File "C:\Users\client\.vpython-root\7b2594\lib\os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'GYP_MSVS_OVERRIDE_PATH'
ERROR at //build/toolchain/win/BUILD.gn:34:18: Script returned non-zero exit code.
toolchain_data = exec_script("setup_toolchain.py",
                 ^----------
Current dir: C:/Users/client/Downloads/engine2/src/out/host_debug_unopt/
Command: C:/Users/client/.vpython-root/7b2594/Scripts/python.exe C:/Users/client/Downloads/engine2/src/build/toolchain/win/setup_toolchain.py "C:\Program Files (x86)/Microsoft Visual Studio/2019/Community" "C:\Program Files (x86)\Windows Kits\10" "C:\windows\System32;C:\windows\SysWOW64;Arm64Unused" x64
Returned 1.
See //BUILD.gn:5:1: which caused the file to be included.
group("default") {
^------------------

没有dart预编译的可执行程序,引发assert失败

C:/Users/client/Downloads/engine2/src/third_party/dart/tools/sdks/dart-sdk/bin/dart.exe

C:\Users\client\Downloads\engine2\src>flutter\tools\gn --unoptimized --prebuilt-dart-sdk
GOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA.
Using prebuilt Dart SDK binary. If you are editing Dart sources and wish to compile the Dart SDK, set `--no-prebuilt-dart-sdk`.
Generating GN files in: out\host_debug_unopt
ERROR at //third_party/dart/build/dart/dart_action.gni:102:3: Assertion failed.
  assert(_is_fuchsia || prebuilt_dart_exe_works,
  ^-----
A pre built dart executable needs to be present
See //third_party/dart/build/dart/dart_action.gni:181:3: whence it was called.
  _prebuilt_tool_action(target_name) {
  ^------------------------------------
See //third_party/dart/utils/compile_platform.gni:43:3: whence it was called.
  prebuilt_dart_action(target_name) {
  ^-----------------------------------
See //flutter/lib/snapshot/BUILD.gn:315:1: whence it was called.
compile_platform("strong_platform") {
^-------------------------------------
See //flutter/BUILD.gn:73:22: which caused the file to be included.
    public_deps += [ "//flutter/lib/snapshot:generate_snapshot_bins" ]
                     ^----------------------------------------------

三、编译阶段

1、编译命令

ninja -C out/host_debug_unopt

2、相关异常

没有package_config.json文件

在低版本如2.2.0源码中dart/.dart_tool/package.config.json是存在的,但在高版本中不再存在,需要执行相关脚本生成,这些脚本本应在gclient下载完源码及工具后执行,但由于一些环境等未知因素导致脚本没有被正确执行,此package.config.json文件没有被生成。为生成此文件,可以手动执行相关脚本即可。此脚本配置信息位于src/flutter/DEPS文件中,搜索关键字hooks,

pc> C:\Users\client\Downloads\engine2\src> ninja -C out/host_debug_unopt
ninja: error: '../../third_party/dart/.dart_tool/package_config.json', needed by 'vm_outline_strong.dill', missing and no known rule to make it
ninja: Entering directory `out/host_debug_unopt'

没有成功下载编译工具

src/third_party/dart目录下没有buildtools/windows-x64/clang/bin/clang-cl.exe文件。原因是使用gclient sync同步时没有把编译工具成功同步到本地,失败原因是生成的下载地址https://chrome-infra-packages.appspot.com/flutter/dart-sdk/windows-arm64@git_revision:6fb1982e93c3da7b5458db9838a6fd67d379c329是错误的

C:\Users\client\Downloads\engine2\src>ninja -C out/host_debug_unopt
ninja: Entering directory `out/host_debug_unopt'
[5/6920] CXX obj/flutter/fml/command_line.command_line.obj
FAILED: obj/flutter/fml/command_line.command_line.obj
ninja -t msvc -e environment.x64 -- ../../buildtools/windows-x64/clang/bin/clang-cl.exe  /nologo /showIncludes @obj/flutter/fml/command_line.command_line.obj.rsp /c ../../flutter/fml/command_line.cc /Foobj/flutter/fml/command_line.command_line.obj /Fdobj/flutter/fml/command_line_cc.pdb
ninja: fatal: CreateProcess: 系统找不到指定的文件。

dart语法不兼容,不能正常识别

出现dart语法不兼容的原因是预编译的SDK版本下载错误(自己手动下载放置的),以及package_config.json文件配置错误(从其他项目copy过来的package.json文件)。

C:\Users\client\Downloads\engine3\src>ninja -C out/host_debug_unopt
ninja: Entering directory `out/host_debug_unopt'
[1455/6920] ACTION //third_party/dart/runtime/observatory:build_observatory(//build/toolchain/win:clang_x64)
FAILED: gen/third_party/dart/runtime/observatory/observatory/web/main.dart.js gen/third_party/dart/runtime/observatory/observatory/web/main.dart.js.map
C:/Users/client/.vpython-root/7b2594/Scripts/python.exe ../../third_party/dart/build/gn_run_binary.py compiled_action C:/Users/client/Downloads/engine3/src/third_party/dart/tools/sdks/dart-sdk/bin/dart.exe --dfe=C:/Users/client/Downloads/engine3/src/third_party/dart/tools/sdks/dart-sdk/bin/snapshots/kernel-service.dart.snapshot compile js -o C:/Users/client/Downloads/engine3/src/out/host_debug_unopt/gen/third_party/dart/runtime/observatory/observatory/web/main.dart.js --packages=C:/Users/client/Downloads/engine3/src/third_party/dart/.dart_tool/package_config.json --no-sound-null-safety C:/Users/client/Downloads/engine3/src/third_party/dart/runtime/observatory/web/main.dart --enable-asserts
Command failed: C:\Users\client\Downloads\engine3\src\third_party\dart\tools\sdks\dart-sdk\bin\dart.exe --dfe=C:/Users/client/Downloads/engine3/src/third_party/dart/tools/sdks/dart-sdk/bin/snapshots/kernel-service.dart.snapshot compile js -o C:/Users/client/Downloads/engine3/src/out/host_debug_unopt/gen/third_party/dart/runtime/observatory/observatory/web/main.dart.js --packages=C:/Users/client/Downloads/engine3/src/third_party/dart/.dart_tool/package_config.json --no-sound-null-safety C:/Users/client/Downloads/engine3/src/third_party/dart/runtime/observatory/web/main.dart --enable-asserts
output: Info: Compiling without sound null safety!
Dart 3 will only support sound null safety, see https://dart.dev/null-safety
../../third_party/dart/third_party/pkg/stack_trace/lib/src/chain.dart:182:22:
Error: Member not found: 'parseVM'.
          .map(Trace.parseVM));
                     ^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/chain.dart:186:50:
Error: Member not found: 'parseFriendly'.
    return Chain(chain.split(chainGap).map(Trace.parseFriendly));
                                                 ^^^^^^^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:160:57:
Error: Member not found: 'parseVM'.
    var frames = lines.take(lines.length - 1).map(Frame.parseVM).toList();
                                                        ^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:167:12:
Error: A value of type 'List<dynamic>' can't be returned from a function with return type 'List<Frame>'.
 - 'List' is from 'dart:core'.
 - 'Frame' is from 'package:stack_trace/src/frame.dart' ('../../third_party/dart/third_party/pkg/stack_trace/lib/src/frame.dart').
    return frames;
           ^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:180:28:
Error: Member not found: 'parseV8'.
                .map(Frame.parseV8),
                           ^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:189:28:
Error: Member not found: 'parseV8'.
                .map(Frame.parseV8),
                           ^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:205:28:
Error: Member not found: 'parseFirefox'.
                .map(Frame.parseFirefox),
                           ^^^^^^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:223:28:
Error: Member not found: 'parseFirefox'.
                .map(Frame.parseFirefox),
                           ^^^^^^^^^^^^
../../third_party/dart/third_party/pkg/stack_trace/lib/src/trace.dart:239:32:
Error: Member not found: 'parseFriendly'.
                    .map(Frame.parseFriendly),
                               ^^^^^^^^^^^^^
Error: Compilation failed.

[1464/6920] CXX obj/third_party/dart/runtime/platform/libdart_platform_jit.utils_macos.obj
ninja: build stopped: subcommand failed.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值