獲取Depot_tools腳本工具集
depot_tools是google用來(lái)管理Chromium源碼的工具集,主要有g(shù)client、ninja、repo等。gclient和repo都是用來(lái)檢出項(xiàng)目源碼的腳本。gclient主要依賴于.gclient與DEPS2個(gè)配置違建進(jìn)行源碼的依賴檢出。而repo主要依賴于manifest.xml配置文件進(jìn)行項(xiàng)目模塊源碼檢出。
獲取工具集
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
上面下載的時(shí)候會(huì)報(bào)443,是因?yàn)槲覀兿螺d的是外網(wǎng)項(xiàng)目,可以給Git配置代理:
git config --global http.proxy 'http://127.0.0.1:1087'
git config --global https.proxy 'socks://127.0.0.1:1080'
這里可以看一下自己的代理軟件,是不是對(duì)應(yīng)的端口。
clone成功之后配置一下環(huán)境變量,就可以使用命令了
export PATH=$PATH:/path/depot_tools
檢出Flutter Engine源碼
這里由于github下載較慢,使用gitee進(jìn)行下載的。
git clone https://gitee.com/lao_mao_the_only_one/flutter-engine.git
獲取Flutter Engine依賴的源碼
在上面clone下來(lái)的項(xiàng)目中新建一個(gè).gclient文件
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "https://gitee.com/lao_mao_the_only_one/flutter-engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
上面的url改成自己Fork的Flutter Engine的地址
之后,在engine目錄下進(jìn)行g(shù)client sync
cd flutter_engine
gclient sync
上面由于要訪問(wèn)外網(wǎng),可能會(huì)失敗,需要配置代理,上面只是配置了git的代理,這里可以給終端配置一下代理:
export http_proxy=http://127.0.0.1:1087
export https_proxy=socks://127.0.0.1:1080
可以通過(guò)如下驗(yàn)證配置是否成功:
curl -I www.google.com
如果打印出網(wǎng)頁(yè)信息,說(shuō)明成功。
注意:export可以在bash中配置,這樣是全局有效,也可以在命令行中配置,只是在當(dāng)前命令窗口中有效。
切分支
在我們使用的Flutter SDK中找到該版本對(duì)應(yīng)的commit id
bin/internal/engine.version // 在該目錄下可以看到
切換到engine/src/flutter目錄下,執(zhí)行:
git reset --hard 2f0af3715217a0c2ada72c717d4ed9178d68f6ed
gclient sync --with_branch_heads --with_tags
我使用的Flutter SDK是1.22.6版本,在執(zhí)行上面命令后會(huì)報(bào)錯(cuò):
failed to resolve flutter_internal/android/sdk/licenses@latest (line 28): prefix "flutter_internal/android/sdk/licenses" doesn't exist or not visible to unauthenticated callers
這是因?yàn)槟銢](méi)有權(quán)限,只有谷歌的開(kāi)發(fā)者才能直接構(gòu)建,在github是有該issues,暫未解決:
https://github.com/flutter/flutter/issues/72108
之后我使用了v1.12.13-hotfixes版本沒(méi)問(wèn)題了,該版本對(duì)應(yīng)的commit_id:
af51afceb8886cc11e25047523c4e0c7e1f5d408
編譯Engine
準(zhǔn)備構(gòu)建文件
cd src //進(jìn)入src目錄
./flutter/tools/gn --runtime-mode profile //生成Host編譯產(chǎn)物存放文件
./flutter/tools/gn --android --runtime-mode profile //生成Android編譯產(chǎn)物存放文件
執(zhí)行上面命令會(huì)在src/out目錄下生成相應(yīng)的文件夾,用于存放該平臺(tái)的編譯產(chǎn)物
構(gòu)建可執(zhí)行文件
ninja -C out/host_profile -j 6
ninja -C out/android_profile -j 6
使用本地引擎運(yùn)行Flutter應(yīng)用
flutter run --local-engine-src-path <FLUTTER_ENGINE_ROOT>/engine/src --local-engine=android_profile
IDE配置
個(gè)人編譯flutter engine主要為了方便閱讀源碼,所以上面幾步只是做了簡(jiǎn)單記錄,在我們使用了./flutter/tools/gn編譯引擎后,就會(huì)在src/out下生成compile_commands.json 文件
- 將compile_commands.json文件拷貝到src/flutter目錄下
- 使用Clion打開(kāi)src/flutter目錄,就可以識(shí)別到compile_commands.json,代碼就有跳轉(zhuǎn)的能力了。