关于iOS中的框架,我有些困惑。我认为它们基本上是包含动态库、头文件和资源的目录。
但是在我的设备上,System/Library/Frameworks中的框架目录不包含动态库。这怎么可能呢?难道不应该在需要加载的应用程序启动时存在于内存中吗?
mmap()
缓存文件,以使应用程序启动更加高效。由于页面通常几乎永远不会改变,内核可以在每个运行中的图像之间有效地共享它们。您仍然可以使用 dlopen()
加载缓存中保存的文件,因为当所给库存在于缓存中时,dyld
会绕过文件查找。/System/Library/Caches/com.apple.dyld
,并以架构命名(armv6
或 armv7
)。其中的库可以使用 dsc_extractor 或 KennyTM 的 dyld_decache 提取,可在 此存储库 中获取,但一旦提取,它们实际上无法正确加载到内存中(因为它们的符号表在缓存中被合并了)。我也注意到这一点,很奇怪。我无法向您解释“它们在哪里”,但例如我观察到:
如果我列出一个(私有的)框架目录:
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 的文件。