flutter engine編譯,方便閱讀源碼

獲取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)的能力了。

參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容