<div dir="ltr">Hi Steve and Lokesh,<div><br></div><div>My name is Eric, I am a newbie with Soot framework and FlowDroid. I found this conversations that you had solved the problem generate dot graph for APK. I follow your old code and receive error: </div><div>DotGraph.getNode(<span class="s3">DotGraph.java:56</span>)</div><div>DotGraph.drawNode(<span class="s3">DotGraph.java:65</span>)<br></div><div><br></div><div>So, how did you solve this problem? May you share the final code of CFG.java and DotGraph.java for me?</div><div><br></div><div>Looking forward for your reply.</div><div><br></div><div>Thanks and regards,</div><div>Eric</div><div>
<p class="p1"><br></p><br>On Sunday, July 6, 2014 at 1:34:49 AM UTC+8, Modhi Alsobiehy wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div dir="ltr">
<div dir="ltr" style="font-family:'Calibri','Arial','Segoe UI','Meiryo','Microsoft YaHei UI','Microsoft JhengHei UI','Malgun Gothic';font-size:12pt">
<div>Hi all,</div><div>I need to traverse the call flow graph of android apps( apk files).</div><div>I understand that I must set an entry point so to start, I tried the following code :</div><div><br></div><div>------------------------------<wbr>------------------------------<wbr>------------------------------<wbr>----------</div><div><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>mport</b></font></font><font size="2"> java.io.IOException;</font></p><font size="2">
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> java.util.Collections;</font></p><font size="2">
<p align="LEFT"></p>
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> org.xmlpull.v1.<wbr>XmlPullParserException;</font></p><font size="2">
<p align="LEFT"></p>
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> soot.PackManager;</font></p><font size="2">
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> soot.Scene;</font></p><font size="2">
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> soot.SootMethod;</font></p><font size="2">
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> soot.jimple.infoflow.android.<wbr>SetupApplication;</font></p><font size="2">
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>import</b></font></font><font size="2"> soot.options.Options;</font></p><font size="2">
<p align="LEFT"></p>
</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font></b><font color="#7f0055" size="2"><font color="#7f0055" size="2"></font></font><p align="LEFT"><font color="#7f0055" size="2"><font color="#7f0055" size="2"><b>public</b></font></font><font size="2"> </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">class</font></font></b><font size="2"> CFG {</font></p><font size="2">
<p align="LEFT"></p>
</font><p align="LEFT"><font size="2">        </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">public</font></font></b><font size="2"> CFG() {</font></p><font size="2">
</font><p align="LEFT"><font size="2">                </font><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">// </font></font><b><font color="#7f9fbf" size="2"><font color="#7f9fbf" size="2">TODO</font></font></b><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2"> Auto-generated constructor stub</font></font></p><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">
</font></font><font size="2"><p align="LEFT">        }</p>
<p align="LEFT"></p>
</font><p align="LEFT"><font size="2">        </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">public</font></font></b><font size="2"> </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">static</font></font></b><font size="2"> </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">void</font></font></b><font size="2"> main(String[] args) {</font></p><font size="2">
</font><p align="LEFT"><font size="2">                </font><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">// </font></font><b><font color="#7f9fbf" size="2"><font color="#7f9fbf" size="2">TODO</font></font></b><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2"> Auto-generated method stub</font></font></p><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">
</font></font><font size="2"></font><p align="LEFT"><font size="2">                SetupApplication app = </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">new</font></font></b><font size="2"> SetupApplication(</font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"D:/<wbr>AndroidADT/adt-bundle-windows-<wbr>x86_64-20131030/sdk/platforms"</font></font><font size="2"><wbr>,</font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"D:/APKs/location.apk"</font></font><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">try</font></font></b><font size="2"> {</font></p><font size="2">
</font><p align="LEFT"><font size="2">                app.<wbr>calculateSourcesSinksEntrypoin<wbr>ts(</font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"D:/FlowDroid/<wbr>SourcesAndSinks.txt"</font></font><font size="2">);</font></p><font size="2">
</font><p align="LEFT"><font size="2">                 } </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">catch</font></font></b><font size="2"> (IOException e) {</font></p><font size="2">
</font><p align="LEFT"><font size="2">                </font><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">// </font></font><b><font color="#7f9fbf" size="2"><font color="#7f9fbf" size="2">TODO</font></font></b><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2"> Auto-generated catch block</font></font></p><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">
</font></font><font size="2"><p align="LEFT">                e.printStackTrace();</p>
</font><p align="LEFT"><font size="2">                 } </font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">catch</font></font></b><font size="2"> (XmlPullParserException e) {</font></p><font size="2">
</font><p align="LEFT"><font size="2">                </font><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">// </font></font><b><font color="#7f9fbf" size="2"><font color="#7f9fbf" size="2">TODO</font></font></b><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2"> Auto-generated catch block</font></font></p><font color="#3f7f5f" size="2"><font color="#3f7f5f" size="2">
</font></font><font size="2"><p align="LEFT">                e.printStackTrace();</p>
<p align="LEFT">                 }</p>
<p align="LEFT">        </p>
<p align="LEFT">         soot.G.<i>reset</i>();</p>
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().set_src_prec(<wbr>Options.</font><i><font color="#0000c0" size="2"><font color="#0000c0" size="2">src_prec_apk</font></font></i><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().set_process_dir(<wbr>Collections.<i>singletonList</i>(</font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"D:/<wbr>APKs/location.apk"</font></font><font size="2">));</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().set_android_jars(</font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"<wbr>D:/AndroidADT/adt-bundle-<wbr>windows-x86_64-20131030/sdk/<wbr>platforms"</font></font><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().set_whole_program(</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2"><wbr>true</font></font></b><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().set_allow_phantom_<wbr>refs(</font><b><font color="#7f0055" size="2"><font color="#7f0055" size="2">true</font></font></b><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().set_output_format(<wbr>Options.</font><i><font color="#0000c0" size="2"><font color="#0000c0" size="2">output_format_none</font></font></i><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         Options.<i>v</i>().setPhaseOption(</font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"<wbr>cg.spark"</font></font><font size="2">, </font><font color="#2a00ff" size="2"><font color="#2a00ff" size="2">"on"</font></font><font size="2">);</font></p><font size="2">
<p align="LEFT">        </p>
<p align="LEFT">         Scene.<i>v</i>().<wbr>loadNecessaryClasses(); </p>
<p align="LEFT">        </p>
<p align="LEFT">         SootMethod entryPoint = app.getEntryPointCreator().<wbr>createDummyMain();</p>
<p align="LEFT">        </p>
<p align="LEFT">         Options.<i>v</i>().set_main_class(<wbr>entryPoint.getSignature());</p>
<p align="LEFT">        </p>
<p align="LEFT">         Scene.<i>v</i>().setEntryPoints(<wbr>Collections.<i>singletonList</i>(<wbr>entryPoint));</p>
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         System.</font><i><font color="#0000c0" size="2"><font color="#0000c0" size="2">out</font></font></i><font size="2">.println(entryPoint.<wbr>getActiveBody());</font></p><font size="2">
<p align="LEFT">                </p>
<p align="LEFT">         PackManager.<i>v</i>().runPacks();</p>
<p align="LEFT">        </p>
</font><p align="LEFT"><font size="2">         System.</font><i><font color="#0000c0" size="2"><font color="#0000c0" size="2">out</font></font></i><font size="2">.println(Scene.<i>v</i>().<wbr>getCallGraph().size());</font></p><font size="2">
<p align="LEFT">        </p>
<p align="LEFT">        }</p>
<p align="LEFT"></p>
<p align="LEFT">}</p><p align="LEFT">------------------------------<wbr>------------------------------<wbr>------------------------------<wbr>---------------------------</p><p align="LEFT">Unfortunately, I am getting the following error:</p><font color="#ff0000" size="2"><font color="#ff0000" size="2"><p align="LEFT">Exception in thread "main" java.lang.<wbr>NoClassDefFoundError: pxb/android/axml/NodeVisitor</p><p align="LEFT">
</p><p align="LEFT">        at soot.jimple.infoflow.android.<wbr>manifest.ProcessManifest.<wbr>handle(Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at soot.jimple.infoflow.android.<wbr>manifest.ProcessManifest.<<wbr>init>(Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at soot.jimple.infoflow.android.<wbr>manifest.ProcessManifest.<<wbr>init>(Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at soot.jimple.infoflow.android.<wbr>SetupApplication.<wbr>calculateSourcesSinksEntrypoin<wbr>ts(Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at soot.jimple.infoflow.android.<wbr>SetupApplication.<wbr>calculateSourcesSinksEntrypoin<wbr>ts(Unknown Source)</p><p align="LEFT">
</p></font><p align="LEFT"></p></font><p align="LEFT"><font color="#ff0000" size="2"><font color="#ff0000" size="2">        at apkCFG.CFG.main(</font></font><u><font color="#0066cc" size="2"><font color="#0066cc" size="2">CFG.java:25</font></font></u><font color="#ff0000" size="2"><font color="#ff0000" size="2">)</font></font></p><p align="LEFT"><font color="#ff0000" size="2"><font color="#ff0000" size="2">
</font></font></p><p align="LEFT"><font color="#ff0000" size="2"><font color="#ff0000" size="2">Caused by: </font></font><u><font color="#0066cc" size="2"><font color="#0066cc" size="2">java.lang.<wbr>ClassNotFoundException</font></font></u><font color="#ff0000" size="2"><font color="#ff0000" size="2">: pxb.android.axml.NodeVisitor</font></font></p><p align="LEFT"></p><font color="#ff0000" size="2"><p align="LEFT"></p><font color="#ff0000" size="2"><p align="LEFT">
</p><p align="LEFT">        at java.net.URLClassLoader$1.run(<wbr>Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at java.net.URLClassLoader$1.run(<wbr>Unknown Source)</p><p align="LEFT">
</p></font><p align="LEFT"></p></font><p align="LEFT"><font color="#ff0000" size="2"><font color="#ff0000" size="2">        at java.security.<wbr>AccessController.doPrivileged(</font></font><u><font color="#0066cc" size="2"><font color="#0066cc" size="2"><wbr>Native Method</font></font></u><font color="#ff0000" size="2"><font color="#ff0000" size="2">)</font></font></p><p align="LEFT"></p><font color="#ff0000" size="2"><p align="LEFT"></p><font color="#ff0000" size="2"><p align="LEFT">
</p><p align="LEFT">        at java.net.URLClassLoader.<wbr>findClass(Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at java.lang.ClassLoader.<wbr>loadClass(Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at sun.misc.Launcher$<wbr>AppClassLoader.loadClass(<wbr>Unknown Source)</p><p align="LEFT">
</p><p align="LEFT">        at java.lang.ClassLoader.<wbr>loadClass(Unknown Source)</p><p align="LEFT">
</p><p>        ... 6 more</p></font><p align="LEFT"></p></font><p align="LEFT"><br></p><p align="LEFT">Any help or advise on how to do that would be deeply appreciated!</p><p align="LEFT">Thanx!!<br></p></font><br></div><div><div><br></div><div>Sent from Windows Mail</div><div><br></div></div>
</div>
</div>
</blockquote></div></div>