如何检测Android应用程序加载了哪些本机共享库

如何检测Android应用程序加载了哪些本机共享库,android,android-ndk,Android,Android Ndk,我的应用程序使用本机共享库(.so),我通过调用System.loadLibrary(“xxx”)来加载它。它加载良好,我可以调用本机方法 我想知道是否有可能检测应用程序使用的共享库。我试图通过PackageManager列出已加载的库: PackageManager pm = getPackageManager(); String applicationPackage = this.getApplicationInfo().packageName; ApplicationInfo ai = p

我的应用程序使用本机共享库(.so),我通过调用
System.loadLibrary(“xxx”)
来加载它。它加载良好,我可以调用本机方法

我想知道是否有可能检测应用程序使用的共享库。我试图通过PackageManager列出已加载的库:

PackageManager pm = getPackageManager();
String applicationPackage = this.getApplicationInfo().packageName;
ApplicationInfo ai = pm.getApplicationInfo(applicationPackage, PackageManager.GET_SHARED_LIBRARY_FILES);
String[] soFiles = ai.sharedLibraryFiles;
但它返回一个空列表。只有当我的应用程序使用一些.jar库(如com.google.android.maps)时,它才起作用,我通过清单的应用程序标记中的
uses library
指定了这些库


我如何列出.so库?

解决方案很简单,这要感谢@praetorian 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...
    }
试试看{
Set libs=new HashSet();
字符串mapsFile=“/proc/”+android.os.Process.myPid()+”/maps”;
BufferedReader reader=新的BufferedReader(新文件读取器(mapsFile));
弦线;
而((line=reader.readLine())!=null){
if(第.endsWith行(“.so”)){
int n=行。最后一个索引(“”);
libs.add(行子字符串(n+1));
}
}
Log.d(“Ldd”,libs.size()+“libraries:”);
for(字符串库:libs){
Log.d(“Ldd”,lib);
}
}catch(filenotfounde异常){
//做一些错误处理。。。
}捕获(IOE异常){
//做一些错误处理。。。
}

使用此代码列出可从应用程序加载的共享本机库:

final File nativeLibraryDir = new File(getApplicationInfo().nativeLibraryDir);
final String[] primaryNativeLibraries = nativeLibraryDir.list();

对于Android加速Oreo emulator映像,我将代码放在一次创建主活动中,然后primaryNativeLibraries为空。这不会列出应用程序使用的所有本机库,只列出直接引用的库。因此,Android 10 Q中的库,eash。因此,上面的列表中有四个条目。安卓9点之前没问题。