前言:
之前的文章包括 Flutter Platform View 、FlutterPlatform Channel,都遇到了一些 Framwork 對 Engine 層的呼叫,本篇就講講我們如何來編譯 Flutter Engine ,來對原始碼進行編譯,使用 IDE 進行載入閱讀。
本文處理方式以官方配置為主,可能會更多的注重一些細節。讀者可以直接參考官方文件進行編譯。
Setting up the Engine development environment
github.com/flutter/flu…
筆者以 macOS 進行編譯,所以這裡僅提供 macOS 的編譯步驟。
在開始編譯之前,還希望你能準備好梯子,否則你可能卡在 ninja -C 中。
通暢的網路很重要!!!
通暢的網路很重要!!!
通暢的網路很重要!!!
編譯 Flutter Engine
安裝 depot_tools :
$ pwd
/Users/sunhao/developmchromium.googlesource.com/chromium/tools/depot_tools.git
複製程式碼
配置環境變數:建議在 ~/.bash_profile 檔案中新增
export PATH=/Users/sunhao/development/depot_tools/:$PATH
複製程式碼
然後執行
$ source ~/.bash_profile
複製程式碼
當然,你也可以配置臨時環境變數
$ export PATH=$PATH:/Users/sunhao/development/depot_tools/
複製程式碼
2、將 engine 專案 fork 到自己的github
關於 github 的使用,這裡不多說了,fork 過來,新增 github 的 ssh key 信任。
我這裡的地址為:github.com/loosaSH/eng…
3、建立專案目錄
你可以建立一個目錄,名稱推薦為 engine,後面的步驟會自動執行 clone 。
$ pwd
/Users/sunhao/development
$ mkdir engine
複製程式碼
4、建立 .gclient 檔案
進入engine 目錄,建立 .gclient 檔案
$ cd engine
$ vim .gclient
複製程式碼
寫入如下內容:
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:<your_name_here>/engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
複製程式碼
將 <your_name_here> 換成你的 GitHub 名字,例如我的是:
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:loosaSH/engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
複製程式碼
:wq 儲存退出。
5、執行 gclient sync 命令
這裡的執行需要梯子,速度根據你的網路狀況,同步下來的檔案大小大概有 10G 多吧
$ pwd
/Users/sunhao/development/engine
$ gclient sync
複製程式碼
需要注意的是,這裡需要等待檔案自動完成,並且儘量不要打斷該命令,顯示 100% 後仍有很多操作。
6、重新 fetch flutter/engine 倉庫
$ cd src/flutter
$ pwd
/Users/sunhao/development/engine/src/flutter
$ git remote add upstream git@github.com:flutter/engine.git
複製程式碼
7、安裝輔助工具
安裝 JDK 1.8 以上
ant 安裝
$ brew install ant
複製程式碼
8、編譯 android 相關
確保本地 flutter/engine 倉庫是最新的
$ pwd
/Users/sunhao/development/engine/src/flutter
$ git pull upstream master
$ cd /Users/sunhao/development/engine
$ gclient sync
複製程式碼
執行以下命令編譯
// 準備檔案,生成 compile_commands.json 檔案
$ ./flutter/tools/gn --unoptimized
$ ./flutter/tools/gn --android --unoptimized
// 構建
$ ninja -C out/android_debug_unopt && ninja -C out/host_debug_unopt
複製程式碼
整個過程比較漫長,耐心等待。
9、編譯 iOS 相關
確保本地 flutter/engine 倉庫是最新的
$ pwd
/Users/sunhao/development/engine/src/flutter
$ git pull upstream master
$ cd /Users/sunhao/development/engine
$ gclient sync
複製程式碼
執行以下命令編譯
// 準備檔案,生成 compile_commands.json 檔案
$ ./flutter/tools/gn --ios --unoptimized
$ ./flutter/tools/gn --unoptimized
// 構建
$ ninja -C out/ios_debug_unopt && ninja -C out/host_debug_unopt
複製程式碼
這樣 flutter engine 的編譯工作就基本完成了。生成的一些編譯檔案目錄為 src/out 。
閱讀 Engine 程式碼 ——Clion
個人認為 Clion 來閱讀 C++ 程式碼比較方便,並且開啟速度明顯要快於 VSCode
操作比較簡單,將上面生成的 compile_commands.json 檔案複製到 src/flutter 目錄中,然後使用 Clion 開啟專案,indexing 之後便可以跟蹤跳轉(這一步可能也要一點時間)
閱讀 Engine 程式碼 ——VSCode
官方推薦使用 cquery 進行對 engine 的原始碼依賴跟蹤,
1、cmake 安裝
安裝 cquery 的過程中需要使用到 cmake
$ brew install cmake
複製程式碼
2、cquery 安裝
$ brew install --HEAD cquery
複製程式碼
編譯 cquery 原始碼
$ pwd
/Users/sunhao/development
$ git clone --recursive https://github.com/cquery-project/cquery.git
$ cd cquery
$ git submodule update --init
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=release -DCMAKE_EXPORT_COMPILE_COMMANDS=YES
$ cmake --build .
$ cmake --build . --target install
複製程式碼
3、配置 cquery 環境變數
配置環境變數:建議在 ~/.bash_profile 檔案中新增
export PATH=/Users/sunhao/development/cquery/build/release/bin:$PATH
複製程式碼
然後執行
$ source ~/.bash_profile
複製程式碼
3、安裝 VSCode、以及cquery外掛
4、拷貝 cquery 需要的專案配置檔案
將 compile_commands.json 檔案從 src/out/compile_commands.json 拷貝到 src/
5、配置 VSCode 設定(還是使用clion吧,舒服多了)
因為我們配置了全域性的環境變數,所以可以根據官方的推薦設定一些 highlighting。
在 VSCode 中開啟 settings.json,在 json 中增加:
"cquery.highlighting.enabled.types": true,
"cquery.highlighting.enabled.freeStandingFunctions": true,
"cquery.highlighting.enabled.memberFunctions": true,
"cquery.highlighting.enabled.freeStandingVariables": true,
"cquery.highlighting.enabled.memberVariables": true,
"cquery.highlighting.enabled.namespaces": true,
"cquery.highlighting.enabled.macros": true,
"cquery.highlighting.enabled.enums": true,
"cquery.highlighting.enabled.typeAliases": true,
"cquery.highlighting.enabled.enumConstants": true,
"cquery.highlighting.enabled.staticMemberFunctions": true,
"cquery.highlighting.enabled.parameters": true,
"cquery.highlighting.enabled.templateParameters": true,
"cquery.highlighting.enabled.staticMemberVariables": true,
"cquery.highlighting.enabled.globalVariables": true,
複製程式碼
這樣你就可以在 VSCode 中跟蹤 flutter/engine 程式碼了。
總結
閱讀原始碼只是第一步,後面我會分享關於如何使用本地的 Flutter Engine 以及如何進行除錯。
參考資料:
Setting up your engine development environment
github.com/flutter/flu…
Compiling the engine
github.com/flutter/flu…
Building cquery
github.com/cquery-proj…
Contributing to Flutter
github.com/flutter/flu…
瞭解更多iOS及相關新技術,請關注我們的公眾號:
小編微信:可加並拉入《QiShare技術交流群》。
關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)
推薦文章:
WebSocket 雙端實踐(iOS/ Golang)
今天我們來聊一聊WebSocket(iOS/Golang)
用 Swift 進行貝塞爾曲線繪製
Swift 5.1 (11) - 方法
Swift 5.1 (10) - 屬性
iOS App後臺保活
奇舞週刊