【问题标题】:Signing Electron build for M1 macs causes renderer to crash为 M1 mac 签署 Electron 版本会导致渲染器崩溃
【发布时间】:2022-07-12 05:45:21
【问题描述】:

一段时间以来,我一直在使用 Electron-Builder 构建我们的 Electron 应用程序,对其进行签名,并且能够毫无问题地运行它们。

我现在正在尝试进行 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

【问题讨论】:

  • 我担心没有人能够帮助您理解这些错误,除非这是 Electron 本身的实际错误。你最好的办法可能是打开main.prod.js 文件,看看你是否能弄清楚抛出错误的行发生了什么,也许这可以给你一个线索。
  • 关键错误:[22739:0331/171516.826773:FATAL:v8_initializer.cc(820)] render-process-gone { reason: 'crashed', exitCode: 5 } 发生在 webFrameMain 错误之前,当您尝试向不存在的 webContent 发送消息时会发生这种情况。我想弄清楚的是为什么渲染器进程仅在 m1 上签名时才会在 v8 级别崩溃(未在 intel/M1 版本上签名时不会崩溃,在已签名的 intel 版本上不会崩溃)。据我所知,这将是一个特定于电子的错误,而不是 JS。
  • 考虑将此报告为 electron-builder 问题跟踪器上的错误。这可能不是一个错误,但我认为 Stack Overflow 上的任何人都不会得到答案。
  • 我也已经在那里举报了。我想我也会在这里问,以防有人知道,而不是在问这里之前浪费时间等待问题跟踪器是否接受它。
  • 无论我在哪里签名。所以 M1 构建在 intel = crash 上签名。在 M1 上签名的 M1 构建 = 崩溃。英特尔在任何地方构建签名/未签名 = 很好。 M1 构建无符号 = 很好。当签署为 m1 版本时,我还有一个样板版本的电子可以正常运行。所以我怀疑本机依赖可能是原因。 (我怀疑基于 JS 的依赖会导致问题)。

标签: electron apple-m1 electron-builder electron-packager code-signing-certificate


【解决方案1】:

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

在我们的例子中,它是由本地依赖引起的。本机依赖项的 .node 文件被视为单独的可执行文件,预计在正常情况下会被签名。出现的沙盒似乎不仅仅发生在配备新 M1 芯片的机器上。

我不确定是否有必要进行所有这些更改,因为我们没有配备 M1 芯片的机器。我会在精简后更新这个答案,但鉴于我们缺乏硬件,这可能需要一段时间。

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

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

Source

  1. entitlements entitlementsInherit (See docs) 指定您的权利文件

  2. asarUnpack添加以下内容

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

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

【讨论】:

    【解决方案2】:

    自从第一次尝试为两个拱门构建 dmg 以来,我遇到了同样的错误。我以为我必须在各自的机器上构建每个安装程序。我有一个 m1 macbook 和一个 intel macmini,在 intel 上为 arm64 创建的安装程序抛出该错误和其他方式也是,x64 dmg 建立在 m1 上。我想过让两台机器构建每个安装程序,但是更新文件被最后一个覆盖以完成构建,如果我继续这种方法,我会需要在 CI 上创建最后一步来修补该更新文件...但我真正想要的是让我的 mac-mini 英特尔构建两个安装程序..

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2021-06-26
      • 1970-01-01
      • 2022-01-18
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多