Flutter引擎编译与调试

754 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

前提

  1. Mac可以编译Android、iOS产物,Linux可以编译Android产物,windows都不能编译(本篇以Mac编译,记录都是以此为前提)
  2. git工具
  3. Chromium depot_tools
安装方式: 
1. 选择一个目录例如 /Users/xxx/
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
2. 
export PATH=/Users/xxx/depot_tools:$PATH
  1. python环境
  2. curl和unzip工具
  3. xcode

下载源码

  1. 创建一个文件夹,命名为engine
cd engine
touch .gclient
  1. .gclient中填入
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:flutter/engine.git",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]

如果你fork了flutter/engine项目,上面的git@github.com:flutter/engine.git可以改为git@github.com:你的github名字/engine.git。 3. 执行gclient sync

执行这一步,国内很多用户会很慢,所以建议先下从https://github.com/flutter/engine下载好项目,然后把内容(不包括名称)复制到src/flutter下面,再执行gclient sync

  1. Android Java JDK,版本要1.8及以上

编译Android

目的:编译一个arm64版本的Android产物,可用于最简单的demo跑起来

准备构建文件

  1. 在engine/src目录下执行
./flutter/tools/gn --android --unoptimized --android-cpu=arm64
  • android:表示编译Android版本
  • unoptimized: 表示不优化产物大小,这样会提高编译速度
  • android-cpu: 表示打包的Android架构
  1. 编译主机端可执行文件
./flutter/tools/gn --unoptimized

这两步会在out文件夹中生成android_debug_unopt_arm64host_debug_unopt

编译产物

engine/src下执行

ninja -C out/android_debug_unopt_arm64

ninja -C out/host_debug_unopt

这两步才是真正构建过程,过程会花点时间。

使用本地引擎运行Flutter

  1. 修改pubspec.yaml文件 在文件中添加下面代码
dependency_overrides:
  sky_engine:
    path: <FLUTTER_ENGINE_ROOT>/engine/src/out/host_profile/gen/dart-pkg/sky_engine
  sky_services:
    path: <FLUTTER_ENGINE_ROOT>/engine/src/out/host_profile/gen/dart-pkg/sky_services
  1. 执行命令
flutter run --local-engine-src-path <FLUTTER_ENGINE_ROOT>/engine/src --local-engine=android_debug_unopt_arm64
  • local-engine-src-path:指定Flutter引擎存储库的路径,也就是src根目录的绝对路径
  • local-engine:指定使用哪个引擎版本,比如android_debug_unopt_arm64

使用vscode调试c++引擎代码

安装lldb

通过下面shell找到Android项目运行的pid

adb shell ps|grep com.example.xxx
  • com.example.xxx 表示安装的引用包
{
  "version": "0.2.0",
  "configurations": [
      {
          "name": "remote_lldb",
          "type": "lldb",
          "request": "attach",
          "pid": "输入pid", // 输入pid
          "initCommands": [
              "platform select remote-android",
              "platform connect unix-abstract-connect:///data/data/包名/debug.socket" // 输入包名
          ],
          "preRunCommands": [
              "settings append target.exec-search-paths xxx/engine/src/out/android_debug_unopt_arm64"  // 替换引擎地址
          ],
          "postRunCommands": [
              "settings set target.source-map xxx/engine/src xxx/engine/src" // 替换引擎地址
          ],
      }
  ]
}
  • 输入上面获取到的pid
  • 将包名替换上面的包名
  • 将打包后的引擎替换上面的地址
  • 将打包后的引擎地址替换上面的 xxx/engine/src,注意是要输入两次

F5启动VSCode,开始断点吧