<div dir="ltr"><div>Hello all,<br></div><div><br></div><div>i using soot to build the call graph<br></div><div><br></div><div>because i need the call graph about apk file for my research</div><div><br></div><div>i have using this pages code https://groups.google.com/forum/#!searchin/soot-list/apk$20call$20graph/soot-list/pBLFCnoQeeo/oU6ua1GbiJEJ</div><div><br></div><div>but i can't fix the error at message 18</div><div><br></div><div>can anyone help me?&nbsp;</div><div><br></div><div>thx</div><div><br></div><div>error info</div><div><br></div><div><div>Exception in thread "main" java.lang.NullPointerException</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at test.DotGraph.getNode(DotGraph.java:58)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at test.DotGraph.drawNode(DotGraph.java:67)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at test.a.visit(a.java:125)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at test.a.main(a.java:104)</div></div><div><br></div><div><br></div><div><br></div><div><br></div><div>mycode</div><div>---------------------------</div><div>title a.java</div><div><br></div><div><div>package test;</div><div><br></div><div>import java.io.BufferedOutputStream;</div><div>import java.io.FileOutputStream;</div><div>import java.io.IOException;</div><div>import java.io.OutputStream;</div><div>import java.util.Collections;</div><div>import java.util.HashMap;</div><div>import java.util.HashSet;</div><div>import java.util.Iterator;</div><div>import java.util.LinkedList;</div><div>import java.util.List;</div><div><br></div><div>import org.xmlpull.v1.XmlPullParserException;</div><div><br></div><div>import soot.MethodOrMethodContext;</div><div>import soot.PackManager;</div><div>import soot.Scene;</div><div>import soot.SootClass;</div><div>import soot.SootMethod;</div><div>import soot.jimple.infoflow.android.SetupApplication;</div><div>import soot.jimple.toolkits.callgraph.CHATransformer;</div><div>import soot.jimple.toolkits.callgraph.CallGraph;</div><div>import soot.jimple.toolkits.callgraph.Targets;</div><div>import soot.options.Options;</div><div>import soot.util.dot.DotGraphUtility;</div><div>import soot.util.dot.Renderable;</div><div>import soot.util.dot.DotGraphNode;</div><div><br></div><div>public class a {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>private static DotGraph dot = new DotGraph("CallGraph");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public static HashMap &lt;String,Boolean&gt; visited = new HashMap&lt;String,Boolean&gt;();</div><div>public a() {</div><div><br></div><div>// TODO Auto-generated constructor stub</div><div><br></div><div>}</div><div><br></div><div>public static void main(String[] args) {</div><div><br></div><div>// TODO Auto-generated method stub</div><div><br></div><div>SetupApplication app = new SetupApplication("c:/sdk/platforms","c:/apk/recognizer.apk");</div><div><br></div><div>try {</div><div><br></div><div>app.calculateSourcesSinksEntrypoints("C:/call graph test/soot workspace/soot-test/SourcesAndSinks.txt");</div><div><br></div><div>} catch (IOException e) {</div><div><br></div><div>// TODO Auto-generated catch block</div><div><br></div><div>e.printStackTrace();</div><div><br></div><div>} catch (XmlPullParserException e) {</div><div><br></div><div>// TODO Auto-generated catch block</div><div><br></div><div>e.printStackTrace();</div><div><br></div><div>}</div><div><br></div><div>soot.G.reset();</div><div><br></div><div>Options.v().set_src_prec(Options.src_prec_apk);</div><div><br></div><div>Options.v().set_process_dir(Collections.singletonList("c:/apk/recognizer.apk"));</div><div><br></div><div>Options.v().set_android_jars("c:/sdk/platforms");</div><div><br></div><div>Options.v().set_whole_program(true);</div><div><br></div><div>Options.v().set_allow_phantom_refs(true);</div><div><br></div><div>Options.v().set_output_format(Options.output_format_none);</div><div><br></div><div>Options.v().setPhaseOption("cg", "on");</div><div><br></div><div>Scene.v().loadNecessaryClasses();</div><div><br></div><div>SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();</div><div><br></div><div>Options.v().set_main_class(entryPoint.getSignature());</div><div><br></div><div>Scene.v().setEntryPoints(Collections.singletonList(entryPoint));</div><div><br></div><div>System.out.println("............"+entryPoint.getActiveBody());</div><div><br></div><div>PackManager.v().runPacks();</div><div><br></div><div>System.out.println();</div><div><br></div><div>System.out.println(Scene.v().getCallGraph().listener());</div><div><br></div><div>System.out.println("777"+entryPoint+"777");</div><div><br></div><div><br></div><div>CallGraph cg = Scene.v().getCallGraph();</div><div><br></div><div><br></div><div><br></div><div>visit(cg,entryPoint);</div><div>dot.plot("C:/"+ dot.DOT_EXTENSION);</div><div><br></div><div>}</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>private static void visit(CallGraph cg, SootMethod k)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>String identifier = k.getName();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>System.out.println("identifier:"+identifier);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(k.getName()!=k.getSignature())</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>System.out.println("yes111");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>visited.put(k.getSignature(),true);<span class="Apple-tab-span" style="white-space:pre">                        </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>System.out.println("getSignature():"+k.getSignature());</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>System.out.println("visited:"+visited);</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>dot.drawNode(identifier);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>//iterate over unvisited parents</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Iterator&lt;MethodOrMethodContext&gt; ptargets = new Targets(cg.edgesInto(k));</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(ptargets != null){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>while(ptargets.hasNext())</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>SootMethod p = (SootMethod) ptargets.next();</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(p == null) System.out.println("p is null");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if(!visited.containsKey(p.getSignature()))</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>visit(cg,p);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>//iterate over unvisited children</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Iterator&lt;MethodOrMethodContext&gt; ctargets = new Targets(cg.edgesOutOf(k));</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(ctargets != null){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>while(ctargets.hasNext())</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>SootMethod c = (SootMethod) ctargets.next();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(c == null) System.out.println("c is null");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>dot.drawEdge(identifier, c.getName());</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(!visited.containsKey(c.getSignature()))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>visit(cg,c);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div>}</div></div><div><br></div><div>-----</div><div><br></div><div><div>package test;</div><div><br></div><div>import java.io.BufferedOutputStream;</div><div>import java.io.FileOutputStream;</div><div>import java.io.IOException;</div><div>import java.io.OutputStream;</div><div>import java.util.HashMap;</div><div>import java.util.LinkedList;</div><div>import java.util.List;</div><div><br></div><div>import soot.util.dot.DotGraphEdge;</div><div>import soot.util.dot.DotGraphNode;</div><div>import soot.util.dot.DotGraphUtility;</div><div>import soot.util.dot.Renderable;</div><div>import soot.util.dot.DotGraphNode;</div><div><br></div><div>public class DotGraph implements Renderable</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public final static String DOT_EXTENSION = ".dot";</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>private HashMap &lt;String,DotGraphNode&gt; nodes;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>private boolean isSubGraph;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>private List&lt;Renderable&gt; drawElements;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>private String graphname;</div><div>public DotGraph(String graphname)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>this.drawElements = new LinkedList&lt;Renderable&gt;();</div><div>}</div><div>public DotGraph createSubGraph(String label)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>DotGraph subgraph = new DotGraph(label);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>subgraph.isSubGraph = true;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>this.drawElements.add(subgraph);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println(subgraph);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return subgraph;</div><div>}</div><div>@Override</div><div>public void render(OutputStream out, int indent) throws IOException {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>String graphname = this.graphname;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp;if (!isSubGraph) {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp; &nbsp;DotGraphUtility.renderLine(out, "digraph \""+graphname+"\" {", indent);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp;} else {</div><div>&nbsp;DotGraphUtility.renderLine(out, "subgraph \""+graphname+"\" {", indent);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp; &nbsp;}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div>}</div><div>public void plot(String filename) {</div><div>&nbsp; &nbsp; try {</div><div>&nbsp; &nbsp; &nbsp; BufferedOutputStream out =new BufferedOutputStream(new FileOutputStream(filename));</div><div>&nbsp; &nbsp; &nbsp; render(out, 0);</div><div>&nbsp; &nbsp; &nbsp; out.close();</div><div>&nbsp; &nbsp; } catch (IOException ioe) {</div><div>&nbsp; &nbsp; }</div><div>&nbsp; }</div><div>public DotGraphNode getNode(String name){</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println("nodes:"+nodes);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println("name:"+name);</div><div>DotGraphNode node = nodes.get(name);</div><div>if (node == null) {</div><div>node = new DotGraphNode(name);</div><div>nodes.put(name, node);</div><div>}</div><div>return node;</div><div>}</div><div>public DotGraphNode drawNode(String name){</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div>DotGraphNode node = getNode(name);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(node == null)<span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>throw new RuntimeException("Assertion failed.");<span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!this.drawElements.contains(node))<span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>this.drawElements.add(node);</div><div>return node;</div><div>&nbsp; }</div><div><br></div><div>public DotGraphEdge drawEdge(String from, String to) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>DotGraphNode src = drawNode(from);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>DotGraphNode dst = drawNode(to);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>DotGraphEdge edge = new DotGraphEdge(src, dst);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>this.drawElements.add(edge);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return edge;</div><div><br></div><div>&nbsp; }</div><div>}&nbsp;</div></div><div><br></div><div><br></div><div><br></div></div>