Flutter Engine环境搭建

对于深刻学习Flutter来讲,搭建一个Engine环境是颇有必要的。EngineFlutter底层(C/C++)的实现,包含了Dart VM、Skia、vulkan等第三方库。linux

一、环境准备

因为须要访问谷歌去拉取源码,因此必须设置好代理,包括:android

  • git的http/https代理
  • 终端的http/https代理

只有当代理设置成功后,后面的操做才会顺利,不然有可能由于网络缘由从而致使失败。关于代理的具体设置能够去百度/谷歌搜一下。ios

在拉取代码前,须要先把依赖工具准备好。c++

  • Linux、macOS或Windows,最好macOS,由于MacOS同时支持Android和iOS的交叉编译功能。
  • git,版本控制。
  • IDE,官方建议Android Studio。
  • ssh client,用于Github的身份认证,具体配置参考Connecting to GitHub with SSH
  • depot_tools,该工具包含gclient命令。
  • Python及Java环境。

二、Engine源码下载

环境准备好后,就能够来下载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编译

再看来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]
复制代码

参数众多,来看几个经常使用的。

  • --unoptimized,是否优化性能,默认优化。
  • --runtime-mode,flutter的运行模式,有debug,profile,release,jit_release四种选择。
  • --target-os,目标系统,有android,ios,linux,fuchsia四种选择。--target-os=android等同于--android命令,--target-os=ios等同于--ios命令,以此类推。
  • --android-cpu,Android所运行平台,有arm,x64,x86,arm64四种选择。若是要在Android模拟器上运行,则--android-cpu=x86。注意: 这里的arm其实对应的是armeabi_v7a。但若是要编译armeabi(Google目前已经不建议使用armeabi),能够参考Flutter Engine 编译指北这篇文章。
  • --simulator,iOS所运行平台为模拟器。
  • --ios-cpu,iOS所运行平台,有arm,arm64两种选择。

经过对上面命令的组合,就能够编译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
复制代码

四、运行及IDE支持

编译成功后,就能够在运行flutter项目时使用编译成功的本地Engine,经过一下命令运行项目便可。

flutter run --local-engine-src-path <FLUTTER_ENGINE_ROOT>/engine/src --local-engine=android_debug
复制代码

因为flutter项目的Android平台默认支持x64armarm_64三种cpu类型,全部必须把这三种类型的Engine都编译成功才能执行上面的命令。

但若是仅编译了armx64arm_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也是须要x64armarm_64三种平台都得支持。但若是仅编译了armx64arm_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/debugbuild/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并打包进安装包中。

【参考资料】

Setting up the Engine development environment

Compiling the engine

搭建Flutter Engine源码编译环境

Flutter Engine 编译指北

相关文章
相关标签/搜索