如何检测和避免在第三方库中使用私有API

Sim*_*ide 10 iphone iphone-privateapi

既然Apple正在运行某种静态分析来自动检查私有API的使用,那么很多人都因为Three20库而被捕.我使用另一个第三方库(我自己从代码中编译),我想在提交给Apple之前自动审核它以供私有API使用,所以我可以删除/重写这些部分.

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

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

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

cod*_*gic 6

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

nm -g -j *.o  | sort | uniq
Run Code Online (Sandbox Code Playgroud)

对象应该在build/<app>.build/*/<app>.build/Objects-normal子目录中.

您正在看到一个引用,AudioServicesPlaySystemSound因为您执行的其中一个函数依次调用AudioServicesPlaySystemSound.

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

otool -ov <object file>
Run Code Online (Sandbox Code Playgroud)