10

现在,Apple 正在运行某种静态分析来自动检查私有 API 的使用,许多人因为 Three20 库而被捕。我使用另一个第三方库(我自己从代码编译),我想在提交给 Apple 之前自动审核它以供私有 API 使用,这样我就可以消除/重新编写这些部分。

如果我nm在我的应用程序可执行文件上运行,我会得到一个符号列表,并且我会在其中看到我不使用的符号。例如,我看到 _AudioServicesPlaySystemSound,如果我在 XCode 中搜索“AudioServicesPlaySystemSound”,我没有得到任何结果。有什么方法可以自动区分对私有 API 的调用,例如我注意到 Apple 习惯用初始下划线命名它们。

但是:如果我故意包含对私有 API 的调用,它不会显示在 的输出中nm,但如果我strings在二进制文件上运行,它会显示。基于此,我的一个想法是将所有私有 API 调用的巨大列表编译成一个巨大的表,并在字符串输出中自动搜索它们。我还没有这样做。

有没有人有关于如何自动捕捉这些东西的任何提示,所以我只经历一次审查过程?

4

2 回答 2

6

您可以尝试在目标文件上运行 nm 而不是链接的可执行文件:

nm -g -j *.o  | sort | uniq

对象应位于build/<app>.build/*/<app>.build/Objects-normal子目录中。

您看到的是对的引用,AudioServicesPlaySystemSound因为您调用的函数之一依次调用了AudioServicesPlaySystemSound.

Objective C 调用通常不会出现在nm转储中,您需要使用otool它:

otool -ov <object file>
于 2009-12-08T00:48:22.943 回答
3

使用这个开发工具App Scanner。它会扫描您的 .app 文件以查找私有 API 方法。未来的版本还将检查私有 API 实例变量。

于 2010-10-10T18:29:26.607 回答