【问题标题】:DriverKit gone after installer installed activatedDriverKit 在安装程序安装激活后消失了
【发布时间】:2020-09-07 22:41:09
【问题描述】:

这真是一个奇怪的情况。 我的应用程序是与我的 driverkit 驱动程序通信的用户代理,根据我们的设计,这个应用程序(名为 myAgent.app)会激活我的驱动程序(名为 myDriverKit),因为 myAgent.app 启动然后与 myDriverKit 通信。在我们的测试中我通过plist手动加载,内容为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.myCom.myApp</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/myApp.app/Contents/Helper/myAgent.app/Contents/MacOS/myAgent</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>                                                         
    <true/>
</dict>
</plist>

一切运行良好(当我们尚未获得授权时,在 SIP 关闭的情况下)。

然后我们打包它,myDriverKit在安装过程中激活后看起来运行良好,安装后脚本最后写:

CONSOLE_USER=$(stat -f%Su /dev/console)
su -l "$CONSOLE_USER" -c '/bin/launchctl load /Library/LaunchAgents/com.myCom.myAgent.plist' 2> /dev/null

但是重启后,myDriverKit 不再工作了!当我使用systemextensionctl list 查找它时,它看起来像生存,但是检查控制台,通过日志流挂钩它,我再也找不到它了。除非我手动执行systemextensionctl reset 并重新启动 myAgent.app 以使其能够永久存在。

我做了几个测试:

  1. 安装完成后不要自动启动ctl load myAgent,而是自己手动加载 -> 可以。
  2. chmod 644 com.myCom.myAgent.plist 然后重新构建包 -> 失败
  3. 不允许 myDriverKit 在安全中,然后在重新启动后允许它 -> 有效
  4. 在安装后脚本中改用/usr/bin/sudo -u $USER /bin/launchctl load -S Aqua /Library/LaunchAgents/com.kensington.trackballworks.plist->失败

似乎 myAgent.app 由安装脚本启动与我自己启动不同。可能的根本原因是什么?它可能在 post 脚本中还是在 myAgent.app 激活过程中?如果有任何回复 Orz 表示感谢。

【问题讨论】:

  • 这是什么 macOS 版本?如果它是测试版,您是否检查过发行说明,以防已知问题涉及此问题?您是否检查过您的 dext 是否只是崩溃了?
  • 我们在 10.15.6 上测试它。我确定系统重新启动时我的 dext 不会崩溃。但是我得到了一些东西...我的安装程序起源于安装 .kext,它与 dext 拥有相同的功能,在我们的设计中,当操作系统为 10.15.6 以上时,kext 在 postinstall 脚本中是 kextunloadrm。如果我从 .pkg 中删除 kext,这种情况就不会再发生了。
  • 所以现在我试图找到一种方法,当操作系统高于 10.15.6 时,不将 kext 放入 /Library/Extension ......因此我可以避免这种状态。帮助!我好几个星期都睡不好觉!
  • 将您不想在 10.15.6+ 上安装的 kext 放在它们自己的子 .pkg 中,并且仅在旧版本的整体分发 pkg 中启用该选择。但是,如果操作系统随后由用户更新,您可能需要更新您的软件以删除任何剩余的 kext。 (即用户在 10.15.5 上安装您的驱动程序,使用 kext;用户更新到 10.15.6,现在应该使用 dext,因此您的软件需要检测到这一点并删除 kext)您也可以尝试更改探测分数
  • 是的菲尔,你是对的!我正在尝试将我的 kext 变成 .pkg 作为我的分发包的一个组件...我不熟悉 pkgbuild->productbuild 过程...需要更多时间来构建和测试...Orz跨度>

标签: objective-c macos driverkit


【解决方案1】:

我会自己回答这个问题。这种奇怪情况的根本原因是用户在安装程序处理kextcache时激活(在安全中单击允许按钮的那一刻)dext。

如果我们在 .pkg 中指定要复制到 /Library/Extensions/ 的 kext,安装程序将在安装过程中自动执行 kextcache。这就是安装程序需要这么长时间才能完成安装的原因。

如果用户在kextcache 处理期间激活了一个 dext,则该 dext 似乎可以工作,但在重新启动后,即使在发出 systemextensionctl list 时它显示“已激活”,该 dext 也不会产生任何影响。

在我看来,这应该是 macOS 中的一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多