package Ġcom . did ich ux ing . d ora emon kit . plugin . clas str ans former Ċ Ċ import Ġcom . did ich ux ing . d ora emon kit . plugin .* Ċ import Ġcom . did ich ux ing . d ora emon kit . plugin . extension . Slow Method Ext Ċ import Ġcom . did ich ux ing . d ora emon kit . plugin . stack _ method . Method Stack Node Ċ import Ġcom . did ich ux ing . d ora emon kit . plugin . stack _ method . Method Stack Node Util Ċ import Ġcom . did ig lobal . boost er . annotations . Priority Ċ 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 . as Iterable Ċ import Ġcom . did ig lobal . boost er . transform . asm . className Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġorg . object web . asm . Op codes .* Ċ import Ġorg . object web . asm . tree .* Ċ Ċ /** Ċ Ġ* Ġ================================= =============== Ċ Ġ* Ġ ä½ľ ĠĠĠ Ġ èĢħ ï¼ļ jint ï¼Ī éĩĳ åı° ï¼ī Ċ Ġ* Ġ çīĪ ĠĠĠ Ġæľ¬ ï¼ļ 1 . 0 Ċ Ġ* ĠåĪĽå»º æĹ¥æľŁ ï¼ļ 2 0 2 0 / 5 / 1 4 - 1 8 : 0 7 Ċ Ġ* Ġæı ı ĠĠĠ Ġ è¿° ï¼ļ åħ¥ åı£ åĩ½æķ° Ġæ ħ ¢ åĩ½æķ° è°ĥçĶ¨ æłĪ Ġwiki : https :// juejin . im / post / 5 e 8 d 8 7 c 4 f 2 6 5 da 4 7 ad 2 1 8 e 6 b Ċ Ġ* Ġ ä¿® è®¢ åİĨåı² ï¼ļ ä¸įè¦ģ æĮĩå®ļ èĩªåĬ¨ æ³¨ åħ¥ ĠéľĢè¦ģ æīĭåĬ¨ åľ¨ Do Kit Asm Transformer ä¸Ń éĢļè¿ĩ éħįç½® åĪĽå»º Ċ Ġ* Ġ åİŁ çĲĨ : transform () æĸ¹æ³ķ çļĦ è°ĥçĶ¨ æĺ¯ æĹł åºı çļĦ Ġ Ġ åİŁåĽł : åĵª ä¸Ģä¸ª class ä¼ļ åħĪ è¢« transformer æī§è¡Į æĺ¯ ä¸į ç¡® å®ļçļĦ Ġ Ġ ä½Ĩæĺ¯ æ¯ı ä¸Ģä¸ª class è¢« transformer æī§è¡Į é¡ºåºı æĺ¯ éģ µ å¾ª transformer çļĦ Priority è§ĦåĪĻ çļĦ Ċ Ġ* Ġ================================= =============== Ċ Ġ*/ Ċ @ Priority ( 3 ) Ċ @ Auto Service ( Class Transformer :: class ) Ċ class ĠEnter Method Stack Transformer Ġ: ĠClass Transformer Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġthreshold Time Ġ= ĠDo Kit Ext Util . slow Method Ext . stack Method . threshold Time ĊĠĠĠ Ġprivate Ġval Ġlevel Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġfun Ġtransform ( context : ĠTransform Context , Ġklass : ĠClass Node ): ĠClass Node Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is Release ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Do Kit Ext Util . d okit Plugin Switch Open ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Do Kit Ext Util . d okit Slow Method Switch Open ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Do Kit Ext Util . S LOW _ METHOD _ STR ATE GY Ġ== ĠS low Method Ext . STR ATE GY _ NORMAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Do Kit Ext Util . ignore Package Names ( klass . className )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// é»ĺè®¤ä¸º Application ĠonCreate ĠåĴĮ attach Base Context ĊĠĠĠĠĠĠĠ Ġval Ġenter Methods Ġ= ĠDo Kit Ext Util . slow Method Ext . stack Method . enter Methods ĊĠĠĠĠĠĠĠ Ġ// æī¾ ä¸įåĪ° éħįç½® çļĦ Application ĊĠĠĠĠĠĠĠ Ġif Ġ( enter Methods . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Name Ġ= Ġklass . super Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åħĪ åĪ¤æĸŃ çĪ¶ ç±» ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Name . isNotEmpty () Ġ&& Ġ( super Name Ġ== Ġ" android / app / Application " Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Name Ġ== Ġ" android / support / multi dex / Multi Dex Application " Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Name Ġ== Ġ" android x / multi dex / Multi Dex Application ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . methods . filter Ġ{ Ġmethod Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( method Node . name Ġ== Ġ" onCreate " Ġ&& Ġmethod Node . desc Ġ== Ġ" () V ") Ġ|| Ġ( method Node . name Ġ== Ġ" attach Base Context " Ġ&& Ġmethod Node . desc Ġ== Ġ"( L android / content / Context ;) V ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġmethod Nodes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¯»åıĸ åħ¨ æĺ¯ åĩ½æķ° è°ĥçĶ¨ çļĦ Insn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Nodes . forEach Ġ{ Ġmethod Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperate Method Insn ( klass , Ġmethod Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenter Methods . forEach Ġ{ Ġenter MethodName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . methods . forEach Ġ{ Ġmethod Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall MethodName Ġ= Ġ"${ klass . className }.${ method Node . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all MethodName Ġ== Ġenter MethodName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ context . project Dir . last Path ()} -> level --> $ level Ġmath ched Ġenter Method == =>$ all MethodName ". println () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperate Method Insn ( klass , Ġmethod Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġklass ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġoperate Method Insn ( klass : ĠClass Node , Ġmethod Node : ĠMethod Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è¯»åıĸ åħ¨ æĺ¯ åĩ½æķ° è°ĥçĶ¨ çļĦ æĮĩä»¤ ĊĠĠĠĠĠĠĠ Ġmethod Node . instructions . as Iterable (). filter Is Instance ( Method Insn Node :: class . java ). filter Ġ{ Ġmethod Insn Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Insn Node . name Ġ!= Ġ"< init >" ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġmethod Insn Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Stack Node Ġ= ĠMethod Stack Node ( level , Ġmethod Insn Node . owner ClassName , Ġmethod Insn Node . name , Ġmethod Insn Node . desc , Ġklass . className , Ġmethod Node . name , Ġmethod Node . desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Stack Node Util . add Method Stack Node ( level , Ġmethod Stack Node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// åĩ½æķ° åĩº åħ¥ åı£ æıĴåħ¥ èĢĹ æĹ¶ ç»Łè®¡ ä»£çłģ ĊĠĠĠĠĠĠĠ Ġ// æĸ¹æ³ķ åħ¥ åı£ æıĴåħ¥ ĊĠĠĠĠĠĠĠ Ġmethod Node . instructions . insert ( create Method Enter Insn List ( level , Ġklass . className , Ġmethod Node . name , Ġmethod Node . desc , Ġmethod Node . access )) ĊĠĠĠĠĠĠĠ Ġ// æĸ¹æ³ķ åĩº åı£ æıĴåħ¥ ĊĠĠĠĠĠĠĠ Ġmethod Node . instructions . getMethod Exit Insn Nodes ()?. forEach Ġ{ Ġmethod Exit Insn Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Node . instructions . insertBefore ( method Exit Insn Node , Ġcreate Method Exit Insn List ( level , Ġklass . className , Ġmethod Node . name , Ġmethod Node . desc , Ġmethod Node . access )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĽå»º æħ¢ åĩ½æķ° åħ¥ åı£ æĮĩä»¤ éĽĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Method Enter Insn List ( level : ĠInt , ĠclassName : ĠString , ĠmethodName : ĠString , Ġdesc : ĠString , Ġaccess : ĠInt ): ĠIn sn List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Static Method Ġ= Ġaccess Ġand ĠACC _ STATIC Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( Insn List ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Static Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Field Insn Node ( GET STATIC , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" INSTANCE ", Ġ" L com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ; ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , ĠDo Kit Ext Util . STACK _ METHOD _ LEVEL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġthreshold Time )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġlevel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( className )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( methodName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( desc )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Method Insn Node ( IN VOKE VIRTUAL , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" re code Static Method Cost Start ", Ġ"( II IL java / lang / String ; Ljava / lang / String ; Ljava / lang / String ;) V ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Field Insn Node ( GET STATIC , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" INSTANCE ", Ġ" L com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ; ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , ĠDo Kit Ext Util . STACK _ METHOD _ LEVEL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġthreshold Time )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġlevel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( className )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( methodName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( desc )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Var Insn Node ( AL O AD , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Method Insn Node ( IN VOKE VIRTUAL , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" re code Object Method Cost Start ", Ġ"( II IL java / lang / String ; Ljava / lang / String ; Ljava / lang / String ; Ljava / lang / Object ;) V ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĽå»º æħ¢ åĩ½æķ° éĢĢåĩº æĹ¶çļĦ æĮĩä»¤ éĽĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Method Exit Insn List ( level : ĠInt , ĠclassName : ĠString , ĠmethodName : ĠString , Ġdesc : ĠString , Ġaccess : ĠInt ): ĠIn sn List Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Static Method Ġ= Ġaccess Ġand ĠACC _ STATIC Ġ!= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( Insn List ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Static Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Field Insn Node ( GET STATIC , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" INSTANCE ", Ġ" L com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ; ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġthreshold Time )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġlevel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( className )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( methodName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( desc )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Method Insn Node ( IN VOKE VIRTUAL , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" re code Static Method Cost End ", Ġ"( I IL java / lang / String ; Ljava / lang / String ; Ljava / lang / String ;) V ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Field Insn Node ( GET STATIC , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" INSTANCE ", Ġ" L com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ; ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġthreshold Time )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Int Insn Node ( B IP USH , Ġlevel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( className )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( methodName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( L dc Insn Node ( desc )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Var Insn Node ( AL O AD , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Method Insn Node ( IN VOKE VIRTUAL , Ġ" com / did ich ux ing / d ora emon kit / aop / method _ stack / Method Stack Util ", Ġ" re code Object Method Cost End ", Ġ"( I IL java / lang / String ; Ljava / lang / String ; Ljava / lang / String ; Ljava / lang / Object ;) V ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } ĊĊ