Flutter引擎编译与调试
前提
- Mac可以编译Android、iOS产物,Linux可以编译Android产物,windows都不能编译(本篇以Mac编译,记录都是以此为前提)
- git工具
- 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
2
3
4
5
2
3
4
5
- python环境
- curl和unzip工具
- xcode
下载源码
- 创建一个文件夹,命名为
engine
cd engine
touch .gclient
1
2
2
- 在
.gclient
中填入
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "[email protected]:flutter/engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
如果你fork了flutter/engine项目,上面的[email protected]:flutter/engine.git
可以改为[email protected]:你的github名字/engine.git
。
3. 执行gclient sync
执行这一步,国内很多用户会很慢,所以建议先下从https://github.com/flutter/engine
下载好项目,然后把内容(不包括名称)复制到src/flutter
下面,再执行gclient sync
- Android Java JDK,版本要1.8及以上
编译Android
目的:编译一个arm64版本的Android产物,可用于最简单的demo跑起来
准备构建文件
- 在engine/src目录下执行
./flutter/tools/gn --android --unoptimized --android-cpu=arm64
1
- android:表示编译Android版本
- unoptimized: 表示不优化产物大小,这样会提高编译速度
- android-cpu: 表示打包的Android架构 如想编译macos的
./flutter/tools/gn --unoptimized --mac --mac-cpu=x64 -j 16
1
- 编译主机端可执行文件
./flutter/tools/gn --unoptimized -j 16
1
这两步会在out
文件夹中生成android_debug_unopt_arm64
和host_debug_unopt
编译产物
在engine/src
下执行
ninja -C out/android_debug_unopt_arm64
1
和
ninja -C out/host_debug_unopt
1
这两步才是真正构建过程,过程会花点时间。
使用本地引擎运行Flutter
- 修改
pubspec.yaml
文件 在文件中添加下面代码
dependency_overrides:
sky_engine:
path: <FLUTTER_ENGINE_ROOT>/engine/src/out/host_debug_unopt/gen/dart-pkg/sky_engine
#sky_services:
# path: <FLUTTER_ENGINE_ROOT>/engine/src/out/host_debug_unopt/gen/dart-pkg/sky_services
1
2
3
4
5
2
3
4
5
20220524注:sky_services在flutter2.4版本后被删除
- 执行命令
flutter run --local-engine-src-path <FLUTTER_ENGINE_ROOT>/engine/src --local-engine=android_debug_unopt_arm64
1
- 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
1
- 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" // 替换引擎地址
],
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 输入上面获取到的pid
- 将包名替换上面的
包名
- 将打包后的引擎替换上面的地址
- 将打包后的引擎地址替换上面的
xxx/engine/src
,注意是要输入两次
F5启动VSCode,开始断点吧