package Ġme . c irq . aper . util Ċ Ċ import Ġme . c irq . aper . Config Ċ import Ġso ot .* Ċ import Ġso ot . j imple . info flow . Info flow Configuration Ċ import Ġso ot . j imple . info flow . Info flow Configuration . Call graph Algorithm Ċ import Ġso ot . j imple . info flow . android . Setup Application Ċ import Ġso ot . j imple . info flow . android . config . S oot Config For Android Ċ import Ġso ot . j imple . tool k its . call graph . CHAT rans former Ċ import Ġso ot . j imple . tool k its . call graph . Call Graph Ċ import Ġso ot . j imple . tool k its . call graph . Sources Ċ import Ġso ot . j imple . tool k its . call graph . Targets Ċ import Ġso ot . options . Options ĊĊ Ċ object ĠCG Util Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠCG Holder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Format Ġ= Ġwhen Ġ( val Ġf Ġ= ĠConfig . get (). input Fmt . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" apk " Ġ-> ĠOptions . src _ prec _ apk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" src " Ġ-> ĠOptions . src _ prec _ java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġinput Ġformat Ġ$ f ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcg Algorithm Ġ= Ġwhen Ġ( Config . get (). cg Algo . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" cha " Ġ-> ĠCall graph Algorithm . CHA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" geom " Ġ-> ĠCall graph Algorithm . GE OM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" r ta " Ġ-> ĠCall graph Algorithm . RT A ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" v ta " Ġ-> ĠCall graph Algorithm . V TA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCall graph Algorithm . SP ARK ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcg : ĠCall Graph ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconstruct CG () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Util . info ( this , Ġ" Start Ġconstructing Ġcall Ġgraph ") ĊĠĠĠĠĠĠĠ Ġgenerate By Flow d roid ( CG Holder . input Format , ĠCG Holder . cg Algorithm ) ĊĠĠĠĠĠĠĠ Ġ// Ġgenerate By S oot CHA ( input Format ) ĊĠĠĠĠĠĠĠ ĠLog Util . info ( this , Ġ" Call Ġgraph Ġgenerated Ġwith Ġ{} Ġalgorithm ", ĠCG Holder . cg Algorithm ) ĊĠĠĠĠĠĠĠ ĠCG Holder . cg Ġ= ĠScene . v (). call Graph ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Call To ( method : ĠS oot Method ): ĠIterator < S oot Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparents Ġ= ĠS ources ( CG Holder . cg . edges Into ( method )) ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < S oot Method > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next () Ġ= Ġparents . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext () Ġ= Ġparents . next (). method () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Call From ( method : ĠS oot Method ): ĠIterator < S oot Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠTarget s ( CG Holder . cg . edges OutOf ( method )) ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < S oot Method > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next () Ġ= Ġchildren . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext () Ġ= Ġchildren . next (). method () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠC IS Ġfor Ġcontext - ins ensitive ĊĠĠĠ Ġfun ĠgetC IS Call From ( method : ĠS oot Method ): ĠIterator < S oot Method > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmet Ġ= ĠHashSet < S oot Method >() ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠTarget s ( CG Holder . cg . edges OutOf ( method )) ĊĠĠĠĠĠĠĠ Ġchildren . forEach Remaining { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . method () Ġ! in Ġmet ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmet . add ( it . method ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmet . iterator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Call ers (): ĠIterator < S oot Method > Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( edge Ġin ĠCG Holder . cg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( edge . src . method ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. iterator () ĊĊĠĠĠ Ġfun ĠgetAll Cal le es (): ĠIterator < S oot Method > Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( edge Ġin ĠCG Holder . cg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( edge . tgt . method ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. iterator () ĊĊĠĠĠ Ġfun ĠgetAll Edges (): ĠIterator < Pair < S oot Method , S oot Method >> Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( edge Ġin ĠCG Holder . cg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġedge . src (). method () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtgt Ġ= Ġedge . tgt (). method () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( src , Ġtgt )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. iterator () ĊĊĊĠĠĠ Ġprivate Ġfun Ġgenerate By Flow d roid ( input Format : ĠInt , Ġcg Algorithm : ĠCall graph Algorithm ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo flow Application Ġ= ĠSetup Application ( Config . get (). version Sdk File . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . get (). apk File . toString ()) ĊĠĠĠĠĠĠĠ Ġinfo flow Application . so ot Config Ġ= Ġobject Ġ: ĠS oot Config For Android () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset S oot Options ( options : ĠOptions ?, Ġconfig : ĠInfo flow Configuration ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . set S oot Options ( options , Ġconfig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig !!. call graph Algorithm Ġ= Ġcg Algorithm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScene . v (). init () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScene . v (). apply _ options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . get (). excluded Pk gs ?. also { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . info ( this , Ġ" should Ġexclude ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ exclude ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ no _ bodies _ for _ excluded ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ force _ android _ jar ( Config . get (). version Sdk File . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ so ot _ classpath ( Config . get (). version Sdk File . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ process _ dir ( listOf ( Config . get (). apk File . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ src _ prec ( input Format ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset _ output _ format ( Options . output _ format _ dex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinfo flow Application . set Callback File ( Config . get (). android Callbacks File . toString ()) ĊĠĠĠĠĠĠĠ Ġinfo flow Application . construct Call graph () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Deprecated (" never Ġused Ġconstruct Ġroutine ") ĊĠĠĠ Ġprivate Ġfun Ġgenerate By S oot CHA ( input Format : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠG . reset () ĊĠĠĠĠĠĠĠ ĠScene . v (). apply _ options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ allow _ phantom _ refs ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ whole _ program ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ prepend _ classpath ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ process _ multiple _ dex ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ validate ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ force _ android _ jar ( Config . get (). version Sdk File . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ so ot _ classpath ( Config . get (). version Sdk File . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ process _ dir ( listOf ( Config . get (). apk File . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ src _ prec ( input Format ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset _ output _ format ( Options . output _ format _ dex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠPack Manager . v (). get Pack (" wj tp "). add ( Transform (" wj tp . cg cha ", Ġobject : ĠScene Transformer (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinternal Transform ( phase Name : ĠString , Ġoptions : ĠMap < String , String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCH AT rans former . v (). transform () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ ĠMain . v (). run ( array Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p ", Ġ" wj pp ", Ġ" enabled : true ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p ", Ġ" wj op ", Ġ" enabled : false ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p ", Ġ" wj ap ", Ġ" enabled : false " ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun ĠIterator < S oot Method >. except ( except ed : ĠS oot Method ): ĠIterator < S oot Method > Ġ{ ĊĠĠĠ Ġreturn Ġthis . as Sequence (). filter { Ġit . signature Ġ!= Ġexcept ed . signature Ġ}. iterator () Ċ } Ċ