预备东西

下载和编译源码需求用到 gclient/ninja, 它们包含在 depot_tools 东西集中.

  1. 经过 git 下载复制 depot_tools 仓库
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    
  2. 将 depot_tools 途径添加到 PATH 环境变量中, 便于后续直接运用
    export PATH=/path/to/depot_tools:$PATH
    

下载源码

同步代码

  1. 创建 engine 目录, 并在 engine 目录中添加 .gclient 文件:
    solutions = [
      {
        "managed": False,
        "name": "src/flutter",
        "url": "https://github.com/flutter/engine.git",
        "custom_deps": {},
        "deps_file": "DEPS",
        "safesync_url": "",
      },
    ]
    
  2. 履行 gclinet sync 指令, 等完同步完结.

切换分支

一般情况下是要阅览和编译与 flutter sdk 关联的引擎代码.

  1. 履行 cat path/to/flutter/bin/internal/engine.version 指令检查引擎 git-hash.
  2. 进入 src/flutter 目录中, 履行 git checkout <git-hash>.
  3. 履行 gclient sync -D 指令, 等候同步完结.

编译源码

同步完的代码会保存在 src/flutter 目录中, 接下来的构建操作都会在 src 目录下进行. flutter 支撑在多个渠道上运转, 针对不同的渠道会生成不同的产物.

生成构建文件

在开端构建任务前, 需求经过 gn 指令生成构建前所需的文件. 以构建 android-arm 引擎为例, 需求预备 android-armhost 的构建文件.

  • android-arm: ./flutter/tools/gn --target-os android --android-cpu arm --runtime-mode debug --unoptimized --no-goma
  • host: ./flutter/tools/gn --runtime-mode debug --unoptimized --no-goma

指令参数:

  • target-os: 指定方针渠道, 支撑 android,ios,mac,linux,fuchsia,wasm,win.
  • android-cpu: 方针渠道为 android 时, 指定方针 abi. 支撑 arm,x64,x86,arm64.
  • runtime-mode: 指定运转模式, 支撑 debug,profile,release,jit_release.
  • unoptimized: 关闭优化, 提升构建速度, 在编译 release 产物时不要运用.
  • no-goma: gomaGoogle 内部运用的分布式构建东西, 默许会启用该东西, 需求经过 --no-goma 禁用.

履行构建操作

运用 gn 指令会在 out 目录下生成对应的构建文件, 接着运用 ninja 指令开端指定渠道的构建任务.

  • android-arm: ninja -C out/android_debug_unopt
  • host: ninja -C out/host_debug_unopt

调试源码

代码跳转补全

引荐运用 vscode 进行代码阅览与修改.

c++

  1. 装置插件: clangd.
  2. compile_commands.json 添加到 src/flutter 目录下:
    ln -s ../out/android_debug_unopt/compile_commands.json .
    
  3. 用 vscode 翻开 src/flutter 目录.

Java

  1. 装置插件: Extension Pack for Java.
  2. android 相关的代码在 shell/platform/android 目录中, 在该目录下添加 .vscode/settings.json 文件装备依靠途径:
    {
      "java.project.sourcePaths": [
        "."
      ],
      "java.project.referencedLibraries": [
        "path/to/engine/src/third_party/android_embedding_dependencies/lib/*.jar",
        "path/to/engine/src/third_party/android_tools/sdk/platforms/android-33/android.jar",
      ],
    }
    
  3. 用 vscode 翻开 shell/platform/android 目录.

运用本地引擎

运用 flutter 指令时, 经过 --target-platform--local-engine 参数能够指定运用本地编译的引擎, 以编译 apk 为例:

flutter build apk \
--debug \
--target-platform=android-arm \
--local-engine-src-path=path/to/engine/src \
--local-engine=android_debug_unopt

断点调试代码

  1. 装置插件: CodeLLDB.
  2. 在设备上运转待调试的使用.
  3. 在设备中运转 lldb-server:
    adb push path/to/lldb-server /data/local/tmp
    adb shell run-as <package-id> sh -c "cp -F /data/local/tmp/lldb-server /data/data/<package-id>/lldb-server"
    adb shell run-as <package-id> sh -c "/data/data/<package-id>/lldb-server platform --server --listen unix-abstract:///data/data/<package-id>/debug.socket"
    

    参数:

    • lldb-server: 该东西在 path/to/ndk/toolchains/llvm/prebuilt/<host>/lib64/clang/<clang-version>/lib/linux/<abi> 目录中能够找到.
    • package-id: 待调试的使用包名.
  4. 在 vscode 的 launcher.json 新增 debug 装备:
    {
       "version": "0.2.0",
       "configurations": [
           {
               "name": "flutter_lldb",
               "type": "lldb",
               "request": "attach",
               "pid": <package-pid>,
               "initCommands": [
                   "platform select remote-android",
                   "platform connect unix-abstract-connect:///data/data/<package-id>/debug.socket"
               ],
               "postRunCommands": [
                   "target symbols add path/to/src/out/<local-engine>/libflutter.so"
               ]
           }
       ]
     }
    

    参数:

    • package-pid: 待调试使用的进程号, 能够经过 adb shell pidof <package-id> 获取.
    • package-id: 待调试的使用包名.
    • local-engine: 同 flutter build 中的参数.
  5. 在 vscode 挑选 flutter_lldb 装备并运转.

参考资料

  • Setting up the Engine development environment
  • Compiling the engine
  • Flutter‘s modes
  • Using a locally-built engine with thefluttertool
  • Remote Debugging