package Ġcom . did ig lobal . boost er . transform . medi ap layer Ċ Ċ import Ġcom . did ig lobal . boost er . kotlin x . as Iterable Ċ import Ġcom . did ig lobal . boost er . kotlin x . file Ċ import Ġcom . did ig lobal . boost er . kotlin x . touch Ċ import Ġcom . did ig lobal . boost er . transform . Transform Context Ċ import Ġcom . did ig lobal . boost er . transform . asm . Class Transformer Ċ import Ġcom . did ig lobal . boost er . transform . asm . transform Ċ import Ġcom . did ig lobal . boost er . transform . media . player . Build Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġorg . object web . asm . Op codes Ċ import Ġorg . object web . asm . tree . Class Node Ċ import Ġorg . object web . asm . tree . Method Insn Node Ċ import Ġorg . object web . asm . tree . Type Insn Node Ċ import Ġjava . io . PrintWriter Ċ Ċ private Ġconst Ġval ĠMED IA _ PLAYER Ġ= Ġ" android / media / MediaPlayer " Ċ Ċ private Ġconst Ġval ĠSH ADOW _ MEDIA _ PLAYER Ġ= Ġ" com / did ig lobal / boost er / instrument / Shadow MediaPlayer " Ċ Ċ /** Ċ Ġ* Ġ@ author Ġne ighb W ang Ċ Ġ*/ Ċ @ Auto Service ( Class Transformer :: class ) Ċ class ĠMedia Player Transformer Ġ: ĠClass Transformer Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlogger : ĠPrintWriter ĊĊĠĠĠ Ġoverride Ġfun Ġon Pre Transform ( context : ĠTransform Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . logger Ġ= Ġcontext . reports Dir . file ( Build . AR TI FACT ). file ( context . name ). file (" report . txt "). touch (). print Writer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Transform ( context : ĠTransform Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . logger . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( context : ĠTransform Context , Ġklass : ĠClass Node ): ĠClass Node Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( klass . name Ġ== ĠSH ADOW _ MEDIA _ PLAYER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġklass . methods ?. forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . instructions ?. iterator ()?. as Iterable ()?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE STATIC Ġ-> Ġ( it Ġas ĠMethod Insn Node ). owner Ġ== ĠMED IA _ PLAYER Ġ&& Ġit . name Ġ== Ġ" create " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEW Ġ-> Ġ( it Ġas ĠType Insn Node ). desc Ġ== ĠMED IA _ PLAYER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . opcode Ġ== ĠOp codes . IN VOKE STATIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . println (" Ġ* Ġ${ ( it Ġas ĠMethod Insn Node ). owner }.${ it . name }${ it . desc } Ġ=> Ġ$ SH ADOW _ MEDIA _ PLAYER .${ it . name }${ it . desc }: Ġ${ klass . name }.${ method . name }${ method . desc }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . owner Ġ= ĠSH ADOW _ MEDIA _ PLAYER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . opcode Ġ== ĠOp codes . NEW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠType Insn Node ). transform ( klass , Ġmethod , Ġit , ĠSH ADOW _ MEDIA _ PLAYER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . println (" Ġ* Ġnew Ġ${ it . desc }() Ġ=> Ġ$ SH ADOW _ MEDIA _ PLAYER . new MediaPlayer : () L $ MEDIA _ PLAYER : Ġ${ klass . name }.${ method . name }${ method . desc }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