签署M1 Mac的Electron构建会导致渲染器崩溃



我已经用Electron Builder对我们的Electron应用程序进行了一段时间的intel构建,对它们进行了签名,并能够毫无问题地运行它们。

我现在正试图制作一个M1/arm构建,但事实证明,签署该构建会导致渲染器崩溃。未签署生成不会导致崩溃。这不是英特尔构建的问题。(无论构建机器是intel还是arm,以及后续是否调用notarize都一致(

我在应用程序启动过程中看到以下内容(特别注意顶部的v8致命错误,这是这里的主要问题(:

[...]
<--- Last few GCs --->

<--- JS stacktrace --->
[22739:0331/171516.826773:FATAL:v8_initializer.cc(820)] 
render-process-gone { reason: 'crashed', exitCode: 5 }
[...]
Error sending from webFrameMain:  Error: Render frame was disposed before WebFrameMain could be accessed
at EventEmitter.n.send (node:electron/js2c/browser_init:169:417)
at EventEmitter.b.send (node:electron/js2c/browser_init:165:2494)
at c.<anonymous> (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:587569)
at c.emit (node:events:390:28)
at c.emit (node:domain:475:12)
at c.doCheckForUpdates (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:993643)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at w.retries (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:588005)
Error sending from webFrameMain:  Error: Render frame was disposed before WebFrameMain could be accessed
at EventEmitter.n.send (node:electron/js2c/browser_init:169:417)
at EventEmitter.b.send (node:electron/js2c/browser_init:165:2494)
at BrowserWindow.<anonymous> (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:632050)
at BrowserWindow.emit (node:events:390:28)
at BrowserWindow.emit (node:domain:475:12)

因此,我将无法分发该应用程序的arm/M1版本。我不知道签名会如何影响仅在一个体系结构上的渲染器崩溃。

如何解决此问题?

  • 电子v17.1.2
  • 电子生成器23.0.2

我不确定我们是否遇到了与您相同的问题,但以下步骤为我们的用户解决了这样的问题。

在我们的案例中,它是由本机依赖性引起的。本机依赖项的.node文件被视为单独的可执行文件,期望在正常情况下对其进行签名。当它们不在时发生的沙盒似乎只发生在拥有新M1芯片的机器上。

我不确定所有这些改变是否都是必要的,因为我们没有M1芯片的机器。我会在精简时更新这个答案,但考虑到我们缺乏硬件,这可能需要一段时间。

根据我的研究,以下是我们实施的三项更改:

  1. 确保您的entitlements.plist至少具有以下内容。如果使用默认plist的属性,请确保为electron-notarize复制该属性
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>

  1. entitlementsentitlementsInherit指定您的授权文件(请参阅文档(

  2. asarUnpack添加以下内容

asarUnpack: ['**/*.node']

如果这有帮助,请告诉我!

这正是我所面临的场景。我通过将entitlements.plist更新为来修复它

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
</dict>
</plist>

我错过了com.apple.security.cs.allow-jit更多详细信息请点击此处https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit它记录在先决条件中https://github.com/electron/notarize#prerequisites

最新更新