編譯舊版本的electron內核

????????我們的軟件產品使用的electron框架,electron框架是不斷更新的,但是我們的軟件太過龐大復雜,不敢輕易升級electron框架。Electron舊版本存在一些BUG和不合理的地方,需要去修復BUG或者不合理的地方。修復完BUG后,要對electron內核進行編譯。

????????本文以electron 20.3.8為例,在windows下進行x64位的編譯(我公司所有的軟件都已經拋棄了32位系統),介紹舊版本的編譯,分享給大家交流。

Mac和Linux版本的操作方法類似。

前提:

○本文以electron 20.3.8為例

○代碼放在D盤

○本文默認讀者使用的代理軟件的端口為7890

目錄

?一. 調查工作

1.1. 確定要編譯的版本所需要的各組件的版本

1.2. 確定electron 20.3.8對應的Chrome精確版本

1.3. 確定electron 20.3.8對應的編譯Windows Build Requirements

1.4. 確定depot_tools版本

1.5. 綜合調查信息準備軟件

二. 軟件準備

2.1. 硬件和操作系統

2.2. 安裝git

2.3. 安裝Nodejs ?v16.15

2.4. 安裝Microsoft Visual Studio 2019

2.5. 安裝depot_tools

2.6. 準備網絡環境

2.7. 設置環境變量

三. 編譯準備

3.1. 設置GIT參數

3.2. 獲取electron代碼

四. 編譯內核


?一. 調查工作

1.1. 確定要編譯的版本所需要的各組件的版本

訪問https://www.electronjs.org/zh/docs/latest/tutorial/electron-timelines

Electron

Alpha

測試版

穩定版

EOL

Chrome

Node

20.0.0

2022年5月26日

2022年6月21日

2022年8月2日

2023年2月7日

M104

v16.15

從上面信息可知:

20.0.0 版本對應的Chrome是M104,穩定版的日期是2022年8月2日,Nodejs版本為v16.15

1.2. 確定electron 20.3.8對應的Chrome精確版本

訪問https://releases.electronjs.org/release,找到electron 20.3.8

從上面信息可知:

electron 20.3.8 版本對應的Chromium是104.0.5112.124

1.3. 確定electron 20.3.8對應的編譯Windows Build Requirements

從Chromium開發官網沒有找到編譯electron的各種軟件的對應版本,但是在其衍生產品CEF的官網上找到了

https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding.md#markdown-header-current-release-branches-supported

從上表可以看到在Windows下編譯Chromium104.0.5112.124版本對應的

操作系統Win 7及其以上

VS2019 16.11.13版本以上

Windows SDK為Win 10.0.20348

1.4. 確定depot_tools版本

????????編譯electron核心其實是編譯Chromium,Chromium代碼非常龐大,所以Chromium自己編寫了一個輔助編譯軟件depot_tools用來編譯Chromium的代碼。

??? depot_tools是不斷更新的,它的最新版總是用于編譯最新版本Chromium代碼。所以每個Chromium的版本也需要相對應的depot_tools版本。現在要確定electron 20.3.8編譯所需要的depot_tools的版本。

??? 安裝git軟件,先把depot_tools下載下來,然后通過 git map來查看其更新記錄。

通過1.1里所查的信息,electron 20.3.8最后穩定版為2022年8月2日維護結束,那么我們只要找到depot_tools在2022年8月2日當日或者之前的最后一個版本即可。

通過git map可以看到2022年8月2日的最后一個提交記錄是d895d01ac4,后續步驟我們通過

git checkout d895d01ac4

獲取這個版本。

1.5. 綜合調查信息準備軟件

總以上上面調查的信息

Win 7及其以上

electron 20.3.8

Chromium 104.0.5112.124

VS2019 16.11.13+

Windows SDK為Win 10.0.20348

nodejs v16.15

depot_tools版本為提交記錄為d895d01ac4這個版本

二. 軟件準備

此步驟是安裝支持軟件,分別為:

○ 硬件和操作系統

○ git最新版

○ Node.js v16.15

○ Microsoft Visual Studio 2019 16.11.13+

? ?Windows 10 SDK version 10.0.20348.0

? ?Debugging Tools for Windows

○ depot_tools

○ 準備網絡環境

○ 環境變量設置

需要提及的細節如下每個小章節。

2.1. 硬件和操作系統

CPU高性能CPU,CPU越快越好,否則編譯速度會非常慢,以I5-14400為例子,整個編譯過程要4個多小時。最新版本electron需要的時間更多。
內存32G及其以上,否則編譯會經常中斷。
操作系統

○ WIN11專業版或者企業版需要一個干凈的系統。剛剛安裝完成的或者重置完成的全新系統,防止其他軟件的干擾。

