Где бинарные файлы фреймворков iOS расположены в файловой системе?
Я немного запутался насчет фреймворков на iOS. Я думаю, что это в основном каталог, содержащий динамическую библиотеку, заголовки и ресурсы.
Но в моем устройстве каталоги каркасов в System/Library/Frameworks не содержат динамическую библиотеку. Как это возможно? Разве он не должен присутствовать для загрузки в память при запуске приложения, которое требует его?
2 ответа
Двоичные файлы больше не существуют на устройстве (и не существуют с iOS 3.1): Apple объединила их в один большой mmap()
'ed кеш-файл, чтобы сделать запуск приложения немного более эффективным. Поскольку страницы обычно никогда не меняются, ядро может эффективно делить их между каждым запущенным образом. Вы все еще можете использовать dlopen()
для файлов, хранящихся в кэше, как dyld
поиск файлов с короткими замыканиями, когда указанная библиотека существует в кеше.
Кеш файл находится в /System/Library/Caches/com.apple.dyld
и назван в честь архитектуры (armv6
или же armv7
). Библиотеки внутри могут быть извлечены с использованием dsc_extractor или dyld_decache от KennyTM, доступных в этом репозитории, но после извлечения они не могут быть загружены в память должным образом (поскольку все они эффективно объединяют свои таблицы символов в кеше).
Здесь есть немного лучше (хотя и старше и менее информировано, более подробно): http://blog.howett.net/2009/09/cache-or-check/.
Я тоже это заметил. Странный. Я не могу объяснить вам "где они", но я заметил, например:
Если я перечислю (частный) каталог фреймворка:
iPhone4:/System/Library/PrivateFrameworks/BluetoothManager.framework root# ls -alt
total 8
lrwxr-xr-x 1 root wheel 28 Nov 4 2011 CodeResources -> _CodeSignature/CodeResources
drwxr-xr-x 3 root wheel 170 Nov 2 2011 ./
drwxr-xr-x 2 root wheel 102 Nov 2 2011 _CodeSignature/
-rw-r--r-- 1 root wheel 740 Nov 2 2011 Info.plist
drwxr-xr-x 170 root wheel 5814 Dec 31 2007 ../
iPhone4:/System/Library/PrivateFrameworks/BluetoothManager.framework root# ls -alt _CodeSignature/
total 0
drwxr-xr-x 3 root wheel 170 Nov 2 2011 ../
drwxr-xr-x 2 root wheel 102 Nov 2 2011 ./
-rw-r--r-- 1 root wheel 1222 Nov 2 2011 CodeResources
Вы не видите BluetoothManager.framework/BluetoothManager
Дилиб файл. Однако этот код на самом деле работает для динамического открытия этой структуры, как будто этот файл существует:
handle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_LAZY);
С использованием find
Команда из корневой файловой системы ("/") также не находит файл на устройстве с именем BluetoothManager.
Я знаю, что это, вероятно, не тот ответ, который вы ищете, но в зависимости от того, почему вы хотите знать, может быть, это поможет?