package Ġcom . sky inu . transform tools . trace Ċ Ċ import Ġcom . sky inu . transform tools . base . Class Handler Ċ import Ġjav assist . Ct Class Ċ import Ġjav assist . Ct Method Ċ import Ġjav assist . byte code . Access Flag Ċ import Ġjav assist . expr . Cast Ċ import Ġjav assist . expr . Instance of Ċ import Ġjav assist . expr . Constructor Call Ċ import Ġjav assist . expr . Expr Editor Ċ import Ġjav assist . expr . Handler Ċ import Ġjav assist . expr . MethodCall Ċ import Ġjav assist . expr . New Array Ċ import Ġorg . gradle . api . Project Ċ Ċ class ĠTrace Ass ist ( private Ġval Ġproject : ĠProject ) Ġ: ĠClass Handler Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠTRACE _ START Ġ= Ġ" android . os . Trace . begin Section (\" % s \ "); \ n " ĊĠĠĠ Ġconst Ġval ĠTRACE _ END Ġ= Ġ" android . os . Trace . end Section (); \ n " ĊĠĠĠ Ġval ĠEX CL UDE _ LIST Ġ= Ġarray ListOf (" kotlin .") ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġexclude Packages Ġ= Ġarray ListOf < String >() ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġexclude Packages . addAll ( EXCL UDE _ LIST ) ĊĠĠĠ Ġval Ġtrace Extension Ġ= Ġproject . extensions . findBy Type ( Trace Extension :: class . java ) ĊĠĠĠ Ġtrace Extension ?. let Ġ{ ĊĠĠĠĠĠ Ġtrace Extension . exclude Packages ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġexclude Packages . addAll ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtravel Class ( ct Class : ĠC t Class ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( ct Class . is Interface Ġ|| Ġct Class . is Annotation Ġ|| Ġct Class . is Enum ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġexclude Packages . forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( safe Get PackageName ( ct Class ). startsWith ( it )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĠĠĠ Ġvar Ġoccur Error Ġ= Ġfalse ĊĠĠĠ Ġval Ġmethods Ġ= Ġct Class . declared Methods ĊĠĠĠ Ġmethods . filter Ġ{ ĊĠĠĠĠĠ Ġ!( it . modifiers . and ( Access Flag . SYN TH ET IC ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . modifiers . and ( Access Flag . AB STR ACT ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . modifiers . and ( Access Flag . NATIVE ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . modifiers . and ( Access Flag . INTERFACE ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġ! is Method With Expression ( it )) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . insertBefore ( TRACE _ START . format (" trace _${ ct Class . simple Name }_${ it . name } ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . insert After ( TRACE _ END , Ġfalse , Ġct Class . is Kotlin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoccur Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" oc cur Ġexception Ġwhen Ġhandle Ġ-> ${ ct Class . name } Ġ${ it . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" error Ġ= Ġ${ exception . message Ġ?: Ġexception . cause ?. message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ---------------------- ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġhandled Ġ&& Ġ! oc cur Error ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Method With Expression ( ct Method : ĠC t Method ?): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġis Call Method Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( ct Method Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġct Method . instrument ( object Ġ: ĠExpr Editor () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġedit ( a : ĠNew Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . edit ( a ) ĊĠĠĠĠĠĠĠ Ġis Call Method Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġedit ( c : ĠConstructor Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . edit ( c ) ĊĠĠĠĠĠĠĠ Ġis Call Method Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġedit ( c : ĠCast ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . edit ( c ) ĊĠĠĠĠĠĠĠ Ġis Call Method Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġedit ( h : ĠHandler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . edit ( h ) ĊĠĠĠĠĠĠĠ Ġis Call Method Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġedit ( i : ĠInstance of ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . edit ( i ) ĊĠĠĠĠĠĠĠ Ġis Call Method Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġedit ( m : ĠMethod Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . edit ( m ) ĊĠĠĠĠĠĠĠ Ġis Call Method Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġreturn Ġis Call Method ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsafe Get PackageName ( ct Class : ĠC t Class ): String { ĊĠĠĠ Ġtry { ĊĠĠĠĠĠ Ġreturn Ġct Class . packageName ĊĠĠĠ Ġ} catch Ġ( ex : Exception ){ ĊĠĠĠĠĠ Ġprintln (" get Ġpackage Ġerror Ġ$ ct Class ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ"" ĊĠ Ġ} Ċ }