2010-04-08 46 views
9

Thư viện được chia sẻ. Các tệp được đặt trong lib/armeabi trong tệp APK.Cách lấy đường dẫn đến thư mục lib cho gói đã cài đặt

Tôi đã đọc sau khi cài đặt các libs được chiết xuất để/data/data/application_package/lib

Làm thế nào tôi có thể nhận được đường dẫn chính xác đến thư mục này trong ứng dụng của tôi tại thời gian chạy? Thư mục này có thể đọc được bằng ứng dụng không? Hoặc chỉ có quyền truy cập có thể thực thi được cho phép? Nếu có thể đọc được - Điều này có đúng với các ứng dụng được bảo vệ bản sao không?

Trả lời

11

Bạn có thể lấy đường dẫn chính xác với:

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

Các thư mục và file của nó có thể được đọc bởi ứng dụng.

Quyền unix được đặt thành rwxr-x--x. Vì vậy, các ứng dụng với cùng một nhóm có thể đọc các tệp.

+6

Và trong khi chúng tôi đang ở đó, có ApplicationInfo.nativeLibraryDir :-) – Ilya

28

gia tăng ở mức API 9

getContext().getApplicationInfo().nativeLibraryDir;

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

Đối với khả năng tương thích tốt hơn, sử dụng chức năng sau:

@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

Bạn có chắc chắn bạn có thể tải thư viện gốc từ vị trí này không? – lhunath

+0

Có, tôi đã kiểm tra nó trong ứng dụng của mình. Vấn đề là gì? – Verdigrass

+0

Không hoạt động trên HTC M9 + chạy 5.1.1. Các liên kết lib là có, nhưng không trỏ đến thư mục chính xác. Giải pháp của Crossie (getContext(). GetApplicationInfo(). NativeLibraryDir;) – kshepherd

0

CPU_ABIs Có lẽ một sự hỗ trợ thiết bị khác nhau, vì vậy nó là tốt hơn để có được nativeRootLibraryDir chứa tất cả thư mục lib phụ:

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"; 
} 
Các vấn đề liên quan