Я пытаюсь получить график вызовов приложения для Android, используя сажу.Вот код, который я пробовал:
G.reset();
String apk_path = "/home/ubuntu/data/apks/app-debug.apk";
Options.v().set_src_prec(Options.src_prec_apk);
String AndroidSDKDir = System.getenv("ANDROID_SDK");
String platforms_dir = new StringBuilder(AndroidSDKDir).append("/platforms").toString();
String[] sootArgs = {
"-f", "n",
"-w",
"-android-jars", platforms_dir,
"-allow-phantom-refs",
"-process-dir", apk_path
};
Main.main(sootArgs);
CallGraph cg = Scene.v().getCallGraph();
System.out.println(cg.size());
for (Edge edge: cg) {
SootMethod src = (SootMethod) edge.getSrc();
SootMethod dst = (SootMethod) edge.getTgt();
System.out.println(src.getSignature() + " ====> " + dst.getSignature());
}
Вывод выглядит примерно так:
<java.lang.Thread: void <init>(java.lang.ThreadGroup,java.lang.Runnable)> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.RuntimeException: void <init>(java.lang.String)> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.Object: void <init>()> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.ClassLoader: void <init>()> ====> <java.lang.Object: void <init>()>
<java.security.PrivilegedActionException: void <init>(java.lang.Exception)> ====> <java.lang.Exception: void <init>()>
<java.lang.Thread: void <init>(java.lang.ThreadGroup,java.lang.String)> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.ThreadGroup: void uncaughtException(java.lang.Thread,java.lang.Throwable)> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.Object: void finalize()> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.Object: void <init>()> ====> <java.lang.Object: void finalize()>
<java.lang.Throwable: void <init>()> ====> <java.lang.Object: void <init>()>
<java.lang.Thread: void <init>(java.lang.ThreadGroup,java.lang.String)> ====> <java.lang.Object: void <init>()>
<java.lang.ClassLoader: void <init>()> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.Exception: void <init>()> ====> <java.lang.Throwable: void <init>()>
<java.lang.RuntimeException: void <init>(java.lang.String)> ====> <java.lang.Exception: void <init>()>
<java.security.PrivilegedActionException: void <init>(java.lang.Exception)> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.Exception: void <init>()> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
<java.lang.Thread: void <init>(java.lang.ThreadGroup,java.lang.Runnable)> ====> <java.lang.Object: void <init>()>
<java.lang.Throwable: void <init>()> ====> <java.lang.RuntimeException: void <init>(java.lang.String)>
Как видите, в классе приложений нет никаких граней, связанных с классами приложения.результирующий граф вызовов.Что я делаю не так?