Сгенерировать график вызовов apk с помощью сажи - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь получить график вызовов приложения для 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)>

Как видите, в классе приложений нет никаких граней, связанных с классами приложения.результирующий граф вызовов.Что я делаю не так?

...