12

我对 iOS 上的框架有点困惑。我认为它们基本上是一个包含动态库、标题和资源的目录。

但在我的设备中,System/Library/Frameworks 中的 frameworks 目录不包含动态库。这怎么可能?当需要它的应用程序启动时,它不应该被加载到内存中吗?

4

2 回答 2

22

二进制文件不再存在于设备上(自 iOS 3.1 以来也不再存在):Apple 已将它们全部合并到一个大mmap()的缓存文件中,以使应用程序启动更加高效。由于页面通常永远不会改变,内核可以在每个运行的映像之间有效地共享它们。您仍然可以dlopen()在缓存中保存的文件上使用,当给定库存在于缓存中时,作为dyld短路文件查找。

缓存文件位于 中,并以体系结构(或)/System/Library/Caches/com.apple.dyld命名。可以使用dsc_extractor或 KennyTM 的 dyld_decache来提取其中的库,在这个存储库中可用,但是一旦提取它们实际上就不能正确地加载到内存中(因为它们都有效地将它们的符号表合并到缓存中。)armv6armv7

这里有一些更好的(虽然更老,信息更少,更深入)的文章:http: //blog.howett.net/2009/09/cache-or-check/

于 2012-06-02T03:09:18.700 回答
3

我也注意到了这一点。奇怪的。我无法向您解释“它们在哪里”,但我观察到,例如:

如果我列出一个(私有)框架目录:

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/BluetoothManagerdylib 文件。 但是,此代码实际上确实可以动态打开该框架,就好像该文件存在一样:

handle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_LAZY);

使用find根文件系统 ("/") 位置的命令也找不到名为BluetoothManager的设备上的文件。

我知道这可能不是您正在寻找的答案,但取决于您想知道的原因,也许它有帮助?

于 2012-06-01T23:06:03.597 回答