Как обнаружить и избежать использования частных API в сторонних библиотеках
-
16-09-2019 - |
Вопрос
Теперь, когда Apple проводит своего рода статический анализ для автоматической проверки использования частного API, несколько человек были пойманы из-за библиотеки Three20.Я использую другую стороннюю библиотеку (которую я компилирую самостоятельно из кода), и мне хотелось бы автоматически проверять ее на предмет использования частного API, прежде чем отправлять в Apple, чтобы я мог исключить или переписать эти части.
Если я побегу nm
в исполняемом файле моего приложения я получаю список символов и вижу там символы, которые не использую.Например, я вижу _AudioServicesPlaySystemSound, и если я ищу «AudioServicesPlaySystemSound» в XCode, я не получаю результатов.Есть ли способ автоматически различать вызовы частных API? Например, я заметил, что у Apple есть привычка называть их с помощью начального подчеркивания.
Однако:если я намеренно включаю вызов частного API, он не отображается в выводе nm
, но оно появится, если я забегу strings
на двоичном формате.Основываясь на этом, у меня возникла идея собрать огромный список всех вызовов частных API в огромную таблицу и автоматически искать их в выходных строках.Я еще этого не сделал.
Есть ли у кого-нибудь какие-нибудь советы о том, как автоматически отловить это, чтобы я прошёл процесс проверки только один раз?
Решение
Вы можете попробовать запустить nm для объектных файлов вместо связанного исполняемого файла:
nm -g -j *.o | sort | uniq
Объекты должны находиться в build/<app>.build/*/<app>.build/Objects-normal
подкаталог.
Вы видите ссылку на AudioServicesPlaySystemSound
потому что одна из функций, которые вы вызвали, в свою очередь, вызывает AudioServicesPlaySystemSound
.
Вызовы Objective C обычно не отображаются в nm
дампы, вам нужно будет использовать otool
для этого:
otool -ov <object file>
Другие советы
Используйте этот инструмент разработчика, Сканер приложений.Он сканирует ваш файл .app на наличие частных методов API.В будущем выпуске также будут проверяться частные переменные экземпляра API.