<div dir="ltr">Hi Steven,<div><br></div><div>Thanks for your quick reply. I am able to run the code now. But I am getting the warnings as follow :</div><div><br></div><div><div>Warning: java.lang.ref.Finalizer is a phantom class!</div><div>Warning: android.graphics.pdf.PdfDocument$Page is a phantom class!</div><div>Warning: android.graphics.pdf.PdfDocument$PageInfo is a phantom class!</div><div>Warning: android.graphics.pdf.PdfDocument is a phantom class!</div><div>Warning: android.media.RemoteControlClient$OnGetPlaybackPositionListener is a phantom class!</div><div>Warning: android.media.RemoteControlClient$OnPlaybackPositionUpdateListener is a phantom class!</div><div>Warning: android.print.PageRange is a phantom class!</div><div>Warning: android.print.PrintAttributes$Builder is a phantom class!</div><div>Warning: android.print.PrintAttributes$MediaSize is a phantom class!</div><div>Warning: android.print.PrintAttributes is a phantom class!</div><div>Warning: android.print.PrintDocumentAdapter$LayoutResultCallback is a phantom class!</div><div>Warning: android.print.PrintDocumentAdapter$WriteResultCallback is a phantom class!</div><div>Warning: android.print.PrintDocumentAdapter is a phantom class!</div><div>Warning: android.print.PrintDocumentInfo$Builder is a phantom class!</div><div>Warning: android.print.PrintDocumentInfo is a phantom class!</div><div>Warning: android.print.PrintJob is a phantom class!</div><div>Warning: android.print.PrintManager is a phantom class!</div><div>Warning: android.print.pdf.PrintedPdfDocument is a phantom class!</div><div>Warning: android.view.ViewTreeObserver$OnWindowAttachListener is a phantom class!</div><div>Warning: android.view.ViewTreeObserver$OnWindowFocusChangeListener is a phantom class!</div></div><div><br></div><div>May I know the reason, why I am getting these warnings ?</div><div><br></div><div>The command that I am using to run the program is :</div><div><br></div><div>monika@monika-OptiPlex-990:~$ java -cp .:soot-trunk.jar:soot-infoflow.jar:soot-infoflow-android.jar:slf4j-api-1.7.5.jar:slf4j-simple-1.7.5.jar:axml-2.0.jar:/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar CFG<br></div><div><br></div><div>I am attaching the output file with this mail. Please, tell me I am getting it correct or not.</div><div><br></div><div>Thanks and regards,</div><div>Monika</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 25, 2015 at 3:51 PM, Steven Arzt <span dir="ltr">&lt;<a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a>&gt;</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 lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Monika,<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The CFG class is not part of Soot. It was just written as an example. You need to compile it on your own.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:13.5pt;font-family:&quot;Courier New&quot;;color:black">M.Sc. M.Sc. Steven Arzt</span><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Secure Software Engineering Group (SSE)<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">European Center for Security and Privacy by Design (EC SPRIDE) <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Rheinstraße 75<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">D-64293 Darmstadt<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Phone: +49 61 51 869-336<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Fax: +49 61 51 16-72118<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">eMail: </span><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black"><a href="mailto:steven.arzt@ec-spride.de" target="_blank"><span lang="EN-US">steven.arzt@ec-spride.de</span></a></span><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black"><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Web: <a href="http://sse.ec-spride.de/" target="_blank">http://sse.ec-spride.de</a><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> Monika Mashalkar [mailto:<a href="mailto:monikamashalkar@gmail.com" target="_blank">monikamashalkar@gmail.com</a>] <br><b>Gesendet:</b> Mittwoch, 25. Februar 2015 05:30<br><b>An:</b> <a href="mailto:soot-list@googlegroups.com" target="_blank">soot-list@googlegroups.com</a><br><b>Cc:</b> <a href="mailto:soot-list@sable.mcgill.ca" target="_blank">soot-list@sable.mcgill.ca</a>; <a href="mailto:soot-list@cs.mcgill.ca" target="_blank">soot-list@cs.mcgill.ca</a>; <a href="mailto:Steven.Arzt@cased.de" target="_blank">Steven.Arzt@cased.de</a><br><b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph<u></u><u></u></span></p><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">Hi Lokesh,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I am very new to the SOOT Framework and Flow-droid. I want to find the flow graph from android apk in my project and I am trying to run the code posted in this thread to do the same. I am trying to run the following command on Ubuntu <br><br>Command : java -cp soot-trunk.jar:soot-infoflow.jar:soot-infoflow-android.jar:slf4j-api-1.7.5.jar:slf4j-simple-1.7.5.jar:axml-2.0.jar -cp .:/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar CFG<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">but I am getting Error as : Error: Could not find or load main class CFG<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Could you please tell me the command to execute the CFG program.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Thank you,<u></u><u></u></p></div><div><p class="MsoNormal">Monika<u></u><u></u></p></div><div><p class="MsoNormal"><br>On Monday, 21 July 2014 13:46:37 UTC+5:30, LOKESH JAIN wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi all,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I resolved the issue and finally i am getting the call graph. Thank you all of you for your time and help. :)<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">1. But Stevan I am still curious to know how to work with QueueReader Object for generating dot format.<u></u><u></u></p></div><div><p class="MsoNormal">2. And why the size of call graph for RV2013.apk is 54. And is there any way to remove unnecessary size.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Thanks&amp;Regards<u></u><u></u></p></div><div><p class="MsoNormal">Lokesh<u></u><u></u></p></div></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Mon, Jul 21, 2014 at 11:38 AM, LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt; wrote:<u></u><u></u></p><div><div><div><div><p class="MsoNormal">Hi all,<u></u><u></u></p></div><div><p class="MsoNormal">Steven I still couldn&#39;t figure it out how to work with queuereader object for generating dot format.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I have used dot graph class manually as suggested to me by Stefan but,<u></u><u></u></p></div><div><div><div><p class="MsoNormal">I am getting NullPointerException. I don&#39;t know why. I have pasted the complete code.<u></u><u></u></p></div><div><p class="MsoNormal">Please help me out.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Exception in thread &quot;main&quot; java.lang.NullPointerException<u></u><u></u></p></div><div><p class="MsoNormal">at DotGraph.getNode(DotGraph.java:53)<u></u><u></u></p></div><div><p class="MsoNormal">at DotGraph.drawNode(DotGraph.java:61)<u></u><u></u></p></div><div><p class="MsoNormal">at CFG.visit(CFG.java:114)<u></u><u></u></p></div><div><p class="MsoNormal">at CFG.main(CFG.java:94)<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">CFG.java<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">import java.io.BufferedOutputStream;<u></u><u></u></p></div><div><p class="MsoNormal">import java.io.FileOutputStream;<u></u><u></u></p></div><div><div><p class="MsoNormal">import java.io.IOException;<u></u><u></u></p></div><div><p class="MsoNormal">import java.io.OutputStream;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.Collections;<u></u><u></u></p></div></div><div><p class="MsoNormal">import java.util.HashMap;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.HashSet;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.Iterator;<u></u><u></u></p></div><div><div><p class="MsoNormal">import java.util.LinkedList;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.List;<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">import org.xmlpull.v1.XmlPullParserException;<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div></div><div><p class="MsoNormal">import soot.MethodOrMethodContext;<u></u><u></u></p></div><div><div><p class="MsoNormal">import soot.PackManager;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.Scene;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.SootMethod;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.jimple.infoflow.android.SetupApplication;<u></u><u></u></p></div></div><div><p class="MsoNormal">import soot.jimple.toolkits.callgraph.CallGraph;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.jimple.toolkits.callgraph.Targets;<u></u><u></u></p></div><div><div><p class="MsoNormal">import soot.options.Options;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.util.dot.DotGraphUtility;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.util.dot.Renderable;<u></u><u></u></p></div><div><p class="MsoNormal">public class CFG {<u></u><u></u></p></div></div><div><p class="MsoNormal">private static DotGraph dot = new DotGraph(&quot;callgraph&quot;);<u></u><u></u></p></div></div></div><div><p class="MsoNormal">private static HashMap &lt;String,Boolean&gt; visited = new HashMap&lt;String,Boolean&gt;(); <u></u><u></u></p></div><div><div><div><p class="MsoNormal">public CFG() {<u></u><u></u></p></div><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"><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">// TODO Auto-generated method stub<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">SetupApplication app = new SetupApplication(&quot;/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar&quot;,&quot;/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk&quot;);<u></u><u></u></p></div><div><p class="MsoNormal">try {<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">app.calculateSourcesSinksEntrypoints(&quot;/home/lokesh/Downloads/soot-infoflow-android-develop/SourcesAndSinks.txt&quot;);<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">} catch (IOException e) {<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">// TODO Auto-generated catch block<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">e.printStackTrace();<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">} catch (XmlPullParserException e) {<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">// TODO Auto-generated catch block<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">e.printStackTrace();<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"><u></u> <u></u></p></div><div><p class="MsoNormal">soot.G.reset();<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Options.v().set_src_prec(Options.src_prec_apk);<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Options.v().set_process_dir(Collections.singletonList(&quot;/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk&quot;));<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Options.v().set_force_android_jar(&quot;/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar&quot;);<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"><u></u> <u></u></p></div><div><p class="MsoNormal">Options.v().set_allow_phantom_refs(true);<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Options.v().set_output_format(Options.output_format_none);<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Options.v().setPhaseOption(&quot;cg.spark verbose:true&quot;, &quot;on&quot;);<u></u><u></u></p></div><div><p class="MsoNormal"><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">SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();<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(entryPoint.getSignature());<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Scene.v().setEntryPoints(Collections.singletonList(entryPoint));<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">System.out.println(&quot;............&quot;+entryPoint.getActiveBody());<u></u><u></u></p></div><div><p class="MsoNormal"><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">System.out.println(Scene.v().getCallGraph().size());<u></u><u></u></p></div></div></div><div><div><p class="MsoNormal">CallGraph cg = Scene.v().getCallGraph();<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">visit(cg, entryPoint);<u></u><u></u></p></div></div><div><p class="MsoNormal">dot.plot(&quot;/home/lokesh/Desktop/soot1&quot;+ dot.DOT_EXTENSION);<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">private static void visit(CallGraph cg, SootMethod k)<u></u><u></u></p></div><div><p class="MsoNormal">{<u></u><u></u></p></div><div><p class="MsoNormal">String identifier = k.getName();<u></u><u></u></p></div></div><div><p class="MsoNormal"><u></u> <u></u></p></div></div></div><div><div><div><p class="MsoNormal">visited.put(k.getSignature(),true);<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">dot.drawNode(identifier);<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">//iterate over unvisited parents<u></u><u></u></p></div><div><p class="MsoNormal">Iterator&lt;MethodOrMethodContext&gt; ptargets = new Targets(cg.edgesInto(k));<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">if(ptargets != null){<u></u><u></u></p></div><div><p class="MsoNormal">while(ptargets.hasNext())<u></u><u></u></p></div><div><p class="MsoNormal">{<u></u><u></u></p></div><div><p class="MsoNormal">SootMethod p = (SootMethod) ptargets.next();<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">if(p == null) System.out.println(&quot;p is null&quot;);<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">if(!visited.containsKey(p.getSignature()))<u></u><u></u></p></div><div><p class="MsoNormal">visit(cg,p);<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"><u></u> <u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">//iterate over unvisited children<u></u><u></u></p></div><div><p class="MsoNormal">Iterator&lt;MethodOrMethodContext&gt; ctargets = new Targets(cg.edgesOutOf(k));<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">if(ctargets != null){<u></u><u></u></p></div><div><p class="MsoNormal">while(ctargets.hasNext())<u></u><u></u></p></div><div><p class="MsoNormal">{<u></u><u></u></p></div><div><p class="MsoNormal">SootMethod c = (SootMethod) ctargets.next();<u></u><u></u></p></div><div><p class="MsoNormal">if(c == null) System.out.println(&quot;c is null&quot;);<u></u><u></u></p></div><div><p class="MsoNormal">dot.drawEdge(identifier, c.getName());<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">if(!visited.containsKey(c.getSignature()))<u></u><u></u></p></div><div><p class="MsoNormal">visit(cg,c);<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">}<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"><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><div><p class="MsoNormal">DotGraph.java<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">import java.io.BufferedOutputStream;<u></u><u></u></p></div><div><p class="MsoNormal">import java.io.FileOutputStream;<u></u><u></u></p></div><div><p class="MsoNormal">import java.io.IOException;<u></u><u></u></p></div><div><p class="MsoNormal">import java.io.OutputStream;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.HashMap;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.LinkedList;<u></u><u></u></p></div><div><p class="MsoNormal">import java.util.List;<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">import soot.util.dot.DotGraphEdge;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.util.dot.DotGraphNode;<u></u><u></u></p></div><div><div><p class="MsoNormal">import soot.util.dot.DotGraphUtility;<u></u><u></u></p></div><div><p class="MsoNormal">import soot.util.dot.Renderable;<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">public class DotGraph implements Renderable<u></u><u></u></p></div><div><p class="MsoNormal">{<u></u><u></u></p></div></div><div><p class="MsoNormal">public final static String DOT_EXTENSION = &quot;.dot&quot;;<u></u><u></u></p></div><div><p class="MsoNormal">private HashMap&lt;String, DotGraphNode&gt; nodes;<u></u><u></u></p></div><div><div><p class="MsoNormal">private boolean isSubGraph;<u></u><u></u></p></div><div><p class="MsoNormal">private List&lt;Renderable&gt; drawElements;<u></u><u></u></p></div><div><p class="MsoNormal">private String graphname;<u></u><u></u></p></div><div><p class="MsoNormal">public DotGraph(String graphname)<u></u><u></u></p></div><div><p class="MsoNormal">{<u></u><u></u></p></div><div><p class="MsoNormal">this.drawElements = new LinkedList&lt;Renderable&gt;();<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div><div><p class="MsoNormal">public DotGraph createSubGraph(String label)<u></u><u></u></p></div><div><p class="MsoNormal">{<u></u><u></u></p></div><div><p class="MsoNormal">DotGraph subgraph = new DotGraph(label);<u></u><u></u></p></div><div><p class="MsoNormal">subgraph.isSubGraph = true;<u></u><u></u></p></div><div><p class="MsoNormal">this.drawElements.add(subgraph);<u></u><u></u></p></div><div><p class="MsoNormal">System.out.println(subgraph);<u></u><u></u></p></div><div><p class="MsoNormal">return subgraph;<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div><div><p class="MsoNormal">@Override<u></u><u></u></p></div><div><p class="MsoNormal">public void render(OutputStream out, int indent) throws IOException {<u></u><u></u></p></div><div><p class="MsoNormal">String graphname = this.graphname;<u></u><u></u></p></div><div><p class="MsoNormal">   if (!isSubGraph) {<u></u><u></u></p></div><div><p class="MsoNormal">     DotGraphUtility.renderLine(out, &quot;digraph \&quot;&quot;+graphname+&quot;\&quot; {&quot;, indent);<u></u><u></u></p></div><div><p class="MsoNormal">   } else {<u></u><u></u></p></div><div><p class="MsoNormal"> DotGraphUtility.renderLine(out, &quot;subgraph \&quot;&quot;+graphname+&quot;\&quot; {&quot;, indent);<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">}<u></u><u></u></p></div></div><div><p class="MsoNormal">public void plot(String filename) {<u></u><u></u></p></div><div><p class="MsoNormal">    try {<u></u><u></u></p></div><div><p class="MsoNormal">      BufferedOutputStream out =new BufferedOutputStream(new FileOutputStream(filename));<u></u><u></u></p></div><div><p class="MsoNormal">      render(out, 0);<u></u><u></u></p></div><div><p class="MsoNormal">      out.close();<u></u><u></u></p></div><div><p class="MsoNormal">    } catch (IOException ioe) {<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">public DotGraphNode getNode(String name){<u></u><u></u></p></div><div><p class="MsoNormal">DotGraphNode node = nodes.get(name);<u></u><u></u></p></div><div><p class="MsoNormal">if (node == null) {<u></u><u></u></p></div><div><p class="MsoNormal">node = new DotGraphNode(name);<u></u><u></u></p></div><div><p class="MsoNormal">nodes.put(name, node);<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div><div><p class="MsoNormal">return node;<u></u><u></u></p></div><div><p class="MsoNormal">}<u></u><u></u></p></div><div><p class="MsoNormal">public DotGraphNode drawNode(String name){<u></u><u></u></p></div><div><p class="MsoNormal">DotGraphNode node = getNode(name);<u></u><u></u></p></div><div><p class="MsoNormal">if(node == null)<u></u><u></u></p></div><div><p class="MsoNormal">throw new RuntimeException(&quot;Assertion failed.&quot;);<u></u><u></u></p></div><div><p class="MsoNormal">if(!this.drawElements.contains(node))<u></u><u></u></p></div><div><p class="MsoNormal">this.drawElements.add(node);<u></u><u></u></p></div><div><p class="MsoNormal">return node;<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">public DotGraphEdge drawEdge(String from, String to) {<u></u><u></u></p></div><div><p class="MsoNormal">DotGraphNode src = drawNode(from);<u></u><u></u></p></div><div><p class="MsoNormal">DotGraphNode dst = drawNode(to);<u></u><u></u></p></div><div><p class="MsoNormal">DotGraphEdge edge = new DotGraphEdge(src, dst);<u></u><u></u></p></div><div><p class="MsoNormal">this.drawElements.add(edge);<u></u><u></u></p></div><div><p class="MsoNormal">return edge;<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">} <u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Thanks &amp; Regards<u></u><u></u></p></div><div><p class="MsoNormal"><span style="color:#888888">Lokesh<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="color:#888888"><u></u> <u></u></span></p></div></div></div></div><div><div><div><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Sun, Jul 20, 2014 at 5:10 PM, Stefan Gommer &lt;<a>gom...@informatik.uni-bremen.de</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Lokesh,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">sorry I misspelled it. Originally it is of type Hash<b><u>Map</u></b>&lt;String,Boolean&gt;.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">You can also use HashSet&lt;String&gt;. In this case you have to use visited.add(k.getSignature());<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Regards,<u></u><u></u></p></div><div><p class="MsoNormal">Stefan<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><div><div><p class="MsoNormal">Am 20.07.2014 um 13:35 schrieb LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt;:<u></u><u></u></p></div><div><div><blockquote style="margin-top:5.0pt;margin-bottom:5.0pt"><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">Hi Stefan,</span><u></u><u></u></p><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">HashSet&lt;String,Boolean&gt; type is giving error whereas HashSet&lt;String&gt; is correct form. But<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">then<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">visited.put(k.getSignature(),true) is giving error.<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">How do i resolve this?<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">Thanks &amp; Regards<u></u><u></u></span></p></div><div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;"><u></u><u></u></span></p></div></div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#888888">Lokesh</span><u></u><u></u></p></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Sun, Jul 20, 2014 at 4:52 PM, LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Stefan,<u></u><u></u></p><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">HashSet&lt;String,Boolean&gt; type is giving error whereas HashSet&lt;String&gt; is correct form. But</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">then</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">visited.put(k.getSignature(),true) is giving error.</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;">Thanks &amp; Regards</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#888888">Lokesh</span><span style="color:#888888"><u></u><u></u></span></p></div></div><div><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Sun, Jul 20, 2014 at 4:16 PM, Stefan Gommer &lt;<a>gom...@informatik.uni-bremen.de</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Lokesh,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">visited is of type HashSet&lt;String,Boolean&gt; but can also be any kind of List like HashSet&lt;String&gt;<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Regards<u></u><u></u></p></div><div><p class="MsoNormal">Stefan <u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">Am 20.07.2014 um 12:44 schrieb LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt;:<u></u><u></u></p></div><div><blockquote style="margin-top:5.0pt;margin-bottom:5.0pt"><p class="MsoNormal"><u></u> <u></u></p><div><div><div><div><p class="MsoNormal" style="margin-bottom:12.0pt">Hey Stefan!<u></u><u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt">What is the type of &quot;visited&quot; ?<u></u><u></u></p></div><p class="MsoNormal">Thanks &amp; Regards<u></u><u></u></p></div><p class="MsoNormal">Lokesh<u></u><u></u></p></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Sun, Jul 20, 2014 at 2:57 PM, Stefan Gommer &lt;<a>gom...@informatik.uni-bremen.de</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Lokesh,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I did it like this (I skipped the standard soot settings:<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">private</span> <span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">static</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"> DotGraph <span style="color:#0326cc">dot</span> = <span style="color:#931a68">new</span> DotGraph(<span style="color:#3933ff">&quot;CallGraph“</span>);</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">...</span><u></u><u></u></p></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">…<u></u><u></u></span></p></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">PackManager.v().runPacks();<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">CallGraph cg = Scene.v().getCallGraph();<u></u><u></u></span></p></div></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">visit(cg, entryPoint);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">…<u></u><u></u></span></p></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#0326cc">dot</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#3933ff">.plot(&quot;/Users/neji/Desktop/graph&quot;+ </span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#0326cc">dot</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#3933ff">.</span><u><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#0326cc">DOT_EXTENSION</span></u><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#3933ff">);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">…</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#3933ff"><u></u> <u></u></span></p></div></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">private</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"> <span style="color:#931a68">static</span> <span style="color:#931a68">void</span> visit(CallGraph cg, SootMethod k)<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">{<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">String identifier = k.getName();<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#0326cc">visited</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">.put(k.getSignature(), <span style="color:#931a68">true</span>);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#0326cc">dot</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">.drawNode(identifier);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#4e9072">//iterate over unvisited parents<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">Iterator&lt;MethodOrMethodContext&gt; ptargets = <span style="color:#931a68">new</span> Targets(cg.edgesInto(k));<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">if</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(ptargets != <span style="color:#931a68">null</span>){<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">while</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(ptargets.hasNext())<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">{<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">SootMethod p = (SootMethod) ptargets.next();<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">if</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(p == <span style="color:#931a68">null</span>) System.<span style="color:#0326cc">out</span>.println(<span style="color:#3933ff">&quot;p is null&quot;</span>);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">if</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(!<span style="color:#0326cc">visited</span>.containsKey(p.getSignature()))<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">visit(cg,p);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">}<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">}<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#4e9072">//iterate over unvisited children<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">Iterator&lt;MethodOrMethodContext&gt; ctargets = <span style="color:#931a68">new</span> Targets(cg.edgesOutOf(k));<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">if</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(ctargets != <span style="color:#931a68">null</span>){<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">while</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(ctargets.hasNext())<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">{<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">SootMethod c = (SootMethod) ctargets.next();<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">if</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(c == <span style="color:#931a68">null</span>) System.<span style="color:#0326cc">out</span>.println(<span style="color:#3933ff">&quot;c is null&quot;</span>);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#0326cc">dot</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">.drawEdge(identifier, c.getName());<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;;color:#931a68">if</span><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">(!<span style="color:#0326cc">visited</span>.containsKey(c.getSignature()))<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">visit(cg,c);<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">}<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">}<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;">}<u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:8.5pt;font-family:&quot;Monaco&quot;,&quot;serif&quot;"><u></u> <u></u></span></p></div></div></div></div><div><div><p class="MsoNormal">Am 20.07.2014 um 09:44 schrieb LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt;:<u></u><u></u></p></div><div><blockquote style="margin-top:5.0pt;margin-bottom:5.0pt"><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal" style="margin-bottom:12.0pt">I have tried DotGraph class from the soot.util.dot package but it&#39;s giving me null pointer exception. Following is the tried code.<u></u><u></u></p></div><p class="MsoNormal">I have converted QueueReader object into string as DotGraph takes only string argument. It&#39;s getting complicated. Please suggest some simple solution.<u></u><u></u></p><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><br>import java.io.IOException;<br>import java.io.OutputStream;<br>import java.util.Collections;<br>import java.util.LinkedList;<br>import java.util.List;<br><br>import org.xmlpull.v1.XmlPullParserException;<br><br>import soot.PackManager;<br>import soot.Scene;<br>import soot.SootMethod;<br>import soot.jimple.infoflow.android.SetupApplication;<br>import soot.options.Options;<br>import soot.util.dot.DotGraphUtility;<br>import soot.util.dot.Renderable;<br>public class CFG {<br>     //private static Map options;<br>    static DotGraph dg;<br>public CFG() {<br>//this.options=options;<br>// TODO Auto-generated constructor stub<br><br>}<br>/*public DotGraph createSubGraph(String label)<br>{<br><br>DotGraph createSubGraph = DotGraph.createSubGraph(Scene.v().getCallGraph().listener().toString());    <br>}*/<br>public static void main(String[] args) {<br><br>// TODO Auto-generated method stub<br><br>SetupApplication app = new SetupApplication(&quot;/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar&quot;,&quot;/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk&quot;);<br>   <br>try {<br><br>app.calculateSourcesSinksEntrypoints(&quot;/home/lokesh/Downloads/soot-infoflow-android-develop/SourcesAndSinks.txt&quot;);<br><br><br>} catch (IOException e) {<br><br>// TODO Auto-generated catch block<br><br>e.printStackTrace();<br><br>} catch (XmlPullParserException e) {<br><br>// TODO Auto-generated catch block<br><br>e.printStackTrace();<br><br>}<br><br>soot.G.reset();<br><br>Options.v().set_src_prec(Options.src_prec_apk);<br><br>Options.v().set_process_dir(Collections.singletonList(&quot;/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk&quot;));<br>Options.v().set_force_android_jar(&quot;/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar&quot;);<br><br>Options.v().set_whole_program(true);<br><br>Options.v().set_allow_phantom_refs(true);<br><br>Options.v().set_output_format(Options.output_format_none);<br><br>Options.v().setPhaseOption(&quot;cg.spark verbose:true&quot;, &quot;on&quot;);<br><br>Scene.v().loadNecessaryClasses();<br><br>SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();<br><br>Options.v().set_main_class(entryPoint.getSignature());<br><br>Scene.v().setEntryPoints(Collections.singletonList(entryPoint));<br><br>System.out.println(&quot;............&quot;+entryPoint.getActiveBody());<br><br>PackManager.v().runPacks();<br><br>System.out.println(Scene.v().getCallGraph().size());<br>String label = Scene.v().getCallGraph().listener().toString();<br>dg.createSubGraph(label);<br>}<br>}<br><br>import java.io.IOException;<br>import java.io.OutputStream;<br>import java.util.LinkedList;<br>import java.util.List;<br><br>import soot.util.dot.DotGraphUtility;<br>import soot.util.dot.Renderable;<br><br>public class DotGraph implements Renderable<br>{<br>private boolean isSubGraph;<br>private List&lt;Renderable&gt; drawElements;<br>private String graphname;<br>public DotGraph(String graphname)<br>{<br>this.drawElements = new LinkedList&lt;Renderable&gt;();<br>}<br>public DotGraph createSubGraph(String label)<br>{<br>DotGraph subgraph = new DotGraph(label);<br>subgraph.isSubGraph = true;<br>this.drawElements.add(subgraph);<br>System.out.println(subgraph);<br>return subgraph;<br>}<br>@Override<br>public void render(OutputStream out, int indent) throws IOException {<br>    String graphname = this.graphname;<br>        if (!isSubGraph) {<br>          DotGraphUtility.renderLine(out, &quot;digraph \&quot;&quot;+graphname+&quot;\&quot; {&quot;, indent);<br>        } else {<br> DotGraphUtility.renderLine(out, &quot;subgraph \&quot;&quot;+graphname+&quot;\&quot; {&quot;, indent);<br><br>        }<br>    <br>}<br>} <u></u><u></u></p></div><div><p class="MsoNormal">Thanks &amp; Regards<u></u><u></u></p></div><div><p class="MsoNormal">Lokesh<u></u><u></u></p></div></div></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Sat, Jul 19, 2014 at 10:57 PM, Stefan Gommer &lt;<a>gommer...@googlemail.com</a>&gt; wrote:<u></u><u></u></p><div><p class="MsoNormal">Hi Lokesh,<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">you could use the DotGraph class from the soot.util.dot package and build a Graph on your own while traversing through the cfg. I don’t know if there is a method to do this automatically.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Stefan<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">Am 19.07.2014 um 15:16 schrieb LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt;:<u></u><u></u></p></div><blockquote style="margin-top:5.0pt;margin-bottom:5.0pt"><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">Hi Steven,<u></u><u></u></p><div><p class="MsoNormal"><span style="font-size:11.5pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">this Scene.v().getCallgraph().listener() is giving me QueueReader object. But I am not able to create a dot file from it. I have tried dump_cfg and various others options but all are of no help. </span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.5pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">1. Please can you tell me how do i print a dot file out of QueueReader object?</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.5pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Also I am getting the call graph size as 54 for the general example apk &quot;RV2013.apk&quot;.</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-size:11.5pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">2. How come call graph size is 54?</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p><div><p class="MsoNormal">On Fri, Jul 18, 2014 at 9:37 PM, Steven Arzt &lt;<a>Steve...@cased.de</a>&gt; wrote:<u></u><u></u></p><div><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Lokesh,</span><u></u><u></u></p><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">You can manually iterate over the callgraph using Scene.v().getCallgraph().listener() and print it out in dot format  which should be fairly simple as it is just a QueueReader over the edges. Still, I think Soot can also directly do that, but I have never used  the dot visualizer for callgraphs.</span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Afterwards, you can visualize the dot file using GraphViz.</span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven</span><u></u><u></u></p><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> LOKESH JAIN [mailto:<a>lokesh...@gmail.com</a>] <br><b>Gesendet:</b> Freitag, 18. Juli 2014 18:04<br><b>An:</b> Steven Arzt<br><b>Cc:</b> Modhi Alsobiehy; <a>soot...@cs.mcgill.ca</a>; <a>soot...@sable.mcgill.ca</a>; <a>soot...@googlegroups.com</a></span><u></u><u></u></p><div><p class="MsoNormal"><br><b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p> <u></u><u></u></p><div><div><p>Hi,<u></u><u></u></p></div><p>A gentle reminder. Please reply fast. I need it for my research project.<u></u><u></u></p><div><p> <u></u><u></u></p></div><div><p>Regards<u></u><u></u></p></div><div><p>Lokesh<u></u><u></u></p></div></div><div><p style="margin-bottom:12.0pt"> <u></u><u></u></p><div><p>On Thu, Jul 17, 2014 at 9:21 PM, LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt; wrote:<u></u><u></u></p><div><div><div><p style="margin-bottom:12.0pt">Thanks a lot Steven and Modhi. It worked.<u></u><u></u></p></div><div><p>It is showing call graph in words. How can I graphically see the call graph for apk files as we see for java files??<u></u><u></u></p></div><div><p> <u></u><u></u></p></div><p>Regards<u></u><u></u></p></div><p><span style="color:#888888">Lokesh Jain</span><u></u><u></u></p></div><div><div><p style="margin-bottom:12.0pt"> <u></u><u></u></p><div><p>On Thu, Jul 17, 2014 at 6:11 PM, Steven Arzt &lt;<a>Steve...@cased.de</a>&gt; wrote:<u></u><u></u></p><div><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Lokesh,</span><u></u><u></u></p><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">It seems that you are missing the axml-2.0.jar library on your Java classpath.</span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">  Steven</span><u></u><u></u></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p><div><div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm"><p><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a>soot-lis...@CS.McGill.CA</a> [mailto:<a>soot-lis...@CS.McGill.CA</a>] <b>Im Auftrag von </b>Modhi Alsobiehy<br><b>Gesendet:</b> Donnerstag, 17. Juli 2014 14:39<br><b>An:</b> LOKESH JAIN<br><b>Cc:</b> <a>soot...@cs.mcgill.ca</a>; <a>soot...@sable.mcgill.ca</a>; <a>soot...@googlegroups.com</a><br><b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph</span><u></u><u></u></p></div></div><div><p> <u></u><u></u></p><div><div><p>Hi Lokesh,<u></u><u></u></p></div><div><p style="margin-bottom:12.0pt"> <u></u><u></u></p></div><div><p>Open the folder of your project and add the call back file into it.<u></u><u></u></p></div><p> <u></u><u></u></p><div><p>-Best,<u></u><u></u></p></div><div><p>Modhi<u></u><u></u></p></div></div><div><p style="margin-bottom:12.0pt"><br>On Jul 17, 2014, at 12:03 PM, &quot;LOKESH JAIN&quot; &lt;<a>lokesh...@gmail.com</a>&gt; wrote:<u></u><u></u></p></div><blockquote style="margin-top:5.0pt;margin-bottom:5.0pt"><p>Hi all,<br><br>Modhi, I am using your code for generating call graph for apk file. But, I am getting following error<br> <br>Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: pxb/android/axml/NodeVisitor<br>    at soot.jimple.infoflow.android.manifest.ProcessManifest.handle(Unknown Source)<br>    at soot.jimple.infoflow.android.manifest.ProcessManifest.&lt;init&gt;(Unknown Source)<br>    at soot.jimple.infoflow.android.manifest.ProcessManifest.&lt;init&gt;(Unknown Source)<br>    at soot.jimple.infoflow.android.SetupApplication.calculateSourcesSinksEntrypoints(Unknown Source)<br>    at soot.jimple.infoflow.android.SetupApplication.calculateSourcesSinksEntrypoints(Unknown Source)<br>    at CFG.main(CFG.java:33)<br>Caused by: java.lang.ClassNotFoundException: pxb.android.axml.NodeVisitor<br>    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)<br>    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)<br>    at java.security.AccessController.doPrivileged(Native Method)<br>    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)<br>    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)<br>    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)<br>    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)<br>    ... 6 more<br><br>It&#39;s pretty much the same error that you were getting. Though I had checked , there is no duplicate library added. Also there is already AndroidCallbacks.txt in soot-infoflow-android, i haven&#39;t understood how to add it into my project.<br>Any help would be appreciated. Thank You<br>Regards<br>Lokesh<br><br><br>On Saturday, 5 July 2014 23:04:49 UTC+5:30, Modhi Alsobiehy wrote:<u></u><u></u></p><div><div><p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">Hi all,</span><u></u><u></u></p></div><div><p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">I need to traverse the call flow graph of android apps( apk files).</span><u></u><u></u></p></div><div><p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">I understand that I must set an entry point so to start, I tried the following code :</span><u></u><u></u></p></div><div><p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"> </span><u></u><u></u></p></div><div><p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">---------------------</span><u></u><u></u></p></div></div></blockquote></div></div></div></div></div></div></div></div></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div></div></div></div></div></div></blockquote></div></div></div></div></div></div></div></div></div></div></blockquote></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><p class="MsoNormal">...<u></u><u></u></p></div></div></div></div></blockquote></div><br></div>