iOS框架二进制文件在文件系统中的哪个位置?

13

关于iOS中的框架,我有些困惑。我认为它们基本上是包含动态库、头文件和资源的目录。

但是在我的设备上,System/Library/Frameworks中的框架目录不包含动态库。这怎么可能呢?难道不应该在需要加载的应用程序启动时存在于内存中吗?

2个回答

23
二进制文件不再存在于设备上(自 iOS 3.1 起就是这样):苹果已将它们全部合并为一个大的 mmap() 缓存文件,以使应用程序启动更加高效。由于页面通常几乎永远不会改变,内核可以在每个运行中的图像之间有效地共享它们。您仍然可以使用 dlopen() 加载缓存中保存的文件,因为当所给库存在于缓存中时,dyld 会绕过文件查找。
缓存文件位于 /System/Library/Caches/com.apple.dyld,并以架构命名(armv6armv7)。其中的库可以使用 dsc_extractor 或 KennyTM 的 dyld_decache 提取,可在 此存储库 中获取,但一旦提取,它们实际上无法正确加载到内存中(因为它们的符号表在缓存中被合并了)。
这里有一篇更好的文章(虽然比较陈旧且不太详细):http://blog.howett.net/2009/09/cache-or-check/

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 的文件。
我知道这可能不是你想要的答案,但根据你想知道的原因,也许可以有所帮助?

你是如何在iPhone4上执行ls命令的?手机越狱了吗? - gabbler
@gabbler,是的,这是一个越狱的iPhone 4,并启用了ssh访问。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接