Flutter Win平台下定制Flutter Engine

3,749 阅读3分钟

深入学习Flutter,研究Flutter Engine是必须的。Flutter官方已经发Engine抽离出来,供开发者定制修改,也方便大家学习,但是单纯的克隆The Flutter engine (github.com)的仓库并不能构建出引擎,它还缺少许多必要的第三方库。OK,话不多说,我们根据官方教程,开搞!

前置条件

  1. 你的git已经设置好了全局代理,git config --global http.proxy xxx

  2. 你的命令行已经设置好了代理,Win下使用set https_proxy=xxx进行临时设置代理

  3. 你的git已经配置好了ssh

1. 配置好Windows开发环境

  • Windows SDK

    建议下载Visual Studio 2019,勾选该负载,自动安装SDK。

image.png

安装完成后,在Windows设置的应用和功能找到SDK,点击修改。

image.png

Change,然后点击Next,勾选第一个Windows Performance Toolkit选项,最后应用更改。

image.png

image.png

  • 环境变量设置

//供depot tools使用的参数
DEPOT_TOOLS_WIN_TOOLCHAIN=0

//VS2019安装地址
GYP_MSVS_OVERRIDE_PATH="C:\Program Files (x86)/Microsoft Visual Studio/2019/Community" (or your location for Visual Studio)

//VS版本
GYP_MSVS_VERSION = 2019

//Windows SDK地址
WINDOWSSDKDIR="C:\Program Files (x86)\Windows Kits\10" (or your location for Windows Kits)
  • 启用长地址支持 打开PowerShell,输入下列指令。
  Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -Force

2. 下载部署工具depot_tools

depot_tools

建议设置环境变量,方便使用gclient指令。

3. 拉取引擎源码

  1. fork一份flutter engine官方的仓库

  2. 创建一个你想放置engine源码的文件夹,在文件夹内创建一个.gclient文件,文件内容如下,替换url为你刚刚fork的ssh对应的地址。

solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:<your_name_here>/engine.git",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]
  1. cd src/flutter,然后git pull upstream master

  2. 打开终端,在该目录下执行gclient sync命令(该命令包含git clone确保你的终端以及git已经设置好代理)。

  • 如果你有版本号需求,请先设置git reset --hard <token>,尖括号替换成commit标识符,一般在你下载的flutter SDK文件夹内,具体为flutter/bin/internal/engine.version,再使用gclient sync --with_branch_heads --with_tags进行拉取。

  • 如果遇到PythonFile报错,一般是代理没设置好

  • 成功拉取后的目录和终端应该是这样的

image.png

拉取速度取决于你的代理,文件大概15G左右。

4. 编译你的引擎

假设你已经对引擎进行了定制,或者添加文件并且配置了BUILD.gn的内容

  1. cd到src目录内

  2. 终端输入python .\flutter\tools\gn --unoptimized来准备build文件

    如果你好奇参数,gn help会告诉你答案

image.png

  1. 终端输入ninja -C .\out\<dir created by previous step>,上一个命令会在out目录生成一个新的文件夹,一般是host_debug_unopt,把尖括号的内容替换为该目录即可,然后开始编译,6000+的文件,耗时比较久。

5. 启动你的引擎

简简单单,有手就行。

flutter run --local-engine-src-path <拉取引擎仓库的src的文件夹的本地路径> --local-engine=<out生成的文件夹名称>

参考资料

Compiling the engine · flutter/flutter Wiki (github.com)

Setting up the Engine development environment · flutter/flutter Wiki (github.com)