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

我对iOS上的框架感到困惑。 我认为他们基本上是一个包含dynamic库,标题和资源的目录。

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

该二进制文件不再存在于设备上(自iOS 3.1以后就没有了):苹果已经将它们全部合并为一个大的mmap()编辑caching文件,以使应用程序启动更有效率。 由于页面通常不会改变,内核可以在每个正在运行的映像之间有效地共享它们。 您仍然可以对caching中保存的文件使用dlopen() ,因为当caching中存在给定的库时,会对dyld进行短路文件查找。

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

在这里有一些更好的(尽pipe更老,更less,更深入): 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文件。 但是,这段代码确实可以dynamic地打开该框架,就像该文件存在一样:

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

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

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