Flutter Engine编译环境安装

前言

根据设置引擎开发环境的描述,确保有以下可用依赖项:

  • Linux、macOS 或 Windows。
    • Linux 支持 Android 和 Fuchsia 的交叉编译工件,但不支持 iOS。
    • macOS 支持 Android 和 iOS 的交叉编译工件。
    • Windows 不支持任何 Android、Fuchsia 或 iOS 的交叉编译工件。
  • git(用于源代码版本控制)。
  • 一个IDE。另请参阅本页底部的部分,了解有关在编辑引擎时设置语法突出显示的建议。
  • 一个 ssh 客户端(用于通过 GitHub 进行身份验证)。
  • Chromium 的 depot_tools (确保它在你的路径中)。我们使用gclien tdepot_tools 中的工具。
  • Python(被我们许多工具使用,包括gclient)。
  • 在 macOS 和 Linux 上:curl 和 unzip(被gclient sync使用)。
  • 在 Windows 上:
    • Visual Studio 2017 或更高版本(仅非 Google 员工需要)。
    • Windows 10 SDK(仅非 Google 员工需要)。
      • 请务必安装"Windows 调试工具"功能。
  • 在 macOS 上:最新的 Xcode。
  • 推荐给 Google 员工:用于分布式构建的 Goma。该编译页有关于如何设置此详细信息。

不需要安装Dart,因为 Dart 工具链会作为"获取代码"步骤的一部分自动下载。类似的对于 Android SDK,它是通过以下gclient sync步骤下载的。

1 flutter engine

1.1 win10

根据flutter官方的wiki设置引擎开发环境,做好前置工作,主要是depot_tools的安装

depot_tools是Google专门为开发大项目开发的.git代码仓库管理的python脚本,统一管理整个源码仓库的所有依赖,depot_tools使用说明

但是给的链接不能访问,找到以下命令git下载depot_tools,但是这个仍然需要科学上网,这里可以直接看第1.2章

bash 复制代码
git clone https://chromium.googlesource.com/chromium/tools/depot_tools

用git下载好后,得到depot_tools文件夹,可以将depot_tools路径加到环境变量PATH

Fork https://github.com/flutter/engine到你自己的GitHub帐户

然后创建engine文件夹,在engine文件夹内创建.gclient文件,并且替换<your_name_here>为你的GitHub帐户名

python 复制代码
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:<your_name_here>/engine.git",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
    "custom_vars" : {
      "download_android_deps" : False,
      "download_windows_deps" : False,
    },
  },
]

然后在engine目录执行

bash 复制代码
../depot_tools/gclient sync

报错如下,这是在win10系统下,这是不能访问服务器导致

python 复制代码
Downloading CIPD client for windows-amd64 from https://chrome-infra-packages.appspot.com/client?platform=windows-amd64&version=git_revision:9464003f070813371070f9b8f7c350d87619d145...
Failed to download the file, check your network connection, 使用"2"个参数调用"DownloadFile"时发生异常:"无法连接到远程服务器"
Retrying after a short nap...
Failed to download the file, check your network connection, 使用"2"个参数调用"DownloadFile"时发生异常:"无法连接到远程服务器"
Retrying after a short nap...
Failed to download the file, check your network connection, 使用"2"个参数调用"DownloadFile"时发生异常:"无法连接到远程服务器"
所在位置 D:\depot_tools\.cipd_impl.ps1:112 字符: 5
+     throw "Failed to download the file, check your network connection ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (Failed to downl...异常:"无法连接到远程服务器":String) [], RuntimeException
    + FullyQualifiedErrorId : Failed to download the file, check your network connection, 使用"2"个参数调用"DownloadFile"时发生异常:"无法连接到远程服务器"

Failed to bootstrap or update CIPD client 

直接从CSDN下载别人整理好的包depot_tools_20210326_updated.7z

修改depot_tools/update_depot_tools.bat这个文件,取消自动更新,添加如下变量

bash 复制代码
:: MODIFY: Disable automatic update!
set DEPOT_TOOLS_UPDATE=0

注意gclient是用python来运行的,如果是使用csdn上的包,一定要先安装python,不然会一直卡住

然后再次报错,这是在win10系统下,这也是不能访问服务器导致

python 复制代码
[E2021-08-13T19:04:59.085262+08:00 22076 0 annotate.go:266]
original error: prpc: when sending request: Post "https://chrome-infra-packages.appspot.com/prpc/cipd.Repository/ResolveVersion": dial tcp 108.160.167.167:443:
connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