○打開WIN11語言和區域設置,在管理語言設置里將“使用Unicode UTF-8提供全球語言支持”選擇上。同時建議直接將操作系統的語言改為英文版,以避免比必要的編譯錯誤。

○為了不必要的干擾,請啟用Administrator賬戶進行編譯。

2.2. 安裝git

https://git-scm.com/downloads

下載最新版的默認安裝即可,本文作者認為你已經安裝了git,因為1.4章節需要git軟件。

2.3. 安裝Nodejs ?v16.15

https://nodejs.org/download/release/

找到Nodejs v16.15最后一個版本v16.15.1,下載node-v16.15.1-x64.msi后默認安裝即可。

2.4. 安裝Microsoft Visual Studio 2019

https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/history

在Microsoft官網找到Microsoft Visual Studio 2019 16.11.13+安裝包,進行安裝。

找到最新版本16.11這個版本的最新版即可。選擇項目如下:

安裝完成后Microsoft Visual Studio 2019 16.11.49后,打開操作系統控制面板的軟件列表。

找到Windows Software Development Kit - Windows 10.0.20348.1,點擊右鍵選擇“更改”,

將Debugging Tools for windows選擇上,然后開始安裝。

2.5. 安裝depot_tools

本文的代碼部分都是放在D盤。

git clone https://chromium.googlesource.com/chromium/tools/depot_tools

再取得對應的版本

git checkout d895d01ac4

PS:網絡準備請參照2.6和2.7的《設置網絡環境變量》

2.6. 準備網絡環境

??? 因為特殊原因,我認為你已經準備好了網絡環境,以用于訪問

https://github.com/

https://chromium.googlesource.com

等站點。

本文默認讀者使用的代理軟件的端口為7890。

2.7. 設置環境變量

在操作系統的環境變量,以順利編譯代碼。

○ git環境變量

????????set GIT_CACHE_PATH=D:\git_cache

??? ??? 因為代碼非常龐大,編譯復雜,中途可能中斷重試,所以設置git緩存以避免代碼重復下載。

○ depot_tools環境變量

????????set DEPOT_TOOLS_UPDATE=0

??????? 此環境變量讓depot_tools啟動時候不要自動更新,因為我們需要使用特定的舊版本,

????????沒有這個環境變量它一啟動就會變為最新版。

????????在PATH中添加D:\depot_tools路徑,并把它移動到第一位。

○ Microsoft Visual Studio 2019環境變量

????????set DEPOT_TOOLS_WIN_TOOLCHAIN=0

????????此環境變量告訴depot_tools使用本地的Visual Studio進行編譯,

????????否則它會自己下載編譯器。

????????set vs2019_install=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional

告訴depot_tools本地編譯器路徑

○ 設置網絡環境變量

????????set http_proxys=http://127.0.0.1:7890?

????????set https_proxy=http://127.0.0.1:7890

??? 這樣你才能順利下載代碼,請準備100G左右的流量。

三. 編譯準備

打開depot_tools/bootstrap目錄,在cmd下執行win_tools.bat

執行完,depot_tools會執行初始化工作,它會執行如下載所需的Python到depot_tools目錄等操作。

在cmd再執行gclient命令,以完成其他初始化工作。

執行完成后,打開操作系統的軟件別名設置界面,將python.exe和python3.exe的別名選項關掉。

3.1. 設置GIT參數

以管理員身份打開cmd,切換到D盤,執行以下命令:

D:\

設置git的代理:

git config --global http.proxy http://127.0.0.1:7890

git config --global https.proxy http://127.0.0.1:7890

如果能直通外網,則不需要執行上面命令

設置git參數:

git config --global core.autocrlf false?

git config --global core.filemode false?

git config --global core.preloadindex true?

git config --global core.fscache true?

git config --global branch.autosetuprebase always?

git config --global core.longpaths true?

3.2. 獲取electron代碼

建立存放源代碼和編譯結果的目錄:

mkdir electron_build && cd electron_build

建立下載代碼的配置文件:

gclient config --name "src/electron" --unmanaged https://github.com/electron/electron

執行完成后,會在electron_build目錄下生成.gclient文件,用編輯器打開,

在custom_vars字段里內容:"checkout_pgo_profiles": True,

PS:此操作是為了獲取PGO性能優化特性。

獲取代碼,如果想獲取全部版本的代碼,則執行

gclient sync --with_branch_heads --with_tags

整個代碼大概超過100G。

因為我們只需要特定版本,為了不浪費時間去下載全部版本代碼,我選擇了執行獲取特定版本代碼的指令:

gclient sync --revision v20.3.8 --no-history

ps:在拉取代碼的整個過程中,如果出現中斷可以多次執行gclient sync 操作

四. 編譯內核

通過上面的操作,形成的代碼結構如下:

在CMD中執行如下命令獲取PGO文件:

