/* Ċ * ĠCopyright Ġ 2 0 1 9 Ġpeng u in _ ww y < 9 4 0 3 7 5 6 0 6 @ qq . com > Ċ * Ċ * ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġcom . ded x . dex . parser Ċ Ċ import Ġcom . android . dex . Dex Ċ import Ġcom . ded x . dex . struct . Annotation Ċ import Ġcom . ded x . dex . struct . Attr Key Ċ import Ġcom . ded x . dex . struct . Attr Value Ċ import Ġcom . ded x . dex . struct . Attr Value List Ċ import Ġcom . ded x . dex . struct . Class Node Ċ import Ġcom . ded x . dex . struct . Dex Node Ċ import Ġcom . ded x . dex . struct . Enc Ċ import Ġcom . ded x . dex . struct . Visibility Ċ import Ġcom . ded x . utils . Decode Exception Ċ import Ġcom . google . common . f logger . Fluent Logger Ċ Ċ class ĠAn notations Parser ( val Ġdex : ĠDex Node , Ġval Ġcls : ĠClass Node ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠFluent Logger . for En closing Class () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠVIS IB IL ITIES Ġ= Ġenum Values < Visibility >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġread Annotation ( dex : ĠDex Node , Ġsection : ĠDex . Section , Ġread Visibility : ĠBoolean ): ĠAnnotation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠEn c Value Parser ( dex , Ġsection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvisibility : ĠVisibility ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Visibility ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġsection . read Byte (). to U Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠVIS IB IL ITIES [ v . toInt ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Index Ġ= Ġsection . read U le b 1 2 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsection . read U le b 1 2 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠLinkedHashMap < String , ĠAttr Value >( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdex . getString ( section . read U le b 1 2 8 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ name ] Ġ= Ġparser . parse Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdex . getType ( type Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= ĠAnnotation ( visibility , Ġtype , Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . getAs ObjectType () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" Incorrect Ġtype Ġfor Ġannotation : Ġ$ annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġannotation ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsection Ġ= Ġdex . dex . open ( offset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclass Annotation Offset Ġ= Ġsection . readInt () ĊĠĠĠĠĠĠĠ Ġval Ġfields Count Ġ= Ġsection . readInt () ĊĠĠĠĠĠĠĠ Ġval Ġannotated Method Count Ġ= Ġsection . readInt () ĊĠĠĠĠĠĠĠ Ġval Ġannotation Parameters Count Ġ= Ġsection . readInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( class Annotation Offset Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcls . setValue ( Attr Key . AN NOT ATION , Ġread Annotation Set ( class Annotation Offset )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfields Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Node Ġ= Ġcls . search Field ById ( section . readInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Node ?. setValue ( Attr Key . AN NOT ATION , Ġread Annotation Set ( section . readInt ())) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Warning (). log (" Not Ġfind Ġ[ ${ cls . cls Info . fullName }] Ġfield Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġadd Ġannotation Ġ${ read Annotation Set ( section . readInt ()) }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġannotated Method Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Node Ġ= Ġcls . search Method ById ( section . readInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Node ?. setValue ( Attr Key . AN NOT ATION , Ġread Annotation Set ( section . readInt ())) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Warning (). log (" Not Ġfind Ġ[ ${ cls . cls Info . fullName }] Ġmethod Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġadd Ġannotation Ġ${ read Annotation Set ( section . readInt ()) }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġannotation Parameters Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Node Ġ= Ġcls . search Method ById ( section . readInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġss Ġ= Ġdex . open Section ( section . readInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġss . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation List Ġ= ĠArrayList < Attr Value List >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation List . add ( read Annotation Set ( ss . readInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Node ?. setValue ( Attr Key . M TH _ PARAMETERS _ AN NOT ATION , ĠAttr Value List ( annotation List )) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Warning (). log (" Not Ġfind Ġ[ ${ cls . cls Info . fullName }] Ġmethod Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġadd Ġparameters Ġannotation Ġ${ Attr Value List ( annotation List )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Annotation Set ( offset : ĠInt ): ĠAttr Value List Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttr Value List . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsection Ġ= Ġdex . dex . open ( offset ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsection . readInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAttr Value List . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Attr Value >( size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġan Section Ġ= Ġdex . dex . open ( section . readInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġread Annotation ( dex , Ġan Section , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Attr Value ( Enc . ENC _ AN NOT ATION , Ġannotation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAttr Value List ( list ) ĊĠĠĠ Ġ} Ċ } Ċ