我对 iOS 上的框架有点困惑。我认为它们基本上是一个包含动态库、标题和资源的目录。
但在我的设备中,System/Library/Frameworks 中的 frameworks 目录不包含动态库。这怎么可能?当需要它的应用程序启动时,它不应该被加载到内存中吗?
二进制文件不再存在于设备上(自 iOS 3.1 以来也不再存在):Apple 已将它们全部合并到一个大mmap()
的缓存文件中,以使应用程序启动更加高效。由于页面通常永远不会改变,内核可以在每个运行的映像之间有效地共享它们。您仍然可以dlopen()
在缓存中保存的文件上使用,当给定库存在于缓存中时,作为dyld
短路文件查找。
缓存文件位于 中,并以体系结构(或)/System/Library/Caches/com.apple.dyld
命名。可以使用dsc_extractor或 KennyTM 的 dyld_decache来提取其中的库,在这个存储库中可用,但是一旦提取它们实际上就不能正确地加载到内存中(因为它们都有效地将它们的符号表合并到缓存中。)armv6
armv7
这里有一些更好的(虽然更老,信息更少,更深入)的文章: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
dylib 文件。 但是,此代码实际上确实可以动态打开该框架,就好像该文件存在一样:
handle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_LAZY);
使用find
根文件系统 ("/") 位置的命令也找不到名为BluetoothManager的设备上的文件。
我知道这可能不是您正在寻找的答案,但取决于您想知道的原因,也许它有帮助?