<div dir="ltr">So if I wanted to generate a call graph for WifiManager.java (<a href="http://androidxref.com/5.1.0_r1/xref/frameworks/base/wifi/java/android/net/wifi/WifiManager.java" target="_blank">http://androidxref.com/5.1.0_r1/xref/frameworks/base/wifi/java/android/net/wifi/WifiManager.java</a>) a class within the Android framework. Would I have to create and compile a main.java that instantiates a WifiManager object on the fly, pass that to Soot and then generate the call graph with the dynamically created main file as my starting point?<div><br></div><div>So the code would change a bit to:</div><div><br></div><div>dynamically create the java file:</div><div><br>public static void main(String[] args) {</div><div> WifiManager m = new WifiManager();</div><div>}</div><div><br></div><div>as main.java</div><div><br></div><div>Run the following command:<br>
<p><span>java -cp ../bin/jasminclasses</span><span>-2</span><span>.</span><span>4</span><span>.</span><span>0</span><span>.jar:../bin/polyglot.jar:../bin/sootclasses</span><span>-2</span><span>.</span><span>4</span><span>.</span><span>0</span><span>.jar:../soot/DumpClass/bin:. callGrapher.GenerateCallGraph WifiManager.java</span></p><br></div><div><span style="font-size:12.8000001907349px"><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">public</span></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">static</span></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">void</span></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> main(String[] </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">args</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">) {</span></p></span><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> Scene.<i>v</i>().loadNecessaryClasses();</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> SootClass </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">sc</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> = Scene.<i>v</i>()</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> .forceResolve(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">args[0]</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">, SootClass.</span><b><i><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(0,0,192)">BODIES</span></i></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">sc</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.setApplicationClass();</span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> SootMethod </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">method</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> = </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">sc</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.getMethodByName(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">"main"</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> List<SootMethod> </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">entryPoints</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> = </span><b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">new</span></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> ArrayList<SootMethod>();</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">entryPoints</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.add(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">method</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> Scene.<i>v</i>().setEntryPoints(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">entryPoints</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> Options.<i>v</i>().set_main_class(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">method</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.getSignature());</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> PackManager.<i>v</i>().runPacks();</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> CallGraph </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">callgraph</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> = Scene.<i>v</i>().getCallGraph();</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> System.</span><b><i><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(0,0,192)">out</span></i></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.println(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">"[TestSpark] Call graph size "</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> + </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">callgraph</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.size());</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">for</span></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> (Edge </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">edge</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> : </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">callgraph</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">)</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> System.</span><b><i><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(0,0,192)">out</span></i></b><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">.println(</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">edge</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> + </span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">""</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span lang="EN-US" style="font-size:10pt;font-family:Consolas;color:black"> }</span></p></div><div><div><br></div><div>Assuming this is the case, I'd have to do this for any class or file I'd want to generate a callgraph for within the Android framework, is that correct?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 27, 2015 at 3:14 AM, Steven Arzt <span dir="ltr"><<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="DE" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hi Jason,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">You should never need to call „loadClassAndSupport“ on your own. This is done internally by Soot.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">For creating a callgraph, you need an entry point. For normal Java applications, this is the main() method. You can either explicitly specify it or have Soot automatically select the only main() method in your Soot classpath.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">The easiest way to get a callgraph is to call the Soot main method and pass the correct command-line parameters:<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> -p cg.spark on This enables SPARK<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> -process-dir Path to the classes you want to analyze<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> -cp Path to other classes that might be referenced from your analysis target<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> -main-class The main class to use<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">After the call to soot.Main.main(), you should be able to access the callgraph.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">A more involved example that calls the required parts of Soot manually goes here:<u></u><u></u></span></p><span><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#7f0055">public</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#7f0055">static</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#7f0055">void</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> main(String[] </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">args</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">) {</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p></span><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> Options.<i>v</i>().parse(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">args</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> Scene.<i>v</i>().loadNecessaryClasses();</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> SootClass </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">sc</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> = Scene.<i>v</i>()</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> .forceResolve(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#2a00ff">"soot.Examples"</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">, SootClass.</span><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#0000c0">BODIES</span></i></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">sc</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.setApplicationClass();</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> SootMethod </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">method</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">sc</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.getMethodByName(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#2a00ff">"main"</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> List<SootMethod> </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">entryPoints</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> = </span><b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#7f0055">new</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> ArrayList<SootMethod>();</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">entryPoints</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.add(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">method</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> Scene.<i>v</i>().setEntryPoints(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">entryPoints</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> Options.<i>v</i>().set_main_class(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">method</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.getSignature());</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> PackManager.<i>v</i>().runPacks();</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> CallGraph </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">callgraph</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> = Scene.<i>v</i>().getCallGraph();</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> System.</span><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#0000c0">out</span></i></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.println(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#2a00ff">"[TestSpark] Call graph size "</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> + </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">callgraph</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.size());</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> </span><b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#7f0055">for</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> (Edge </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">edge</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> : </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">callgraph</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> System.</span><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#0000c0">out</span></i></b><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">.println(</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#6a3e3e">edge</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> + </span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#2a00ff">""</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:black"> }</span><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">This is essentially what the normal Soot main method would do.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Best regards,<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> Steven<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">Von:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> <a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a> [mailto:<a href="mailto:soot-list-bounces@CS.McGill.CA" target="_blank">soot-list-bounces@CS.McGill.CA</a>] <b>Im Auftrag von </b>Jason Ott<br><b>Gesendet:</b> Mittwoch, 25. März 2015 06:31<br><b>An:</b> <a href="mailto:soot-list@CS.McGill.CA" target="_blank">soot-list@CS.McGill.CA</a><br><b>Betreff:</b> [Soot-list] Spark & Android Source Code no main class<u></u><u></u></span></p><div><div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">I would like to build a callgraph for each class of the android framework and I am struggling. I haven't found much in the way of documentation or examples for using SPARK in general.<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I have a basic program that does the following:<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">public class DumpClass {<u></u><u></u></p></div><div><p class="MsoNormal">public static void main(String[] args) {<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Scene.v().loadBasicClasses();<u></u><u></u></p></div><div><div><p class="MsoNormal"> SootClass mclass;<u></u><u></u></p></div></div><div><p class="MsoNormal"> mclass = Scene.v().loadClassAndSupport(args[0]);<u></u><u></u></p></div><div><div><p class="MsoNormal"> mclass.setApplicationClass();<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"> Options.v().set_whole_program(true);<u></u><u></u></p></div><div><p class="MsoNormal"> Options.v().setPhaseOption("cg.spark", "on");<u></u><u></u></p></div><div><p class="MsoNormal"> Scene.v().loadNecessaryClasses();<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"> Options.v().set_main_class(mclass.getMethods().get(0).toString());<u></u><u></u></p></div><div><p class="MsoNormal"> PackManager.v().runPacks();<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"> new SparkTest(mclass);<u></u><u></u></p></div></div><div><p class="MsoNormal"> }<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Now, when I run this, I get: Exception in thread "main" java.lang.RuntimeException: There is no main class set!<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I'm not quite sure what to do with that or what to do next if this thing ever works.<u></u><u></u></p></div></div></div></div></div></div></blockquote></div><br></div></div>