2012-05-31 12 views
7

Estoy algo confundido acerca de los frameworks en iOS. Creo que básicamente son un directorio que contiene una biblioteca dinámica, encabezados y recursos.¿Dónde están los binarios de marcos de iOS ubicados en el sistema de archivos?

Pero en mi dispositivo los directorios de marcos en System/Library/Frameworks no contienen la biblioteca dinámica. ¿Cómo es esto posible? ¿No debería estar presente para cargarse en la memoria cuando se inicia la aplicación que lo requiere?

Respuesta

13

Los archivos binarios ya no existen en el dispositivo (y no lo han hecho desde iOS 3.1): Apple los ha fusionado a todos en un gran archivo de memoria caché mmap(), para hacer que la aplicación sea un poco más eficiente. Como las páginas generalmente nunca cambian, el kernel puede compartirlas efectivamente entre cada imagen en ejecución. Todavía puede usar dlopen() en archivos almacenados en la memoria caché, como dyld cortocircuitos de búsqueda de archivos cuando la biblioteca dada existe en la memoria caché.

El archivo de caché está en /System/Library/Caches/com.apple.dyld y lleva el nombre de la arquitectura (armv6 o). Las bibliotecas dentro pueden ser extraídos usando dsc_extractor o dyld_decache de KennyTM, disponibles in this repository, pero una vez extraídos en realidad no pueden ser cargados en la memoria correctamente (ya que todos ellos efectivamente consiguen sus tablas de símbolos se fusionaron en la memoria caché.)

hay un poco de un escrito mejor (aunque más antiguo y menos informado, más en profundidad) aquí: http://blog.howett.net/2009/09/cache-or-check/.

2

Me he dado cuenta de esto también. Extraño. No puedo explicar a usted "donde están", pero he observado, por ejemplo:

Si enumero a cabo un directorio (privada) Marco:

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 

no ve un BluetoothManager.framework/BluetoothManager archivo dylib. Sin embargo, este código funciona realmente para abrir dinámicamente ese marco, como si ese archivo existe:

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

Usando el comando find desde el sistema de archivos raíz ("/") ubicación también se encuentra ningún archivo en el dispositivo llamado BluetoothManager.

Sé que probablemente no es la respuesta que está buscando, pero dependiendo de ¿por qué desea saber, quizás esto ayude?

+0

¿Cómo ejecutó un comando ls en iPhone4, fue el teléfono jailbroken? – gabbler

+0

@gabbler, sí, este fue un iPhone 4 con jailbreak, con acceso ssh habilitado. – Nate

Cuestiones relacionadas