我的任务是使用 ddmlib 分析 android 应用程序的方法调用和相应的本机库。我首先创建了一个用于测试目的的简单应用程序,该应用程序使用 jni 来调用用 C 实现的函数(对给定数字求平方)。然后我实现了 IMethodProfilingHandler:
@Override
public void onSuccess(byte[] data, Client client) {
MethodCallExtractor extractor = MethodCallExtractor.GetInstance();
List<MethodCall> calls = extractor.extract(data, client);
System.out.println("methodcalls:");
for(MethodCall call : calls){
System.out.println(call);
}
printNativeLibraries(client);
}
工作并打印 jni 函数的调用。MethodCallExtractor 是一个简单的解析器,它返回一个 MethodCall 列表。我的问题是
private void printNativeLibraries(Client client){
ClientData clientData = client.getClientData();
while(clientData.getNativeLibraryMapInfo().hasNext()){
System.out.println("library: " + clientData.getNativeLibraryMapInfo().next().getLibraryName());
}
}
不打印任何东西。为什么包含我的 C 函数(在我的情况下为 libsquared.so)的库未在 NativeLibraryMapInfo 中列出?我必须触发什么才能正确初始化 NativeLibraryMapInfo?
我花了几个小时试验“requestNativeHeapInformation()”、“requestAllocationDetails()”、“requestThreadUpdate()”和“executeGarbageCollector()”,但没有成功,我找不到任何关于这个问题的有用文档。
我正在使用 ddmlib-r13