對於深刻學習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
並打包進安裝包中。
【參考資料】