package Ġcom . tencent . shrink er Ċ Ċ import Ġcom . tencent . shrink er . util . OpCode Util Ċ import Ġorg . object web . asm . Class Writer Ċ import Ġorg . object web . asm . Op codes Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Unchecked IOException Ċ import Ġjava . nio . file . Files ĊĊ Ċ /** Ċ Ġ* Ċ Ġ* Ġ åĲĪå¹¶ ï¼Į å¹¶ çĶŁæĪĲ R . style ables . java ç±» Ċ Ġ* Ċ Ġ*/ Ċ object ĠR Style ables File Generate Ġ{ ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæł¹æį® æĶ¶éĽĨ çļĦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgenerate ( symbols : ĠR Symbols , Ġout Path : ĠFile ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( symbols . isEmpty ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠClass Writer ( Class Writer . COMPUTE _ MAX S ) ĊĠĠĠĠĠĠĠ Ġwriter . visit ( Op codes . V 1 _ 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ACC _ PUBLIC Ġor ĠOp codes . ACC _ SYN TH ET IC Ġor ĠOp codes . ACC _ SUPER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR Symbols . R _ STYLE ABLE S _ CLASS _ NAME , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java / lang / Object ", Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( name Ġin Ġsymbols . getStyle ables (). keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . visit Field ( Op codes . ACC _ PUBLIC Ġor ĠOp codes . ACC _ STATIC Ġor ĠOp codes . ACC _ FINAL , Ġname , Ġ"[ I ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite Cl init ( symbols , Ġwriter ) ĊĠĠĠĠĠĠĠ Ġwriter . visit End () ĊĊĊĊĠĠĠĠĠĠĠ Ġ// ĠæĬ Ĭ çĶŁæĪĲ çļĦ Java æĸĩä»¶ ä¿Ŀ åŃĺåľ¨ æĸĩä»¶ å½ĵ ä¸Ń ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġwriter . toByteArray () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! out Path . isDirectory Ġ&& Ġ! out Path . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Cannot Ġmkdir Ġ$ out Path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . write ( out Path . to Path (). resolve ( RS ymbols . R _ STYLE ABLE S _ CLASS _ NAME Ġ+ Ġ". class "), Ġbytes ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġwrite Cl init ( symbols : ĠR Symbols , Ġwriter : ĠClass Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstyle ables Ġ= Ġsymbols . getStyle ables () ĊĊĠĠĠĠĠĠĠ Ġval Ġcl init Ġ= Ġwriter . visit Method ( Op codes . ACC _ STATIC , Ġ"< cl init >", Ġ" () V ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġcl init . visit Code () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġstyle ables . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġentry . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġvalue . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp Code Util . push Int ( cl init , Ġlength ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl init . visit Int Insn ( Op codes . NE WAR R AY , ĠOp codes . T _ INT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcl init . visit Insn ( Op codes . DUP ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp Code Util . push Int ( cl init , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp Code Util . push Int ( cl init , Ġvalue [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcl init . visit Insn ( Op codes . I AST ORE ) ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġi astore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcl init . visit Field Insn ( Op codes . PUT STATIC , ĠR Symbols . R _ STYLE ABLE S _ CLASS _ NAME , Ġfield , Ġ"[ I ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcl init . visit Insn ( Op codes . RETURN ) ĊĠĠĠĠĠĠĠ Ġcl init . visit Max s ( 0 , Ġ 0 ) Ġ// Ġauto Ġcompute ĊĠĠĠĠĠĠĠ Ġcl init . visit End () ĊĠĠĠ Ġ} ĊĊ Ċ }