2012-01-05 34 views
8

Ứng dụng của tôi sử dụng thư viện được chia sẻ riêng (.so), tôi đang tải nó bằng cách gọi System.loadLibrary("xxx"). Nó tải tốt và tôi có thể gọi các phương pháp bản địa.Cách phát hiện thư viện được chia sẻ nào được tải bởi ứng dụng Android

Tôi tự hỏi liệu có khả năng phát hiện ứng dụng thư viện dùng chung nào không. Tôi đã cố gắng liệt kê các thư viện được tải bởi PackageManager:

PackageManager pm = getPackageManager(); 
String applicationPackage = this.getApplicationInfo().packageName; 
ApplicationInfo ai = pm.getApplicationInfo(applicationPackage, PackageManager.GET_SHARED_LIBRARY_FILES); 
String[] soFiles = ai.sharedLibraryFiles; 

nhưng nó trả về một danh sách trống. Nó chỉ hoạt động nếu ứng dụng của tôi sử dụng một số thư viện .jar như com.google.android.maps mà tôi chỉ định bằng uses-library trong thẻ ứng dụng của tệp kê khai.

Tôi có thể liệt kê các thư viện .so như thế nào?

Trả lời

13

Giải pháp là đơn giản, nhiều nhờ @ thuộc về pháp quan-droid

try { 
     Set<String> libs = new HashSet<String>(); 
     String mapsFile = "/proc/" + android.os.Process.myPid() + "/maps"; 
     BufferedReader reader = new BufferedReader(new FileReader(mapsFile)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      if (line.endsWith(".so")) { 
       int n = line.lastIndexOf(" "); 
       libs.add(line.substring(n + 1)); 
      } 
     } 
     Log.d("Ldd", libs.size() + " libraries:"); 
     for (String lib : libs) { 
      Log.d("Ldd", lib); 
     } 
    } catch (FileNotFoundException e) { 
     // Do some error handling... 
    } catch (IOException e) { 
     // Do some error handling... 
    } 
1

Sử dụng mã này để liệt kê các thư viện bản địa chia sẻ rằng có thể được nạp từ ứng dụng của bạn:

final File nativeLibraryDir = new File(getApplicationInfo().nativeLibraryDir); 
final String[] primaryNativeLibraries = nativeLibraryDir.list(); 
Các vấn đề liên quan