前言
根據設置引擎開發環境的描述,確保有以下可用依賴項:
- 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章
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帳戶名
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目錄執行
../depot_tools/gclient sync
報錯如下,這是在win10系統下,這是不能訪問服務器導致
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這個文件,取消自動更新,添加如下變量
:: MODIFY: Disable automatic update!
set DEPOT_TOOLS_UPDATE=0
注意gclient是用python來運行的,如果是使用csdn上的包,一定要先安裝python,不然會一直卡住
然后再次報錯,這是在win10系統下,這也是不能訪問服務器導致
[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這些要先配置好
git clone https://chromium.googlesource.com/chromium/tools/depot_tools
下載完成之后,把depot_tools目錄添加到環境變量中,這樣可以隨時使用gclient命令
在depot_tools同級目錄創建engine目錄,在engine文件夾內創建.gclient文件,文件內容如下
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
"url": "https://github.com/flutter/engine.git@FLUTTER_ENGINE",
然后在engine目錄執行
gclient sync
之后是漫長的下載過程,下載完成后,depot_tools和engine壓縮成tar.gz大約是6.9G,下載過程中遇到一些小err,百度一下就能解決
另外,代碼下載完成后需要切換版本,進入engine/src/flutter,然后執行
git reset --hard b3af521a050e6ef076778bcaf16e27b2521df8f8
#或者直接切換分支,例如
git checkout flutter-2.5-candidate.5
然后返回engine目錄執行
gclient sync --with_branch_heads --with_tags
此時目錄結構大約是這樣的
.
├── 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的更新
export DEPOT_TOOLS_UPDATE=0
之后cd engine/src/flutter,設置engine更新源
git remote add upstream git@github.com:flutter/engine.git
需要更新的時候,在engine/src/flutter執行
git pull upstream master
gclient sync
最后編譯下,看看能否正常編譯
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 831msxxxx@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.stampxxxx@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路徑添加到環境變量中
.
├── 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,要注意網絡聯通
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.htmlOn 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作為顯示后端的時候才需要安裝
git clone git@github.com:sony/flutter-embedded-linux.git
該庫編譯依要求cmake3.10,可以下載安裝cmake最新版
也可以通過該命令安裝好依賴
sudo apt install clang cmake build-essential pkg-config libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev
sudo apt install libwayland-dev wayland-protocols
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/buildxxxx@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拷貝到該編譯目錄下
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