0

这真是一个奇怪的情况。我的应用程序是与我的 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. 不要自动launchctl 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。

4

1 回答 1

0

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

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

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

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

于 2020-09-24T09:52:44.557 回答