cd src

python3? tools/update_pgo_profiles.py --target=win64 update --gs-url-base=chromium-optimization-profiles/pgo_profiles

執行gn命令構建編譯.ninja文件建立編譯系統

md out\Release

gn gen out/Release --args="import(\"//electron/build/args/release.gn\")"

PS:默認編譯的是64位的程序

進行編譯

ninja -C out/Release electron

編譯估計耗費6-10個小時左右,取決于編譯計算機的性能。

編譯完成后,可以在D:\electron_build\src\out\Release找到編譯結果文件,在其中提取需要的文件即可。

參考的資料:

https://github.com/electron/electron

https://www.electronjs.org/zh/docs/latest/tutorial/electron-timelines

https://www.electronjs.org/zh/docs/latest/development/build-instructions-gn

https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding.md#markdown-header-legacy-release-branches-unsupported

https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/history

https://chromium.googlesource.com/chromium/src/+/main/docs/README.md

https://chromium.googlesource.com/chromium/src/+/main/docs/windows_build_instructions.md#visual-studio

交流QQ:99107247

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Elastic 9.1/8.19:默認啟用 BBQ,ES|QL 支持跨集群搜索(CCS)正式版,JOINS 正式版,集成 Azure AI Foundry

作者:來自 Elastic Mark Doncov 今天,我們很高興宣布 Elastic 9.1 和 8.19 正式發布! 是的,又有好消息 —— 我們將 8.x 系列最終延長到 8.19,這樣那些還在等待升級到 9.x 的用戶也能享受到許多新功能。 Elastic 9.1…

Redis面試精講 Day 8:Stream消息隊列設計與實現

【Redis面試精講 Day 8】Stream消息隊列設計與實現 文章標簽 Redis,消息隊列,Stream,面試技巧,分布式系統,后端開發 文章簡述 本文是"Redis面試精講"系列第8天,聚焦Redis 5.0引入的Stream消息隊列。文章深入解析Stream的核心概念與實現原理&#xff0…

【01】大恒相機SDK C++開發 —— 初始化相機,采集第一幀圖像、回調采集、關閉相機

文章目錄1 初始化相機&#xff0c;采集第一幀圖像2 回調方式采集圖像3 視頻教程1 初始化相機&#xff0c;采集第一幀圖像 #include <iostream> #include <GalaxyIncludes.h> using namespace std;int main() {//首先&#xff0c;對相機資源進行初始化IGXFactory::…

Windows下定位Mingw編譯的Qt程序崩潰堆棧

一、dump和pdb是什么 在Windows系統下&#xff0c;當我們寫的程序跑在客戶的機器上&#xff0c;因為一個bug&#xff0c;導致程序崩潰&#xff0c;我們該如何定位并修復這個bug呢&#xff1f; 有人會說記錄日志&#xff0c;即便有日志&#xff0c;也是不好定位的&#xff0c;因…

.net依賴注入框架 Autofac和MEF的對比

Autofac 默認需要顯式注冊每個類型&#xff0c;這是它與MEF在模塊化設計上的主要區別。以下是具體對比說明&#xff1a;1. Autofac 的基本注冊方式 Autofac 必須通過代碼明確注冊每個需要注入的類型&#xff08;除非使用特殊掃描機制&#xff09;&#xff1a; var builder new…

Python 使用 asyncio 包處理并 發(使用asyncio包編寫服務器)

使用asyncio包編寫服務器 演示 TCP 服務器時通常使用回顯服務器。我們要構建更好玩一點的示 例服務器&#xff0c;用于查找 Unicode 字符&#xff0c;分別使用簡單的 TCP 協議和 HTTP 協議實現。這兩個服務器的作用是&#xff0c;讓客戶端使用 4.8 節討論過的 unicodedata 模塊…

Node.js (Express) + MySQL + Redis構建項目流程

以下是使用 Node.js (Express) MySQL Redis 構建完整項目的詳細流程&#xff0c;涵蓋環境搭建、架構設計、核心代碼實現和部署優化&#xff1a;一、項目初始化 1. 創建項目目錄 mkdir my-project cd my-project npm init -y2. 安裝基礎依賴 npm install express mysql2 redis…

Python3 中使用zipfile進行文件(夾)的壓縮、解壓縮

一、文件壓縮與解壓縮模塊 zipfile簡介 zipfile 是 Python 標準庫中用于處理 ZIP 壓縮文件的模塊&#xff0c;提供了創建、讀取、寫入、解壓 ZIP 文件的完整功能。它支持多種壓縮算法&#xff0c;無需安裝額外依賴&#xff0c;是處理 ZIP 格式的首選工具。 核心功能與常用類 zi…

在Java客戶端使用Redis

