我對iOS上的框架感到困惑。我認爲它們基本上是一個包含動態庫,標題和資源的目錄。位於文件系統中的iOS框架二進制文件在哪裏?
但是在我的設備中,System/Library/Frameworks中的框架目錄不包含動態庫。這怎麼可能?當需要它的應用程序啓動時,它不應該出現在內存中嗎?
我對iOS上的框架感到困惑。我認爲它們基本上是一個包含動態庫,標題和資源的目錄。位於文件系統中的iOS框架二進制文件在哪裏?
但是在我的設備中,System/Library/Frameworks中的框架目錄不包含動態庫。這怎麼可能?當需要它的應用程序啓動時,它不應該出現在內存中嗎?
二進制文件不再存在於設備上(並且自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/。
我也注意到了這一點。奇怪。我無法解釋給你聽「他們是」,但我觀察,例如:
如果我列出了一個(私人)框架目錄:
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