
【免費下載鏈接】reynard-browserAn experimental Gecko-based web browser for iOS 13.項目地址https://gitcode.com/gh_mirrors/re/reynard-browser點擊查看免費下載Reynard Browser 是一款運行在 iOS 13 上的實驗性 Gecko 引擎瀏覽器。與 iPhone 上所有被強制使用 WebKit 的瀏覽器不同它把 Firefox 同款 Gecko 引擎移植到了 iOS并且不依賴 Apple 官方的 BrowserEngineKit 框架。它最核心的工程難題是如何讓 Gecko 的多進程模型瀏覽器進程 內容進程在 iOS 的 App Extension 隔離機制中跑起來。本文帶你完整拆解這個「App Extension XPC」的多進程承載方案。倉庫結構速覽三個角色各司其職理解架構前先看看 reynard-browser/ 倉庫里與多進程直接相關的部分目錄角色browser/Reynard/主應用瀏覽器進程 UI 層Swift UIKitbrowser/Helper/「Reynard Helper.appex」擴展每個實例就是一個 Gecko 子進程容器browser/GeckoView/自研 GeckoView 移植層Runtime/Session/Prompts 等patches/對 Gecko 引擎的修改ipc/、toolkit/xre/等目錄tools/development/下載 Gecko、打補丁、出 IPA 的腳本關鍵認知Gecko 的每個子進程tab 內容進程、GPU/Socket 進程都不直接 fork 出來而是讓 iOS 以「App Extension 請求」的方式拉起 Helper.appex再用 XPC 把父子進程接成一條 IPC 通道。第一步把 App Extension 改造成「進程容器」擴展聲明Application 類型 多實例Helper 擴展的 Info.plist 是整個方案的地基NSExtensionPointIdentifier指向com.apple.ar.viewer讓系統(tǒng)按擴展流程加載它真正起作用的是XPCService段ServiceType Application、_ProcessType App并開啟_MultipleInstances true——允許多個擴展進程并存正好對應 Gecko 需要的多個內容進程NSExtensionPrincipalClass指向ReynardHelperMain即 Helper.swift 中注冊的主類。入口鉤子繞過 XPC 類校驗擴展入口 main.m 做了一件「必要的小 trick」在調用真正的NSExtensionMain之前先把NSXPCDecoder的私有方法_validateAllowedClass:forKey:allowingInvocations:替換為空實現(xiàn)。因為父子進程之間要傳輸?shù)念愋筒⒉辉谙到y(tǒng)默認白名單里不做這一步 XPC 消息會直接解碼失敗。第二步XPC 雙向握手把子進程接進 Gecko IPC父進程側匿名 Listener 啟動擴展請求父進程邏輯在引擎補丁 NSExtensionUtils.mm 中實現(xiàn)流程是創(chuàng)建一個NSXPCListener匿名監(jiān)聽器并 resume把listener.endpoint塞進NSExtensionItem的 userInfo鍵名是ReynardXPCListenerEndpoint調用beginExtensionRequestWithInputItems:請求啟動 Helper.appex——系統(tǒng)隨即拉起了一個擴展進程擴展連上來后父進程通過私有方法_xpcConnection取出底層的xpc_connection_t交給 Gecko IPC 使用8 秒內沒等到子進程回 ping 就報超時錯誤防止卡死。子進程側從輸入項還原連接子進程側在 Helper.swift 中完成鏡像動作beginRequest(with:)收到NSExtensionContext從inputItems里取出ReynardXPCListenerEndpoint建立NSXPCConnection并 resume通過 ExtensionBridge.mm 的XPCConnectionFromNSXPC()同樣是私有_xpcConnection拿到底層 libxpc 連接調用GeckoRuntime.childMain(xpcConnection:process:)把控制權交給引擎。Swift 側的橋接入口在 GeckoRuntime.swiftmain()走MainProcessInit父進程childMain()走ChildProcessInit子進程。引擎?zhèn)菴hildProcessInit 在擴展里「復活」補丁 IOSBootstrap.mm 里的ChildProcessInit拿到 XPC 連接后調用xpc_connection_activate()讓 Gecko 的子進程框架直接在這條 XPC 通道上跑 IPC 協(xié)議——從此擴展進程對 Gecko 來說就是一個「正常的」內容進程。GeckoChildProcessHost的 iOS 啟動器也相應從官方的ExtensionKitProcess換成了這套NSExtensionProcess見 GeckoChildProcessHost.cpp 補丁。第三步JIT 與內存讓子進程跑得動Gecko 的內容進程需要 JIT 執(zhí)行 JavaScript而 iOS 的 App Extension 默認是不給 JIT 權限的Reynard 用兩條路徑解決配對 / TrollStore 路徑JIT/JITController.swift 監(jiān)聽GeckoRuntime.ChildProcessDidStart通知父進程在 GeckoRuntime.swift 的childProcessDidStart中發(fā)出只針對tab類型進程通過 DDI 配對或 ptrace 方式為子進程啟用 JIT。子進程啟動時會poll一條 JIT 就緒信號管道、最多等 5 秒拿不到就降級為無 JIT 模式內存限額主 App 攜帶com.apple.developer.kernel.increased-memory-limit權限Reynard.entitlements父進程在子進程起來后用 Utils.m 里的updateJetsamControl()單獨調高子進程的 Jetsam 內存上限避免內容進程被輕易殺掉。另外補丁還消費了一個 Documents 沙箱擴展MOZ_DOCUMENTS_SANDBOX_EXTENSION讓內容進程能打開下載的文件——這是從 WebKit 的做法移植過來的。順帶一提OpenIn 分享擴展除了「進程容器」App Extension 還被用在產(chǎn)品功能上Extensions/OpenIn/ 是一個分享擴展從系統(tǒng)分享面板拿到鏈接后拼成reynard://open深鏈喚回主 App邏輯見 OpenInViewController.swift讓「用 Reynard 打開」出現(xiàn)在所有分享列表里。構建與打包腳本 雙 Scheme拉取引擎并打補丁./tools/development/update-gecko.sh、./tools/development/apply-patches.sh補丁由 create-patches.sh 生成源碼在 engine/firefox/Xcode 工程 Reynard.xcodeproj 里有兩個共享 SchemeReynard與Reynard Helper見 xcshareddata/xcschemes/Helper 目標的鏈接參數(shù)里顯式加了-Wl,-u,_NSExtensionMain保證擴展入口符號不被裁剪發(fā)布腳本 tools/release/create-ipa.sh 負責產(chǎn)出可側載的 IPA。如果想在本地復現(xiàn)先克隆倉庫git clone --recursive https://gitcode.com/gh_mirrors/re/reynard-browser再按上面順序執(zhí)行即可??偨Y三招拆解 iOS 多進程瀏覽器層次方案對應代碼進程隔離復用 App Extension 的沙箱與啟動機制_MultipleInstances支持多子進程Helper/Info.plist進程間通信NSXPC 握手取 endpoint底層xpc_connection_t直接喂給 Gecko IPCNSExtensionUtils.mm、Helper.swift能力補齊DDI 配對/ptrace 啟 JIT、 Jetsam 限額、沙箱擴展JITController.swift、IOSBootstrap.mmReynard 的思路其實很「取巧」它沒有對抗 iOS 的進程模型而是把 Apple 為「App Extension」設計的隔離機制反向借用為「Gecko 子進程的合法容器」再用 XPC 把引擎原生 IPC 無縫接上。這正是這個項目對「非 WebKit 瀏覽器能否落地 iOS」最有價值的回答。 ?贊分享【免費下載鏈接】reynard-browserAn experimental Gecko-based web browser for iOS 13.項目地址https://gitcode.com/gh_mirrors/re/reynard-browser點擊查看免費下載相關推薦為什么 Reynard Browser 拒絕證書簽名iOS 旁載限制與 App Extension 架構深度解析為什么 Reynard Browser 拒絕證書簽名iOS 旁載限制與 App Extension 架構深度解析 Reynard Browser 是目前 iO智能求職助手Boss Show Time招聘時間插件精準把握就業(yè)時機智能求職助手Boss Show Time招聘時間插件精準把握就業(yè)時機 Boss Show Time是一款專為求職者設計的Chrome瀏覽器插件能夠 實時展示前端Reynard Browser 如何繞開 iOS JIT 禁令DDI 配對與 ptrace 雙通道機制深度拆解Reynard Browser 如何繞開 iOS JIT 禁令DDI 配對與 ptrace 雙通道機制深度拆解 Reynard Browser 是一款運行在創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考