2012-05-31 60 views
7

我對iOS上的框架感到困惑。我認爲它們基本上是一個包含動態庫,標題和資源的目錄。位於文件系統中的iOS框架二進制文件在哪裏?

但是在我的設備中,System/Library/Frameworks中的框架目錄不包含動態庫。這怎麼可能?當需要它的應用程序啓動時,它不應該出現在內存中嗎?

回答

13

二進制文件不再存在於設備上(並且自iOS 3.1以後就不存在):Apple已將它們合併爲一個大的mmap()'ed緩存文件,以使應用程序啓動效率更高一些。由於頁面通常不會改變,內核可以在每個正在運行的映像之間有效地共享它們。對緩存中保存的文件仍然可以使用dlopen(),因爲dyld當緩存中存在給定庫時會進行短路文件查找。

緩存文件位於/System/Library/Caches/com.apple.dyld中,並以架構(armv6armv7)命名。該圖書館內可以使用dsc_extractor或KennyTM的dyld_decache中提取,可in this repository,但一旦提取,他們實際上不能加載到內存正確(因爲它們都有效地得到他們的符號表中的高速緩存合併。)

有一個位更好的(儘管年齡較大,信息量較少,更深入)寫在這裏:http://blog.howett.net/2009/09/cache-or-check/

2

我也注意到了這一點。奇怪。我無法解釋給你聽「他們是」,但我觀察,例如:

如果我列出了一個(私人)框架目錄:

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

我知道這可能不是你正在尋找的答案,但取決於爲什麼你想知道,也許它有幫助嗎?

+0

你是怎麼在iPhone4上執行ls命令的,手機是否越獄? – gabbler

+0

@ gabbler,是的,這是一個越獄的iPhone 4,啓用了ssh訪問。 – Nate

相關問題