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