我开发了一个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秒钟以上的时间来执行。
此示例二进制文件相对较快,但是我正在处理的应用程序需要几分钟才能启动。问题出在哪里?
答案 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