2010-04-08 11 views
9

Las bibliotecas compartidas .so los archivos se colocan en lib/armeabi en un archivo apk.Cómo obtener la ruta a la carpeta lib para un paquete instalado

He leído después de la instalación del libs se extrae a/data/data/application_package/lib

¿Cómo puedo obtener la ruta exacta a este directorio en mi aplicación en tiempo de ejecución? ¿La aplicación puede leer este directorio? ¿O solo se permite el acceso ejecutable? Si es legible: ¿esto sigue siendo cierto para las aplicaciones protegidas contra copia?

Respuesta

11

, usted puede obtener la ruta exacta con:

String libraryPath = getContext().getApplicationInfo().dataDir + "/lib"; 

El directorio y sus archivos pueden ser leídos por la aplicación.

Los permisos de unix se establecen en rwxr-x--x. Entonces las aplicaciones con del mismo grupo pueden leer los archivos.

+6

Y mientras estamos en eso, hay ApplicationInfo.nativeLibraryDir :-) – Ilya

28

añadido en el nivel API 9

getContext().getApplicationInfo().nativeLibraryDir;

0
String libraryPath = context.getFilesDir().getParentFile().getPath() + "/lib"; 

Para una mejor compatibilidad, utilice la siguiente función:

@TargetApi(Build.VERSION_CODES.GINGERBREAD) 
public static String getLibraryDirectory(Context context) { 
    int sdk_level = android.os.Build.VERSION.SDK_INT; 

    if (sdk_level >= Build.VERSION_CODES.GINGERBREAD) { 
     return context.getApplicationInfo().nativeLibraryDir; 
    } 
    else if (sdk_level >= Build.VERSION_CODES.DONUT) { 
     return context.getApplicationInfo().dataDir + "/lib"; 
    } 

    return "/data/data/" + context.getPackageName() + "/lib"; 
} 
+0

¿Está seguro de que puede cargar bibliotecas nativas desde esta ubicación? – lhunath

+0

Sí, lo he comprobado en mi aplicación. ¿Cuál es el problema? – Verdigrass

+0

No funciona en HTC M9 + en ejecución 5.1.1. El enlace lib está allí, pero no apunta al directorio correcto. La solución de Crossie sí (getContext(). GetApplicationInfo(). NativeLibraryDir;) – kshepherd

0

Tal vez un soporte de dispositivos diferentes CPU_ABIs, por lo que es mejor para obtener nativeRootLibraryDir que contienen todos los directorios sub lib:

public static String getNativeLibraryDirectory(Context context) { 
    int sdk_level = android.os.Build.VERSION.SDK_INT; 

    if (sdk_level >= Build.VERSION_CODES.GINGERBREAD) { 
     try { 
      String secondary = (String) ApplicationInfo.class.getField("nativeLibraryRootDir").get(context.getApplicationInfo()); 
      return secondary; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    else if (sdk_level >= Build.VERSION_CODES.DONUT) { 
     return context.getApplicationInfo().dataDir + "/lib"; 
    } 

    return "/data/data/" + context.getPackageName() + "/lib"; 
} 
Cuestiones relacionadas