다른 공유 라이브러리 (.so)에서 호출 프로세스에 의해로드 된 공유 라이브러리를 확인할 수 있습니까? 거기에는 명령 줄 도구가 있지만 C++ 코드에서 이러한 검사를 수행 할 수 있습니까?로드 된 공유 라이브러리를 Linux/Android의 다른 공유 라이브러리에서 확인하십시오.
어떻게 든 Android 애플리케이션에 의해로드 된 네이티브 공유 라이브러리 목록을 가져와야하지만 Java 코드에서는 가능하지 않습니다.
다른 공유 라이브러리 (.so)에서 호출 프로세스에 의해로드 된 공유 라이브러리를 확인할 수 있습니까? 거기에는 명령 줄 도구가 있지만 C++ 코드에서 이러한 검사를 수행 할 수 있습니까?로드 된 공유 라이브러리를 Linux/Android의 다른 공유 라이브러리에서 확인하십시오.
어떻게 든 Android 애플리케이션에 의해로드 된 네이티브 공유 라이브러리 목록을 가져와야하지만 Java 코드에서는 가능하지 않습니다.
/proc/<pid>/maps
파일이나 호출 프로세스에 대해서만 /proc/self/maps
을 사용할 수 있습니다. '.so'로 끝나는 줄은 링크 된 공유 라이브러리 용입니다. 해킹이지만 작동해야합니다. 한 라이브러리를 여러 번 매핑 할 수 있으므로 반복을 건너 뛸 필요가 있습니다.
좋은 소식 : 당신은 자바에서 할 수 있습니다. 아래의 코드는 현재 프로세스의 공유 라이브러리를 logcat에 출력합니다.
try {
Set<String> libs = new HashSet<String>();
String mapsFile = "/proc/self/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...
}
내 장치에 출력된다 : 또한
D/Ldd (11286): 55 libraries:
D/Ldd (11286): /system/lib/libc.so
D/Ldd (11286): /system/lib/libdbus.so
D/Ldd (11286): /system/lib/librpc.so
D/Ldd (11286): /system/lib/libEGL.so
D/Ldd (11286): /system/lib/libstagefright_color_conversion.so
D/Ldd (11286): /system/lib/libmedia.so
D/Ldd (11286): /system/lib/libemoji.so
D/Ldd (11286): /system/lib/libcrypto.so
D/Ldd (11286): /system/lib/libstagefright_avc_common.so
D/Ldd (11286): /system/lib/libnativehelper.so
D/Ldd (11286): /system/lib/libskiagl.so
D/Ldd (11286): /system/lib/libopencore_player.so
D/Ldd (11286): /system/lib/libjpeg.so
D/Ldd (11286): /system/lib/libsurfaceflinger_client.so
D/Ldd (11286): /system/lib/libstagefright.so
D/Ldd (11286): /system/lib/libdrm1.so
D/Ldd (11286): /system/lib/libdvm.so
D/Ldd (11286): /system/lib/libwebcore.so
D/Ldd (11286): /system/lib/libGLESv1_CM.so
D/Ldd (11286): /system/lib/libhardware.so
D/Ldd (11286): /system/lib/libexif.so
D/Ldd (11286): /system/lib/libgps.so
D/Ldd (11286): /system/lib/liblog.so
D/Ldd (11286): /system/lib/libexpat.so
D/Ldd (11286): /system/lib/libopencore_common.so
D/Ldd (11286): /system/lib/libbluedroid.so
D/Ldd (11286): /system/lib/libm.so
D/Ldd (11286): /system/lib/libicui18n.so
D/Ldd (11286): /system/lib/libomx_amrenc_sharedlibrary.so
D/Ldd (11286): /system/lib/libwpa_client.so
D/Ldd (11286): /system/lib/libstdc++.so
D/Ldd (11286): /system/lib/libandroid_runtime.so
D/Ldd (11286): /system/lib/libz.so
D/Ldd (11286): /system/lib/libETC1.so
D/Ldd (11286): /system/lib/libsonivox.so
D/Ldd (11286): /system/lib/libstlport.so
D/Ldd (11286): /system/lib/libutils.so
D/Ldd (11286): /system/lib/libicudata.so
D/Ldd (11286): /system/lib/libsqlite.so
D/Ldd (11286): /system/lib/libhardware_legacy.so
D/Ldd (11286): /system/lib/libpixelflinger.so
D/Ldd (11286): /system/lib/libvorbisidec.so
D/Ldd (11286): /system/lib/libstagefright_amrnb_common.so
D/Ldd (11286): /system/lib/libcutils.so
D/Ldd (11286): /system/lib/libui.so
D/Ldd (11286): /system/lib/libmedia_jni.so
D/Ldd (11286): /system/lib/libomx_sharedlibrary.so
D/Ldd (11286): /system/lib/libcamera_client.so
D/Ldd (11286): /system/lib/libskia.so
D/Ldd (11286): /system/lib/libopencore_net_support.so
D/Ldd (11286): /system/lib/libnetutils.so
D/Ldd (11286): /system/lib/libbinder.so
D/Ldd (11286): /system/lib/libssl.so
D/Ldd (11286): /system/lib/libicuuc.so
D/Ldd (11286): /system/lib/libGLESv2.so
필요한 PID가 android.os.Process.myPid()
함으로써 얻어 질 수있는 경우.
WRT java. 질문에서 .so에 ldd을 호출하는 프로세스를 시작하십시오. 표준 출력에서 출력을 캡처 및 출력 처리 :
Process process = Runtime.getRuntime().exec("ldd a.so");
StreamGobbler outputGobbler = new StreamGobbler(process.getInputStream());
outputGobbler.start();
process.waitFor();
String result = outputGobbler.buffer;
클래스 정의에 대한 StreamGobbler에 정액 게시물을 참조하십시오. String buffer
변수를 추가하고이 행을 System.out.println(type + ">" + line);
으로 바꾸고 이전 링크의 클래스 정의에서 buffer = buffer + line+"\n";
으로 바꿉니다. 분명히 두 번째 인수를 생성자에 전달했습니다.
class StreamGobbler extends Thread
{
InputStream is;
String buffer;
StreamGobbler(InputStream is)
{
this.is = is;
this.buffer = "";
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ((line = br.readLine()) != null)
buffer += line+"\n";
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
안타깝게도 표준 (수정되지 않은) 안드로이드 시스템에는'ldd' 명령이 없습니다. –
'nm'은 어떻습니까? – ajshower
'nm'도 없습니다. grep이나 find 또는 대부분의 다른 표준 유닉스 도구조차 없다. 에뮬레이터에서 확인할 수 있습니다. –
하지만 어떻게 코드에서 사용할 수 있습니까? 명령 줄 도구를 호출하는 것처럼 보입니다 ... – vitakot
아니요,이 작업을 위해 명령 줄 도구가 필요하지 않습니다. 나는 나의 대답을 업데이트했다. –
좋은 예! 하지만 그것은 내게 오류를 보여줍니다 : 메서드 myPid()는 프로세스 유형에 대해 정의되지 않았습니다 ... – vitakot