- 操作系统: macOS 13.3.1
- flutter sdk: 3.7.12
预备东西
下载和编译源码需求用到 gclient/ninja, 它们包含在 depot_tools 东西集中.
- 经过 git 下载复制 depot_tools 仓库
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git - 将 depot_tools 途径添加到 PATH 环境变量中, 便于后续直接运用
export PATH=/path/to/depot_tools:$PATH
下载源码
同步代码
- 创建 engine 目录, 并在 engine 目录中添加
.gclient文件:solutions = [ { "managed": False, "name": "src/flutter", "url": "https://github.com/flutter/engine.git", "custom_deps": {}, "deps_file": "DEPS", "safesync_url": "", }, ] - 履行
gclinet sync指令, 等完同步完结.
切换分支
一般情况下是要阅览和编译与 flutter sdk 关联的引擎代码.
- 履行
cat path/to/flutter/bin/internal/engine.version指令检查引擎git-hash. - 进入
src/flutter目录中, 履行git checkout <git-hash>. - 履行
gclient sync -D指令, 等候同步完结.
编译源码
同步完的代码会保存在 src/flutter 目录中, 接下来的构建操作都会在 src 目录下进行. flutter 支撑在多个渠道上运转, 针对不同的渠道会生成不同的产物.
生成构建文件
在开端构建任务前, 需求经过 gn 指令生成构建前所需的文件. 以构建 android-arm 引擎为例, 需求预备 android-arm 和 host 的构建文件.
- 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:goma是 Google 内部运用的分布式构建东西, 默许会启用该东西, 需求经过--no-goma禁用.
履行构建操作
运用 gn 指令会在 out 目录下生成对应的构建文件, 接着运用 ninja 指令开端指定渠道的构建任务.
- android-arm:
ninja -C out/android_debug_unopt - host:
ninja -C out/host_debug_unopt
调试源码
代码跳转补全
引荐运用 vscode 进行代码阅览与修改.
c++
- 装置插件: clangd.
- 把
compile_commands.json添加到src/flutter目录下:ln -s ../out/android_debug_unopt/compile_commands.json . - 用 vscode 翻开
src/flutter目录.
Java
- 装置插件: Extension Pack for Java.
- 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", ], } - 用 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
断点调试代码
- 装置插件: CodeLLDB.
- 在设备上运转待调试的使用.
- 在设备中运转
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: 待调试的使用包名.
-
- 在 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中的参数.
-
- 在 vscode 挑选
flutter_lldb装备并运转.
参考资料
- Setting up the Engine development environment
- Compiling the engine
- Flutter‘s modes
- Using a locally-built engine with the
fluttertool - Remote Debugging
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