目錄 第一步&#xff1a;開放Redis外部連接配置 第二步&#xff1a;配置端口轉發 第三步&#xff1a;在IDEA中導入依賴 第四步&#xff1a;編寫代碼命令 連接環境&#xff1a;Java客戶端為本地IDEA&#xff0c;Redis服務器安裝在云服務器Ubuntu系統中。 第一步&#xff1a;開…

【MySQL】MySQL索引—B樹/B+樹

目錄 1. 數據庫索引 1.1 索引的概念 1.2 索引的特點 1.3 索引查詢對比普通的查詢 1.4 索引的操作 1.5 索引的原理 1.6 B樹 1.7 B樹 1.8 B樹的優點 1. 數據庫索引 1.1 索引的概念 數據庫的索引是一種特殊的數據結構&#xff0c;里面包含著數據表中所有記錄的引用&…

jQuery Mobile 面板詳解

jQuery Mobile 面板詳解 引言 隨著移動設備的普及,移動網頁開發變得越來越重要。jQuery Mobile 是一個基于 jQuery 的移動網頁開發框架,它提供了一套豐富的 UI 組件和主題,使得開發者可以快速構建出美觀、響應式的移動網頁。在 jQuery Mobile 中,面板(Panel)是一個非常…

Python中的import和from...import有什么區別?

文章目錄 前言 一、import導入模塊 導入模塊并給它一個別名 語法格式 二、from...import導入特定項 1.導入模塊中的特定項 2.導入模塊中的所有項 2.1 命名空間核污染 2.2 性能影響 總結 前言 在Python編程中,模塊和包的導入機制是編寫可維護、可擴展代碼的核心。深入理解Pyth…

vscode提示“無法使用 compilerPath 解析配置”解決辦法

0 問題描述 使用vscode的Remote-SSH插件連接安裝在虛擬機上的Windows10進行遠程開發時&#xff0c;出現如下提示&#xff1a;無法使用 compilerPath 解析配置:“D:\mingw64\bin\gcc.exe” 所有包含C庫頭文件的文件都被標紅提示錯誤&#xff1a;1 問題原因 vscode沒有設置正確的…

信噪比(Signal-to-Noise Ratio, SNR)詳細介紹

信噪比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;信噪比&#xff08;Signal-to-Noise Ratio&#xff0c;SNR&#xff09;是衡量信號質量的重要參數&#xff0c;表示有用信號的功率與背景噪聲功率的比值。SNR在通信、音頻處理、視頻處理以及其他電子信號處理領域中具有…

Nginx 相關實驗(1)

nginx源碼編譯 本實驗采用nginx源碼編譯的安裝方式&#xff0c;需要準備一個tar包&#xff0c;可從nginx官網上下載。 下載地址&#xff1a;nginx: downloadhttps://nginx.org/en/download.html 將下載好的壓縮包傳到虛擬機中的自定義目錄下 [rootwebserver ~]# ls anacond…

【選型】HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議(ST 原廠 vs 國產芯片)(單片機選型主要考慮的參數與因素)

國產 vs ST 單片機在工業控制中的性能對比分析 HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議 工業控制領域 MCU 選型:國產航順 HK32 與 ST 原廠芯片深入比較 國產 MCU 是否可替代 ST?基于發電機控制應用的深入評估 從數據手冊看 MCU 制造工藝差異:HK32L088 vs S…

LLM Prompt與開源模型資源(1)提示詞工程介紹

學習材料&#xff1a;https://www.hiascend.com/developer/courses/detail/1935520434893606913學習時長&#xff1a; 預計 30 分鐘學習目的&#xff1a; 了解提示工程的定義與作用 熟悉提示工程的關鍵技術相關概念 掌握基于昇騰適配的大模型提示工程的入門及進階指南 提示…

kafka與其他消息隊列(如 RabbitMQ, ActiveMQ)相比,有什么優缺點?

Kafka、RabbitMQ 和 ActiveMQ 是三種最主流的消息中間件&#xff0c;它們的設計和適用場景有所不同。 我們可以通過一個簡單的表格來快速了解它們的核心區別&#xff1a; 核心對比一覽特性 / 維度KafkaRabbitMQActiveMQ核心模型分布式、持久化的日志系統 (Dumb Broker / Smart …

Kubernetes架構和部署

k8s組件 master節點:管理節點 管理平面組件 api server : api gateway controller manager scheduler etcd 數據庫 worker節點:被管理節點,運行容器 kubelet:k8s agent container runtime:docker,containerd,cri-o kube-proxy:service 網絡 ????????…

建造者模式及優化

建造者模式是一種創建型設計模式&#xff0c;它將復雜對象的構建過程與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。核心思想是指揮者定流程&#xff0c;建造者填細節&#xff0c;通過多個步驟逐步構建對象&#xff0c;并允許靈活組合這些步驟以生成不同配置的…