Где бинарные файлы фреймворков 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.

Я знаю, что это, вероятно, не тот ответ, который вы ищете, но в зависимости от того, почему вы хотите знать, может быть, это поможет?

Другие вопросы по тегам