对于深刻学习Flutter
来讲,搭建一个Engine
环境是颇有必要的。Engine
是Flutter
底层(C/C++)的实现,包含了Dart VM、Skia、vulkan等第三方库。linux
因为须要访问谷歌去拉取源码,因此必须设置好代理,包括:android
只有当代理设置成功后,后面的操做才会顺利,不然有可能由于网络缘由从而致使失败。关于代理的具体设置能够去百度/谷歌搜一下。ios
在拉取代码前,须要先把依赖工具准备好。c++
gclient
命令。环境准备好后,就能够来下载Engine
源码。首先来建立一个空文件夹——engine
,固然也可使用其余名称。而后在该文件夹中建立一个.gclient
文件,内容以下:git
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:<your_name_here>/engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
复制代码
关于这里的url,须要注意一下,若是本身的GitHub帐户没有forkhttps://github.com/flutter/engine
,那么就须要先fork,而后用本身的帐户名称替换<your_name_here>。若是不想fork,能够用flutter替换<your_name_here>。github
注意: 建立的文件名称是.gclient
,而不是文件的后缀为.gclient
。建立成功后,不会在文件夹中显示,但能够经过vim来查看该文件。shell
.gclient
文件建立成功后,进入engine
这个空文件夹,而后运行gclient sync
命令来下载Engine
源码。这时候就须要拼网速或者访问谷歌是否稳定,若是一切顺利(可能几个小时),目录以下。json
再看来Engine
的编译。进入src
目录,就能够经过一些命令来进行编译Engine
,以下:vim
./flutter/tools/gn --android --runtime-mode=debug
ninja -C out/android_debug -j 6
./flutter/tools/gn --runtime-mode=debug
ninja -C out/host_debug -j 6
复制代码
经过上面命令就能够编译能在Android上运行且cpu类型为armeabi_v7a的产物。bash
再经过./flutter/tools/gn --help
命令来看一下其余参数。
usage: gn [-h] [--unoptimized]
[--runtime-mode {debug,profile,release,jit_release}] [--interpreter]
[--dart-debug] [--full-dart-debug]
[--target-os {android,ios,linux,fuchsia}] [--android]
[--android-cpu {arm,x64,x86,arm64}] [--ios] [--ios-cpu {arm,arm64}]
[--simulator] [--fuchsia] [--linux-cpu {x64,x86,arm64,arm}]
[--fuchsia-cpu {x64,arm64}] [--arm-float-abi {hard,soft,softfp}]
[--goma] [--no-goma] [--lto] [--no-lto] [--clang] [--no-clang]
[--clang-static-analyzer] [--no-clang-static-analyzer]
[--target-sysroot TARGET_SYSROOT]
[--target-toolchain TARGET_TOOLCHAIN]
[--target-triple TARGET_TRIPLE]
[--operator-new-alignment OPERATOR_NEW_ALIGNMENT] [--enable-vulkan]
[--enable-metal] [--enable-fontconfig] [--enable-skshaper]
[--enable-vulkan-validation-layers] [--embedder-for-target]
[--coverage] [--out-dir OUT_DIR] [--full-dart-sdk]
[--no-full-dart-sdk] [--ide IDE] [--build-glfw-shell] [--bitcode]
[--stripped] [--no-stripped] [--asan] [--lsan] [--msan] [--tsan]
[--ubsan]
复制代码
参数众多,来看几个经常使用的。
arm
其实对应的是armeabi_v7a
。但若是要编译armeabi
(Google目前已经不建议使用armeabi
),能够参考Flutter Engine 编译指北这篇文章。经过对上面命令的组合,就能够编译Android及iOS平台上不一样CPU类型的产物。
例如,Android平台,cpu类型为arm64,运行模式为debug的产物。
./flutter/tools/gn --android --runtime-mode=debug --android-cpu=arm64
ninja -C out/android_debug_arm64 -j 6
./flutter/tools/gn --runtime-mode=debug --android-cpu=arm64
ninja -C out/host_debug_arm64 -j 6
复制代码
例如,iOS平台,cpu类型为arm64,运行模式为debug的产物。
./flutter/tools/gn --ios --runtime-mode=debug --ios-cpu=arm64
ninja -C out/ios_debug_arm64 -j 6
./flutter/tools/gn --runtime-mode=debug --ios-cpu=arm64
ninja -C out/host_debug_arm64 -j 6
复制代码
编译成功后,就能够在运行flutter项目时使用编译成功的本地Engine
,经过一下命令运行项目便可。
flutter run --local-engine-src-path <FLUTTER_ENGINE_ROOT>/engine/src --local-engine=android_debug
复制代码
因为flutter项目的Android平台默认支持x64
、arm
及arm_64
三种cpu类型,全部必须把这三种类型的Engine
都编译成功才能执行上面的命令。
但若是仅编译了arm
、x64
及arm_64
中的任意一种或两种,那么这时候能够经过先打包APK,再安装APK的方式来运行。
正式环境APK
flutter build apk --release --local-engine-src-path /Users/limeihong/Desktop/engine/src --local-engine=android_release
复制代码
debug环境APK
flutter build apk --debug --local-engine-src-path /Users/limeihong/Desktop/engine/src --local-engine=android_debug
复制代码
很不巧,上面打包APK也是须要x64
、arm
及arm_64
三种平台都得支持。但若是仅编译了arm
、x64
及arm_64
中的任意一种或两种,就得在打包APK时显示的指定某一类型。
flutter build apk --target-platform android-arm --split-per-abi --debug --local-engine-src-path /Users/limeihong/Desktop/engine/src --local-engine=android_debug
复制代码
上面是指定打包cpu类型为arm,若是要想其余类型的apk,则将android-arm替换便可,如替换成android-x64或android-arm_64。
打包成功后,apk默认在路径build/app/outputs/apk/debug
或build/app/outputs/apk/release
下,而后经过经过如下命令安装便可。
flutter install build/app/outputs/apk/debug/xxxx.apk
复制代码
这样就能够成功将编译的Engine
打包仅APK并运行。
注意: 正式环境下的apk须要签名文件,默认的正式包是没有签名的,而没有签名的正式包在手机上是没法运行的。
若是要查阅Engine
源码,可使用已经配置了C/C++环境的VS Code打开src目录。而后在.vscode/c_cpp_properties.json
中,将compileCommands
的路径指向out/compile_commands.json
文件,示例以下。
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64",
"compileCommands":
//这是须要主动设置的
"${workspaceFolder}/out/compile_commands.json"
}
],
"version": 4
}
复制代码
这样,在查阅代码时就能够自动跳转。若是要对Engine
作一些修改,就能够经过上面的方式来从新编译Engine
并打包进安装包中。
【参考资料】