这里我放弃了,回家科学上网,直接在ubuntu 20.04.2.0中安装

1.2 ubuntu

科学上网加ubuntu 20.04.2.0版本,直接执行以下命令下载depot_tools,当然git这些要先配置好

bash 复制代码
git clone https://chromium.googlesource.com/chromium/tools/depot_tools

下载完成之后,把depot_tools目录添加到环境变量中,这样可以随时使用gclient命令

在depot_tools同级目录创建engine目录,在engine文件夹内创建.gclient文件,文件内容如下

python 复制代码
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:flutter/engine.git",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
    "custom_vars" : {
      "download_android_deps" : False,
      "download_windows_deps" : False,
    },
  },
]

还可以指定engine的版本,把url换成下面的,FLUTTER_ENGINE也就是commit id

如Flutter Stable 2.5.1 Engine的id就是b3af521a050e6ef076778bcaf16e27b2521df8f8

bash 复制代码
"url": "https://github.com/flutter/engine.git@FLUTTER_ENGINE",

然后在engine目录执行

bash 复制代码
gclient sync

之后是漫长的下载过程,下载完成后,depot_tools和engine压缩成tar.gz大约是6.9G,下载过程中遇到一些小err,百度一下就能解决

另外,代码下载完成后需要切换版本,进入engine/src/flutter,然后执行

bash 复制代码
git reset --hard b3af521a050e6ef076778bcaf16e27b2521df8f8
#或者直接切换分支,例如
git checkout flutter-2.5-candidate.5

然后返回engine目录执行

bash 复制代码
gclient sync --with_branch_heads --with_tags

此时目录结构大约是这样的

python 复制代码
.
├── depot_tools
│   ├── bootstrap
│   ├── bootstrap-2@3.8.10.chromium.20_bin
│   ├── gclient
│   ├── git-cache
│   ├── gn
│   ├── ninja
│   ├── third_party
│   ├── update_depot_tools
│   ├── ...
├── engine
    ├── _bad_scm
    └── src

下载之后,以后如果没有网络,可以设置环境变量DEPOT_TOOLS_UPDATE,取消depot_tools的更新

bash 复制代码
export DEPOT_TOOLS_UPDATE=0

之后cd engine/src/flutter,设置engine更新源

bash 复制代码
git remote add upstream git@github.com:flutter/engine.git

需要更新的时候,在engine/src/flutter执行

bash 复制代码
git pull upstream master
gclient sync

最后编译下,看看能否正常编译

bash 复制代码
xxxx@Exdroid88:~/flutter-workspace/engine/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.
Generating GN files in: out/host_debug_unopt
Generating compile_commands took 102ms
Done. Made 870 targets from 253 files in 831ms

