当我授权我的应用程序控制系统时,为什么它启动真的很慢?

时间:2019-05-06 14:43:58

标签: macos accessibility

我开发了一个32位应用程序,我想检查它是否与Mojave兼容。根据{{​​3}},我必须授权我的应用程序在“辅助功能”设置中控制系统,以便使用我所做的某些功能。

更改此设置后,我的应用现在大约需要5分钟才能启动。为什么?如何在不更改辅助功能设置的情况下缩短启动时间?


编辑:我在ElCapitain和Sierra上使用64位应用程序重现了该问题(并且我相信在High Sierra中也会发生此问题)。这是复制它的过程。

创建一个像这样的C ++文件:

#include <iostream>
#include <ApplicationServices/ApplicationServices.h>

#define SIZE 1000000000
char dummy[SIZE] = {'a'};

int main()
{
    if(AXIsProcessTrustedWithOptions(NULL))
        std::cout << "Trusted" << std::endl;
    else
        std::cout << "Not trusted" << std::endl;

    return 0;
}

我创建一个dummy变量以增加二进制文件的大小。我注意到该问题在大型应用程序中更为明显。如果应用程序被授权控制系统,则AXIsProcessTrustedWithOptions也会返回true

编译: clang++ -framework ApplicationServices repro.cpp -o repro

创建一个捆绑应用程序,并将repro放入MacOS目录:

repro.app
 |_ Contents
     |_ MacOS
         |_ repro

首次执行:

$ date && open repro.app && date
Ven 10 mai 2019 16:58:10 CEST
Ven 10 mai 2019 16:58:10 CEST

我们看到,执行该应用程序不到一秒钟。

现在,在受信任的应用程序列表中添加repro.app:系统偏好设置->安全和隐私->隐私标签->可访问性->在列表中添加repro.app

再次运行该应用程序:

$ date && open repro.app && date
Ven 10 mai 2019 17:06:31 CEST
Ven 10 mai 2019 17:06:36 CEST

这一次要花费5秒钟以上的时间来执行。

此示例二进制文件相对较快,但是我正在处理的应用程序需要几分钟才能启动。问题出在哪里?

1 个答案:

答案 0 :(得分:0)

正如@KenThomases在评论中解释的那样,我必须签署我的申请。为此,我创建了一个self-signed certificate

然后,我只需要使用codesign对我的应用进行签名:

$ codesign --deep -s MyIdentity repro.app

在我的玩具示例中,--deep选项没有用,但是我必须使用它来签署我正在处理的应用程序的所有依赖关系。

要完成此操作,我必须在“系统偏好设置”中停用/重新激活我的应用程序的权限。如果我运行它:

$ date && open repro.app && date
Lun 13 mai 2019 17:27:32 CEST
Lun 13 mai 2019 17:27:32 CEST