1. 程式人生 > >手把手教你編譯Flutter engine

手把手教你編譯Flutter engine

一圖說明

歡迎關注姊妹篇《手把手教你解決flutter engine記憶體洩漏》

flutter已經到了1.0了,小夥伴還沒有使用的趕緊試試吧,如果想更深入的把玩,可以嘗試編譯一下官方的flutter engine,地址在 github.com/flutter/eng…

為什麼要編譯engine

  1. 學習
  2. 改造 第二篇會介紹怎麼樣改造engine來解決記憶體洩漏問題,滿足自己業務需求。

事前準備

  • 機器,linux,mac,或windows
  • git 命令
  • IDE , android stuido或xcode
  • ssh客戶端,使用者github身份驗證
  • python
  • gclient

如何編

1. 下載

  • 1.1 從官網fork工程到自己工程,github.com/flutter/eng…
  • 1.2 配置ssh祕鑰 help.github.com/articles/ge…
  • 1.3 在flutter工程的同級目錄執行 gclone xxx, xxx為你自己fork後的engine地址,為了後面方便
  • 1.4 在engine目錄建立.gclient檔案 ,執行
$ vim .gclient
複製程式碼

內容為

solutions = [
  {
    "managed": False,
    "name": "src/flutter"
, "url": "[email protected]:<your_name_here>/engine.git", "custom_deps": {}, "deps_file": "DEPS", "safesync_url": "", }, ] 複製程式碼
  • 1.5 切換到engine目錄
$ cd engine
複製程式碼
  • 1.6 獲取Flutter所依賴的所有原始碼,時間超長,大概一個半小時
$ gclient sync
複製程式碼
  • 1.7 進入src/flutter目錄,拉取操作
$ cd src/flutter
$ git pull upstream master
複製程式碼

後面的操作不要看官方的了,最好的文件已經江湖失傳了,僅此一篇

2 回滾

  • 2.1 找到當前flutter對應的engine版本 類似
$  cat /Users/boo/Documents/flutter/bin/internal/engine.version 
複製程式碼

如1.0版的engine版本號,這是一個commit號

7375a0f414bde4bc941e623482221db2fc8c4ab5
複製程式碼
  • 2.2 回滾當時提交版本 執行命令
bogon:src boo$ git reset --hard af454a046be29cc4b8a3f810a925ac60dd27f84f 
HEAD is now at af454a0 Fix dart/create_updated_flutter_deps script so it actually updates flutter/DEPS. (#175)

複製程式碼

只同步指定commit版本命令

gclient sync --with_branch_heads --with_tags  
複製程式碼

3. 建立engine工程

編譯選項具體可以參考 github.com/Natoto/flut…

以ios為例

生成ios裝置用的未經編譯的工程

$ ./flutter/tools/gn --ios --unoptimized
複製程式碼

生成ios裝置用的工程,不帶符號表

./flutter/tools/gn --ios
複製程式碼

生成release工程

$ ./flutter/tools/gn --ios --runtime-mode=release
複製程式碼

生成模擬器版本工程

./flutter/tools/gn --ios --simulator 
複製程式碼

生成模擬器用的未優化版本

./flutter/tools/gn --ios --simulator --unoptimized  
複製程式碼

也可以可以指定cpu

./flutter/tools/gn --runtime-mode=release --ios --ios-cpu=arm64
複製程式碼

4. 編譯

一種編譯模式三千多個檔案,大概一個半小時

編譯relase工程

$ ninja -C out/ios_release
複製程式碼

編譯裝置用debug模式

 ninja -C out/ios_debug && ninja -C out/host_debug
複製程式碼

編譯裝置用debug模式,帶符號

 ninja -C out/ios_debug_unopt && ninja -C out/host_debug_unopt
複製程式碼

編譯模擬器用debug模式

 ninja -C out/ios_debug_sim_unopt && ninja -C out/host_debug_unopt
複製程式碼

如何用

經過漫長的編譯之後,終於可以看到產物了,flutter.framework 就是對應模式的產物 有兩種使用方法,一邊開發一邊測試,或無需修改,直接使用

  1. 在工程中使用
flutter run --local-engine-src-path /Users/boo/Documents/engine/src --local-engine=ios_debug_unopt
複製程式碼
  1. 直接拷貝替換掉flutter目錄裡面的engine就可以立即使用了 /Users/boo/Documents/flutter/bin/cache/artifacts/engine