xxxx@Exdroid88:~/flutter-workspace/engine/src$ ../../depot_tools/ninja -C out/host_debug_unopt
ninja: Entering directory `out/host_debug_unopt'
[6026/6026] STAMP obj/default.stamp

xxxx@Exdroid88:~//flutter-workspace/engine/src/out/host_debug_unopt$ find ./ -name \*.so
./lib.unstripped/libflutter_linux_gtk.so
./lib.unstripped/libGLESv2.so
./lib.unstripped/libflutter_linux_glfw.so
./lib.unstripped/libEGL.so
./lib.unstripped/libflutter_engine.so
./libflutter_linux_gtk.so
./libGLESv2.so
./libflutter_linux_glfw.so
./libEGL.so
./libflutter_engine.so    

2 flutter

根据flutter linux install的描述安装即可,我是直接下载flutter_linux_2.2.3-stable.tar.xz,解压后目录如下,可以把flutter/bin路径添加到环境变量中

bash 复制代码
.
├── depot_tools
│   ├── bootstrap
│   ├── bootstrap-2@3.8.10.chromium.20_bin
│   ├── gclient
│   ├── git-cache
│   ├── gn
│   ├── ninja
│   ├── third_party
│   ├── update_depot_tools
│   ├── ...
├── engine
    ├── _bad_scm
    └── src
├── flutter
│   ├── analysis_options.yaml
│   ├── AUTHORS
│   ├── bin
│   ├── CODE_OF_CONDUCT.md
│   ├── CODEOWNERS
│   ├── CONTRIBUTING.md
│   ├── dartdoc_options.yaml
│   ├── dev
│   ├── examples
│   ├── flutter_console.bat
│   ├── flutter_root.iml
│   ├── LICENSE
│   ├── packages
│   ├── PATENT_GRANT
│   ├── README.md
│   ├── SECURITY.md
│   └── versio

然后执行下面命令,注意flutter doctor执行时也需要访问github,要注意网络联通

bash 复制代码
xxxx@Exdroid88:~/flutter-workspace/flutter/bin$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.2.3, on Linux, locale zh_CN.UTF-8)
[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
[☠] Linux toolchain - develop for Linux desktop (the doctor check crashed)
    ✗ Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues.
    ✗ ProcessException: Failed to find "clang++" in the search path.
        Command: clang++
[!] Android Studio (not installed)
[✓] Connected device (1 available)

! Doctor found issues in 4 categories.

xxxx@Exdroid88:~/flutter-workspace/flutter/bin$ flutter precache
xxxx@Exdroid88:~/flutter-workspace/flutter/bin$ flutter config --enable-linux-desktop
Setting "enable-linux-desktop" value to "true".

You may need to restart any open editors for them to read new settings.

3 flutter-embedded-linux

flutter-embedded-linux需要使用Wayland作为显示后端的时候才需要安装

bash 复制代码
git clone git@github.com:sony/flutter-embedded-linux.git

该库编译依要求cmake3.10,可以下载安装cmake最新版

也可以通过该命令安装好依赖

bash 复制代码
sudo apt install clang cmake build-essential pkg-config libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev
sudo apt install libwayland-dev wayland-protocols
bash 复制代码
xxxx@Exdroid88:~/flutter-workspace$ cd flutter-embedded-linux/
xxxx@Exdroid88:~/flutter-workspace/flutter-embedded-linux$ mkdir build/
xxxx@Exdroid88:~/flutter-workspace/flutter-embedded-linux/build$ cd build/
xxxx@Exdroid88:~/flutter-workspace/flutter-embedded-linux/build$ cp ../../engine/src/out/host_debug_unopt/libflutter_engine.so ./
xxxx@Exdroid88:~/flutter-workspace/flutter-embedded-linux/build$ cmake -DUSER_PROJECT_PATH=examples/flutter-wayland-client -DCMAKE_BUILD_TYPE=Release ..
-- The CXX compiler identification is Clang 10.0.0
-- The C compiler identification is Clang 10.0.0
-- Check for working CXX compiler: /usr/bin/clang++
-- Check for working CXX compiler: /usr/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Check for working C compiler: /usr/bin/clang
-- Check for working C compiler: /usr/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
User project: examples/flutter-wayland-client
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1")
-- Checking for module 'egl'
--   Found egl, version 1.5
-- Checking for module 'xkbcommon'
--   Found xkbcommon, version 0.10.0
-- Checking for module 'wayland-protocols'
--   Found wayland-protocols, version 1.20
-- Checking for module 'wayland-client>=1.16.0'
--   Found wayland-client, version 1.18.0
-- Checking for module 'wayland-cursor>=1.16.0'
--   Found wayland-cursor, version 1.18.0
-- Checking for module 'wayland-egl>=1.16.0'
--   Found wayland-egl, version 18.1.0
-- Checking for module 'glesv2'
--   Found glesv2, version 3.2
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/d/flutter-workspace/flutter-embedded-linux/build

xxxx@Exdroid88:~/flutter-workspace/flutter-embedded-linux/build$ cmake --build .
[  1%] Generating ../src/third_party/wayland/protocols/presentation-time-protocol.h
[  3%] Generating ../src/third_party/wayland/protocols/xdg-shell-client-protocol.h
[  5%] Generating ../src/third_party/wayland/protocols/xdg-shell-protocol.c
[  6%] Generating ../src/third_party/wayland/protocols/text-input-unstable-v1-client-protocol.h
[  8%] Generating ../src/third_party/wayland/protocols/text-input-unstable-v1-protocol.c
[ 10%] Generating ../src/third_party/wayland/protocols/text-input-unstable-v3-client-protocol.h
[ 11%] Generating ../src/third_party/wayland/protocols/text-input-unstable-v3-protocol.c
[ 13%] Generating ../src/third_party/wayland/protocols/presentation-time-protocol.c
Scanning dependencies of target flutter-client
[ 15%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/flutter_elinux.cc.o
[ 16%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.cc.o
[ 18%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.cc.o
[ 20%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/flutter_project_bundle.cc.o
[ 22%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/task_runner.cc.o
[ 23%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/system_utils.cc.o
[ 25%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/logger.cc.o
[ 27%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/external_texture_gl.cc.o
[ 28%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/vsync_waiter.cc.o
[ 30%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/flutter_elinux_texture_registrar.cc.o
[ 32%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/keyboard_glfw_util.cc.o
[ 33%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/key_event_plugin.cc.o
[ 35%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/lifecycle_plugin.cc.o
[ 37%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/mouse_cursor_plugin.cc.o
[ 38%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/navigation_plugin.cc.o
[ 40%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/platform_plugin.cc.o
[ 42%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/platform_views_plugin.cc.o
[ 44%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/plugins/text_input_plugin.cc.o
[ 45%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/surface/context_egl.cc.o
[ 47%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/surface/egl_utils.cc.o
[ 49%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/surface/elinux_egl_surface.cc.o
[ 50%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/surface/surface_base.cc.o
[ 52%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/surface/surface_gl.cc.o
[ 54%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/surface/surface_decoration.cc.o
[ 55%] Building C object CMakeFiles/flutter-client.dir/src/third_party/wayland/protocols/xdg-shell-protocol.c.o
[ 57%] Building C object CMakeFiles/flutter-client.dir/src/third_party/wayland/protocols/text-input-unstable-v1-protocol.c.o
[ 59%] Building C object CMakeFiles/flutter-client.dir/src/third_party/wayland/protocols/text-input-unstable-v3-protocol.c.o
[ 61%] Building C object CMakeFiles/flutter-client.dir/src/third_party/wayland/protocols/presentation-time-protocol.c.o
[ 62%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/elinux_window_wayland.cc.o
[ 64%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/native_window_wayland.cc.o
[ 66%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/native_window_wayland_decoration.cc.o
[ 67%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/renderer/shader.cc.o
[ 69%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/renderer/shader_context.cc.o
[ 71%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/renderer/shader_program.cc.o
[ 72%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/renderer/window_decoration_button.cc.o
[ 74%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/renderer/window_decoration_titlebar.cc.o
[ 76%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/linux_embedded/window/renderer/window_decorations_wayland.cc.o
[ 77%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/text_input_model.cc.o
[ 79%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/json_message_codec.cc.o
[ 81%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/json_method_codec.cc.o
[ 83%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/engine_switches.cc.o
[ 84%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/incoming_message_dispatcher.cc.o
[ 86%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/client_wrapper/engine_method_result.cc.o
[ 88%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/client_wrapper/standard_codec.cc.o
[ 89%] Building CXX object CMakeFiles/flutter-client.dir/src/flutter/shell/platform/common/client_wrapper/plugin_registrar.cc.o
[ 91%] Building CXX object CMakeFiles/flutter-client.dir/src/client_wrapper/flutter_engine.cc.o
[ 93%] Building CXX object CMakeFiles/flutter-client.dir/src/client_wrapper/flutter_view_controller.cc.o
[ 94%] Building CXX object CMakeFiles/flutter-client.dir/examples/flutter-wayland-client/flutter/generated_plugin_registrant.cc.o
[ 96%] Building CXX object CMakeFiles/flutter-client.dir/examples/flutter-wayland-client/flutter_window.cc.o
[ 98%] Building CXX object CMakeFiles/flutter-client.dir/examples/flutter-wayland-client/main.cc.o
[ 99%] Linking CXX executable flutter-client
[100%] Built target flutter-client

如果报错下面的错,那么就是没有把上一步编译生成的libflutter_engine.so拷贝到该编译目录下

bash 复制代码
make[2]: *** No rule to make target 'libflutter_engine.so', needed by 'flutter-client'.  Stop.
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/flutter-client.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

这一步编译产物有flutter-client

相关推荐
problc9 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
lqj_本人18 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
lqj_本人21 小时前
Flutter&鸿蒙next 状态管理框架对比分析
flutter·华为·harmonyos
起司锅仔1 天前
Flutter启动流程(2)
flutter
hello world smile1 天前
最全的Flutter中pubspec.yaml及其yaml 语法的使用说明
android·前端·javascript·flutter·dart·yaml·pubspec.yaml
lqj_本人1 天前
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
flutter·harmonyos
iFlyCai1 天前
极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果
flutter
lqj_本人1 天前
Flutter&鸿蒙next 中使用 MobX 进行状态管理
flutter·华为·harmonyos
lqj_本人1 天前
Flutter&鸿蒙next 中的 setState 使用场景与最佳实践
flutter·华为·harmonyos
hello world smile1 天前
Flutter常用命令整理
android·flutter·移动开发·android studio·安卓