Как обнаружить и избежать использования частных API в сторонних библиотеках

Теперь, когда Apple запускает своего рода статический анализ для автоматической проверки использования частного API, несколько человек были пойманы из-за библиотеки Three20. Я использую другую стороннюю библиотеку (которую я компилирую из кода), и я хотел бы автоматически проверять ее на предмет использования частного API перед отправкой в ​​Apple, чтобы я мог удалить / переписать эти части.

Если я запускаю nm в своем исполняемом файле приложения, я получаю список символов, и я вижу в нем символы, которые я не использую. Например, я вижу _AudioServicesPlaySystemSound, и если я ищу «AudioServicesPlaySystemSound» в XCode, я не получаю результатов. Есть ли способ автоматически различать вызовы частных API-интерфейсов? Например, я заметил, что Apple имеет привычку называть их с начальным подчеркиванием.

Однако: если я намеренно включаю вызов частного API, он не отображается в выводе nm, но появляется, если я запускаю strings в двоичном файле. Исходя из этого, у меня была одна идея: скомпилировать огромный список всех частных вызовов API в огромную таблицу и автоматически искать их в выводах строк. Я еще этого не делал.

Есть ли у кого-нибудь советы о том, как автоматически отловить этот материал, поэтому я прохожу процесс проверки только один раз?


person Simon Woodside    schedule 08.12.2009    source источник
comment
Они возражают против Three20? Это на самом деле написано разработчиком, создавшим приложение Facebook для iPhone. Если ваше приложение отклонено из-за Three20, приложение Facebook тоже должно быть ... Хех. Просто говорю ;-)   -  person Ben Gotow    schedule 08.12.2009
comment
Ага ... groups.google.com/group/three20/browse_thread/ поток /   -  person Simon Woodside    schedule 08.12.2009
comment
Я предполагаю, что в следующий раз, когда Facebook представит обновление, они будут отклонены, если они не будут использовать последнюю версию, которая соответствует политикам Apple.   -  person bpapa    schedule 08.12.2009


Ответы (2)


Вы можете попробовать запустить nm для объектных файлов вместо связанного исполняемого файла:

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

Объекты должны находиться в подкаталоге build/<app>.build/*/<app>.build/Objects-normal.

Вы видите ссылку на AudioServicesPlaySystemSound, потому что одна из вызываемых вами функций, в свою очередь, вызывает AudioServicesPlaySystemSound.

Вызовы Objective C обычно не отображаются в nm дампах, для этого вам нужно использовать otool:

otool -ov <object file>
person codelogic    schedule 08.12.2009

Воспользуйтесь этим инструментом разработки, сканером приложений. Он сканирует ваш файл .app на предмет частных методов API. В следующем выпуске также будут проверяться частные переменные экземпляра API.

person Andrew    schedule 10.10.2010
comment
Проект мертв и релизов нет. - person William Entriken; 28.03.2017