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 編譯指北

相關文章
相關標籤/搜索