package Ġcom . q xml . gradle Ċ Ċ import Ġcom . android . build . gradle .* Ċ import Ġcom . android . build . gradle . api . Base Variant Ċ import Ġcom . android . build . gradle . internal . api . Default Android Source Set Ċ import Ġcom . android . build . gradle . internal . res . Generate Library R File Task Ċ import Ġcom . android . build . gradle . internal . res . Link Application Android Resources Task Ċ import Ġcom . google . common . io . Files Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . q xml . Q xml Extension Ċ import Ġcom . q xml . constant . Constants Ċ import Ġcom . q xml . tools . encrypt . RSA Utils Ċ import Ġcom . q xml . tools . log . Log Util Ċ import Ġcom . q xml . tools . model . Gen Class Info Model Ċ import Ġcom . q xml . transform . Q Xml Transform Ċ import Ġgro ovy . util . Xml Sl ur per Ċ import Ġorg . gradle . api . Domain Object Set Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġjava . io . File Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . jar . Jar File Ċ import Ġjava . util . zip . CRC 3 2 Ċ Ċ private Ġconst Ġval ĠPUBLIC _ KEY _ STR Ġ= Ġ" M IG f MA 0 G CS q G SI b 3 DQ E BA QU AA 4 GN AD CB i Q KB g Q DA k Wb 8 V zy hk C zk iz n SR j A ZE 8 AL w op 1 7 CN 0 0 nz Bv GL b aj pv tx MC eri MC W Te D pit D 8 3 C 4 w xx j R Gl V Bit j 6 f VV H 8 x Im 1 h Od Q 5 lr Dx GQ 9 T 6 mv k 7 q / a Yl 4 u Ed F Zl Ir Fx Vl I ws j cd HW J 2 xd I 9 R yo H ak w GB Mj UT 8 w 1 o 6 NB 1 fg T SH u Y 8 3 D pw ID AQ AB " Ċ Ċ class ĠCode Plugin : ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġq xml Valid Code : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġq xml Log Enable : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġq xml Using Stable Id : ĠString ĊĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson Builder (). disable Html Esc aping (). create () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġq xml Config : ĠQ xml Extension ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpublic RO ut put File : ĠFile ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġq xml Valid Code Ġ= Ġproject . properties [ Constants . Q XML _ VALID _ CODE ]?. toString () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġq xml Log Enable Ġ= Ġproject . properties [ Constants . Q XML _ LOG _ ENABLE ]?. toString () Ġ?: Ġ" false " ĊĠĠĠĠĠĠĠ Ġq xml Using Stable Id Ġ= Ġproject . properties [ Constants . Q XML _ USING _ ST ABLE _ ID ]?. toString () Ġ?: Ġ" true " ĊĠĠĠĠĠĠĠ Ġq xml Config Ġ= Ġproject . extensions . create (" q xml ", ĠQ xml Extension :: class . java , Ġproject ) ĊĠĠĠĠĠĠĠ Ġpublic RO ut put File Ġ= Ġproject . build Dir . resolve ( Constants . Q XML _ CACHE _ DIR ). parent File . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . PUBLIC _ FILE _ NAME ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġproject . plugins . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApp Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġproject . extensions . get ByName (" android ") Ġas ĠBase Extension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension . packaging Options . pick First ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= ĠQ Xml Transform ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension . register Transform ( transform ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= Ġproject . extensions . findBy Type ( App Extension :: class . java ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Rs And Layout Id ( project , Ġapplication Variants , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp . default Config . java Compile Options . annotation Processor Options . arguments . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput If Absent ( Constants . Q XML _ VALID _ CODE , Ġq xml Valid Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput If Absent ( Constants . Q XML _ LOG _ ENABLE , Ġq xml Log Enable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . after Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp . application Variants . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . tasks . find ByName (" transform Classes And Resources With Q Xml Transform For ${ v . name . capitalize () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . do First Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform . packageName Ġ= Ġget PackageName ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform . cur Build Type Ġ= Ġv . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLibrary Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions . findBy Type ( Library Extension :: class . java )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Config . java Compile Options . annotation Processor Options . arguments . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput If Absent ( Constants . Q XML _ VALID _ CODE , Ġq xml Valid Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput If Absent ( Constants . Q XML _ LOG _ ENABLE , Ġq xml Log Enable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackaging Options . pick First ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Rs And Layout Id ( project , Ġlibrary Variants , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfigure Source Set ( project ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( q xml Using Stable Id . equals (" true ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġandroid App Ġ= Ġproject . extensions . findBy Type ( App Extension :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid App ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa apt Params Ġ= Ġandroid App . a apt Options . additional Parameters Ġ?: Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic FilePath Ġ= Ġproject . build Dir . resolve (" q xml ${ File . separator } public . txt "). absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! a apt Params . contains ( public FilePath )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa apt Params . add ("-- stable - ids ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa apt Params . add ( public FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid App . a apt Options . additional Parameters Ġ= Ġa apt Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . after Evaluate Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġq xml Config . fix Build Type Un Set Param () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . plugins . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLibrary Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Ġ= Ġproject . extensions . findBy Type ( Library Extension :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary ?. packaging Options ?. pick First ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary ?. library Variants ?. forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Processor Option ( v , ĠConstants . Q XML _ VALID _ CODE , Ġq xml Valid Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Processor Option ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv , ĠConstants . Q XML _ LOG _ ENABLE , Ġif Ġ( q xml Config . getConfig By Build Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . name . capitalize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). log Enable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ" true " Ġelse Ġ" false " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Pre Build Config ( project , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Q xml Config ( project , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Task Order ( project , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApp Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġandroid App Ġ= Ġproject . extensions . findBy Type ( App Extension :: class . java ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid App . packaging Options . pick First ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid App . application Variants . all Ġ{ Ġv Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Q xml Config ( project , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġv . name . capitalize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġproject . build Dir . resolve ( Constants . Q XML _ CACHE _ PATH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! output Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Project Mer ger Xml File Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . build Dir . resolve ( Constants . INTER MEDI ATES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( Constants . INCREMENT AL ). resolve (" merge ${ type } Resources ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( Constants . MER GER _ XML ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstyle Watch Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" q xml Watch ${ type } Style ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStyle Watch Task :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . output Dir Ġ= Ġoutput Dir . resolve ( Constants . Q XML _ STYLE _ CACHE _ DIR _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . build Type Ġ= Ġv . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . merge Xml File Ġ= Ġcur Project Mer ger Xml File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmerge Xml Files Ġ= Ġget Mer ger Xml Files ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . all Raw Android Resources . files , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Project Mer ger Xml File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Watch Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" q xml Watch ${ type } Layout ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Watch Task :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . output Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir . resolve ( Constants . Q XML _ LAYOUT _ CACHE _ DIR _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . build Type Ġ= Ġv . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . merge Xml Files Ġ= Ġmerge Xml Files ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . merge Assets Provider . get (). depends On ( style Watch Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Watch Task . must Run After ( v . merge Resources Provider . get ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . merge Assets Provider . get (). depends On ( layout Watch Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Watch Task . must Run After ( v . merge Resources Provider . get ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// v . register Java Generating Task ( task , Ġoutput Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Pre Build Config ( project , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Q xml Config ( project , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Task Order ( project , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Mer ger Xml Files ( project : ĠProject , Ġfiles : ĠSet < File >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Project Mer ger Xml File : ĠFile , Ġtype : ĠString ): ĠSet < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmerge Xml Files Ġ= Ġmutable Set Of < File >() ĊĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ Ġdir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġdir . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . contains ( Constants . INTER MEDI ATES ) Ġ&& Ġpath . contains ( Constants . BUILD )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcur Dir : ĠFile ? Ġ= Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cur Dir Ġ!= Ġnull Ġ&& Ġcur Dir . name Ġ!= ĠConstants . INTER MEDI ATES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Dir Ġ= Ġcur Dir . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Dir Ġ= Ġcur Dir . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Dir Ġ!= Ġnull Ġ&& Ġparent Dir . name Ġ== ĠConstants . BUILD Ġ&& Ġparent Dir . parent File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprojectName Ġ= Ġparent Dir . parent File . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( projectName Ġ!= Ġproject . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Xml Files . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Dir . resolve ( Constants . INCREMENT AL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve (" package ${ type } Resources ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( Constants . MER GER _ XML ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmerge Xml Files . add ( cur Project Mer ger Xml File ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmerge Xml Files ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Pre Build Config ( project : ĠProject , Ġv : ĠBase Variant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġv . name ĊĠĠĠĠĠĠĠ Ġproject . tasks . get ByName (" pre ${ type . capitalize ()} Build "). do First Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Q xml Config Ġ= Ġq xml Config . getConfig By Build Type ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . enable Ġ= Ġcur Q xml Config . log Enable ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . debug Ġ= Ġcur Q xml Config . debug Enable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġapplication æĹ¶ åĲĪå¹¶ æīĢæľī q xml _ config èµĦæºĲ ï¼Į åľ¨ transform ä¸Ń è§£æŀĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmerge Q xml Config ( project : ĠProject , Ġtype : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmer ger Java Resource Task Ġ= Ġproject . tasks . get ByName (" merge ${ type } Java Resource ") ĊĊĠĠĠĠĠĠĠ Ġmer ger Java Resource Task . outputs . up ToDate When Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ConfigFile ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess ConfigFile ( merge Java Resource Task : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġconfig File : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġfinal ConfigFile : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġall View Parse Class Info Models Ġ= Ġmutable ListOf < Gen Class Info Model >() ĊĠĠĠĠĠĠĠ Ġmerge Java Resource Task . inputs . files . forEach Ġ{ Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . exists () Ġ&& Ġf . name . endsWith (". jar ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar File Ġ= ĠJar File ( f . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġjar File . get Jar Entry ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġins Ġ= Ġjar File . getInputStream ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġins . reader (). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgen Class Info Model Ġ= Ġgson . fromJson ( content , ĠGen Class Info Model :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! gen Class Info Model . sign . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Ġ= Ġgen Class Info Model . sign ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Class Info Model . sign Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Class Info Model . valid Code Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Model Info Without Sign Json Str Ġ= Ġgson . toJson ( gen Class Info Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Bytes : ĠByteArray Ġ= Ġinfo Model Info Without Sign Json Str . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrc 3 2 . update ( info Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc 3 2 Str Ġ= Ġjava . lang . Long . to HexString ( crc 3 2 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd 5 Str Ġ= ĠString ( Message Digest . getInstance (" md 5 "). digest ( info Bytes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Str Ġ= Ġcrc 3 2 Str Ġ+ Ġ"_" Ġ+ Ġmd 5 Str Ġ+ Ġ"_" Ġ+ Ġinfo Model Info Without Sign Json Str . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypt Sign Ġ= ĠRSA Utils . decrypt By PublicKey ( sign , ĠPUBLIC _ KEY _ STR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sign Str Ġ!= Ġdecrypt Sign ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" è¿ľç¨ĭ ä¾Ŀèµĸ çļĦ q xml éħįç½® éĶĻè¯¯ ï¼Į è¯· ç¡®å®ļ ä¾Ŀèµĸ æĿ¥ æºĲ æĺ¯åĲ¦ æŃ£ç¡® :${ f . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . pl (" found Ġq xml Ġremote Ġconfig Ġfile Ġin Ġ" Ġ+ Ġf . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gen Class Info Model . valid Code Ġ!= Ġq xml Valid Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" q xml ä¸´ æĹ¶ éªĮ çŃ¾ éĶĻè¯¯ ï¼Į è¯· ç¡®å®ļ è¯¥ éħįç½® æĿ¥ æºĲ æŃ£ç¡® ï¼ļ ${ f . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . pl (" found Ġq xml Ġlocal Ġconfig Ġfile Ġin Ġ" Ġ+ Ġf . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall View Parse Class Info Models . add ( gen Class Info Model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġins . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . absolute Path . endsWith ( Constants . Q XML _ PARSE _ FINAL _ CONFIG _ FILE _ NAME , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ConfigFile Ġ= Ġf ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . absolute Path . endsWith ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig File Ġ= Ġf ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinal ConfigFile ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configFile Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . pl (" current Ġproject Ġconfig Ġfile Ġis Ġ" Ġ+ Ġconfig File !!. absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġconfig File !!. read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ"{\" version Code \": ${ Constants . Q XML _ VERSION _ CODE }, \" view Parse List \": [], \" view Replace List \": [], \" view Gen Class Model Map \": {}, \" interface Model Map \": {}, \" gen ClassName Map \": {}, \" parent Class Map \": {}, \" localVar Map \": {}, \" compat View Info Model Map \": {}, \" layout Param Init Map \": {}, \" valid Code \":\" ${ q xml Valid Code }\" }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Gen Class Info Model Ġ= Ġgson . fromJson ( content , ĠGen Class Info Model :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Gen Class Info Model . valid Code Ġ!= Ġq xml Valid Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" q xml ä¸´ æĹ¶ éªĮ çŃ¾ éĶĻè¯¯ ï¼Į è¯· ç¡®å®ļ è¯¥ éħįç½® æĿ¥ æºĲ æŃ£ç¡® ï¼ļ ${ configFile !!. absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall View Parse Class Info Models . add ( this Gen Class Info Model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Gen Class Info Model Ġ= ĠGen Class Info Model () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . version Code Ġ= ĠConstants . Q XML _ VERSION _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . view Parse List Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . view Replace List Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . gen ClassName Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . interface Model Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . view Gen Class Model Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . parent Class Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . localVar Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . compat View Info Model Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . layout Param Init Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . call On Finish Inf late Map Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . sign Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . valid Code Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġall View Parse Class Info Models . sort () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . version Code Ġ= Ġall View Parse Class Info Models . last OrNull ()?. version Code Ġ?: Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Parse Map Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Replace Map Ġ= Ġhash Map Of < String , ĠString >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġall View Parse Class Info Models . forEach Ġ{ Ġinfo Model Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Model . view Parse List . forEach Ġ{ Ġview Parse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! view Parse Map . containsKey ( view Parse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Parse Map [ view Parse ] Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . view Parse List . add ( view Parse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Model . view Replace List . forEach Ġ{ Ġview Replace Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! view Replace Map . containsKey ( view Replace )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Replace Map [ view Replace ] Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . view Replace List . add ( view Replace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . gen ClassName Map . put All ( info Model . gen ClassName Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . interface Model Map . put All ( info Model . interface Model Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . view Gen Class Model Map . put All ( info Model . view Gen Class Model Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . parent Class Map . put All ( info Model . parent Class Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . compat View Info Model Map . put All ( info Model . compat View Info Model Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . layout Param Init Map . put All ( info Model . layout Param Init Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info Model . call On Finish Inf late Map Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . call On Finish Inf late Map . put All ( info Model . call On Finish Inf late Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Model . localVar Map . forEach Ġ{ Ġ( varName , ĠlocalVar Info Model ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( final Gen Class Info Model . localVar Map [ varName ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" æľī çĽ¸åĲĮ çļĦ åıĺéĩı åĲį ${ varName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Gen Class Info Model . localVar Map [ varName ] Ġ= ĠlocalVar Info Model ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Gen Info Json Str Ġ= Ġgson . toJson ( final Gen Class Info Model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log Util . pl (" final Ġview Parse Ġclass Ġ$ final Gen Info Json Str ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text ( final Gen Info Json Str ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Processor Option ( variant : ĠBase Variant , Ġkey : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvariant . java Compile Options . annotation Processor Options . arguments . put If Absent ( key , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// å°Ĩ process Java Res Task ä¾Ŀèµĸ apt ĊĠĠĠ Ġprivate Ġfun Ġchange Task Order ( project : ĠProject , Ġvariant : ĠBase Variant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġvariant . name ĊĠĠĠĠĠĠĠ Ġval Ġtype Cap Ġ= Ġtype . capitalize () ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġproject . build Dir . resolve ( Constants . Q XML _ DIR _ NAME ). resolve ( Constants . Q XML _ PROJECT _ BUILD _ TEMP _ RES _ PATH ) ĊĊĠĠĠĠĠĠĠ Ġval Ġapt ConfigFile Ġ= Ġproject . build Dir . resolve (" generated ${ File . separator } ap _ generated _ sources ${ File . separator }${ type }${ File . separator } out "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Q XML _ CON IF G _ PATH ĊĠĠĠĠĠĠĠ Ġ). resolve ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġk apt ConfigFile Ġ= Ġproject . build Dir . resolve (" generated ${ File . separator } source ${ File . separator } k apt ${ File . separator }${ type } "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Q XML _ CON IF G _ PATH ĊĠĠĠĠĠĠĠ Ġ). resolve ( Constants . Q XML _ PARSE _ CONFIG _ FILE _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcopy K apt Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" copy ${ type Cap } K apt Process Q xml ConfigFile ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy ConfigFile Task :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . output Dir Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . configFile Ġ= Ġk apt ConfigFile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcopy K apt Task . only If Ġ{ Ġk apt ConfigFile . exists () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcopy A pt Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" copy ${ type Cap } A pt Process Q xml ConfigFile ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy ConfigFile Task :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . output Dir Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . configFile Ġ= Ġapt ConfigFile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcopy A pt Task . only If Ġ{ Ġapt ConfigFile . exists () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprocess Java Res Task Ġ= Ġproject . tasks . get ByName (" process ${ type Cap } Java Res ") ĊĠĠĠĠĠĠĠ Ġprocess Java Res Task . depends On ( copy K apt Task ) ĊĠĠĠĠĠĠĠ Ġprocess Java Res Task . depends On ( copy A pt Task ) ĊĊĠĠĠĠĠĠĠ Ġval Ġk apt Task Ġ= Ġproject . tasks . find ByName (" k apt ${ type Cap } Kotlin ") ĊĠĠĠĠĠĠĠ Ġk apt Task ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Java Res Task . depends On ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy K apt Task . depends On ( k apt Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy K apt Task . must Run After ( k apt Task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcompile J av ac Task Ġ= Ġproject . tasks . find ByName (" compile ${ type Cap } Java With J av ac ") ĊĠĠĠĠĠĠĠ Ġcompile J av ac Task ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Java Res Task . depends On ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy A pt Task . depends On ( compile J av ac Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy A pt Task . must Run After ( compile J av ac Task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Q xml Config ( project : ĠProject , Ġvariant : ĠBase Variant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġvariant . name ĊĠĠĠĠĠĠĠ Ġproject . build Dir . resolve (" generated ${ File . separator } ap _ generated _ sources ${ File . separator }${ type }${ File . separator } out "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Q XML _ CON IF G _ PATH ĊĠĠĠĠĠĠĠ Ġ). delete () ĊĠĠĠĠĠĠĠ Ġproject . build Dir . resolve (" generated ${ File . separator } source ${ File . separator } k apt ${ File . separator }${ type } "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Q XML _ CON IF G _ PATH ĊĠĠĠĠĠĠĠ Ġ). delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġfrom Ġbutter Ġkn ife ĊĠĠĠ Ġ// ĠParse Ġthe Ġvariant 's Ġmain Ġmanifest Ġfile Ġin Ġorder Ġto Ġget Ġthe Ġpackage Ġid Ġwhich Ġis Ġused Ġto Ġcreate ĊĠĠĠ Ġ// ĠR . java Ġin Ġthe Ġright Ġplace . ĊĠĠĠ Ġprivate Ġfun Ġget PackageName ( variant : ĠBase Variant ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsl ur per Ġ= ĠXml Sl ur per ( false , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġvariant . source Sets . map Ġ{ Ġit . manifest File Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAccording Ġto Ġthe Ġdocumentation , Ġthe Ġearlier Ġfiles Ġin Ġthe Ġlist Ġare Ġmeant Ġto Ġbe Ġoverridden Ġby Ġthe Ġlater Ġones . ĊĠĠĠĠĠĠĠ Ġ// ĠSo Ġthe Ġfirst Ġfile Ġin Ġthe Ġsource Sets Ġlist Ġshould Ġbe Ġmain . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsl ur per . parse ( list [ 0 ]) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . getProperty ("@ package "). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Source Set ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . plugins . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLibrary Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions . findBy Type ( Library Extension :: class . java )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Source Set ( project , Ġlibrary Variants , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApp Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions . findBy Type ( App Extension :: class . java )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Source Set ( project , Ġapplication Variants , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¾Ŀèµĸ apt çĶŁæĪĲ çļĦ q xml _ config æĸĩä»¶ ä½ľä¸º res èµĦæºĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconfigure Source Set ( ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġvariants : ĠDomain Object Set < out ĠBase Variant >, ĊĠĠĠĠĠĠĠ Ġis App : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġonce Ġ= ĠAtomic Boolean () ĊĠĠĠĠĠĠĠ Ġvariants . all Ġ{ Ġvariant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . source Sets . forEach Ġ{ Ġsource Provider Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġvariant . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Set Ġ= Ġ( source Provider Ġas ĠDefault Android Source Set ). resources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// source Set . src Dir ( project . build Dir . resolve (" generated ${ File . separator } ap _ generated _ sources ${ File . separator }${ type }${ File . separator } out "). resolve ( Constants . Q XML _ CON IF G _ PATH )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// source Set . src Dir ( project . build Dir . resolve (" generated ${ File . separator } source ${ File . separator } k apt ${ File . separator }${ type } "). resolve ( Constants . Q XML _ CON IF G _ PATH )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is App ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate File When Build Start ( once , Ġproject , Ġtype , Ġvariant ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// source Set . src Dir ( final ConfigFile . parent File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Set . src Dir ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . build Dir . resolve ( Constants . Q XML _ DIR _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( Constants . Q XML _ PROJECT _ BUILD _ TEMP _ RES _ PATH ). absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º å¼Ģå§ĭ æĹ¶ åĨį åĪĽå»º éľĢè¦ģ çļĦæĸĩä»¶ ï¼Į Ġ éģ¿åħį è¿Ĳè¡Į Ġgradle w Ġclean Ġassemble Debug Ġ è¿Ļç§į åĳ½ä»¤ æĹ¶ æĸĩä»¶ è¢« åĪłéĻ¤ ĊĠĠĠĠ Ġ* Ġ@ param Ġonce ĠAtomic Boolean ĊĠĠĠĠ Ġ* Ġ@ param Ġproject ĠProject ĊĠĠĠĠ Ġ* Ġ@ param Ġtype ĠString ĊĠĠĠĠ Ġ* Ġ@ param Ġvariant ĠBase Variant ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate File When Build Start ( ĊĠĠĠĠĠĠĠ Ġonce : ĠAtomic Boolean , ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġtype : ĠString , ĊĠĠĠĠĠĠĠ Ġvariant : ĠBase Variant ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . tasks . find ByName (" pre ${ type . capitalize ()} Build ") ?. do First Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( once . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal ConfigFile Ġ= Ġproject . build Dir . resolve ( Constants . Q XML _ DIR _ NAME ). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Q XML _ PROJECT _ BUILD _ TEMP _ RES _ PATH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). resolve ( Constants . Q XML _ PARSE _ FINAL _ CONFIG _ FILE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( final ConfigFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! final ConfigFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ConfigFile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ConfigFile . write Text ("{ \" version Code \": ${ Constants . Q XML _ VERSION _ CODE }, \" view Parse List \": [], \" view Replace List \": [], \" view Gen Class Model Map \": {}, \" interface Model Map \": {}, \" gen ClassName Map \": {}, \" parent Class Map \": {}, \" localVar Map \": {}, \" compat View Info Model Map \": {}, \" layout Param Init Map \": {}, \" valid Code \":\" ${ q xml Valid Code }\" }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid OutputFile Ġ= Ġproject . build Dir . resolve ("${ Constants . Q XML _ CACHE _ DIR }${ variant . dir Name } "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . ID _ COLLECT _ FILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic RO ut put File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( id OutputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! id OutputFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid OutputFile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! public RO ut put File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic RO ut put File . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Id OutputFile Ġ= Ġproject . build Dir . resolve ("${ Constants . Q XML _ CACHE _ DIR }${ variant . dir Name } "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . LAYOUT _ ID _ COLLECT _ FILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( layout Id OutputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! layout Id OutputFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Id OutputFile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// from Ġbutter Ġkn ife ĊĠĠĠ Ġ// çĶŁæĪĲ RS , Ġapplication æĶ¶éĽĨ layout Ġid åĢ¼ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Rs And Layout Id ( ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġvariants : ĠDomain Object Set < out ĠBase Variant >, ĊĠĠĠĠĠĠĠ Ġis Application : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvariants . all Ġ{ Ġvariant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġproject . build Dir . resolve ("${ Constants . GENER ATE _ RS _ PATH }${ variant . dir Name }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Package Ġ= Ġget PackageName ( variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġonce Ġ= ĠAtomic Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . outputs . all Ġ{ Ġoutput Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Build Type Ġ= Ġvariant . name . capitalize () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThough Ġthere Ġmight Ġbe Ġmultiple Ġoutputs , Ġtheir ĠR Ġfiles Ġare Ġall Ġthe Ġsame . ĠThus , Ġwe Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġconfigure Ġthe Ġtask Ġonce Ġwith Ġthe ĠR . java Ġinput Ġand Ġaction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( once . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Resources Ġ= Ġoutput . process Resources Provider . get () Ġ// ĠTODO Ġlazy ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġswitch Ġto Ġbetter ĠAPI Ġonce Ġexists Ġin ĠA GP Ġ( https :// issue tracker . google . com / 1 1 8 6 6 8 0 0 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr File Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . files ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( process Resources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGenerate Library R File Task Ġ-> Ġprocess Resources . getText Symbol OutputFile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLink Application Android Resources Task Ġ-> Ġprocess Resources . getText Symbol OutputFile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Minimum Ġsupported ĠAndroid ĠGradle ĠPlugin Ġis Ġ 3 . 3 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. built By ( process Resources ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġproject . extensions . get ByName (" android ") Ġas ĠBase Extension ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġandroid Jar Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension . sdk Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" platforms ${ File . separator }${ extension . compile Sdk Version }${ File . separator } android . jar " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerate Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" generate ${ cur Build Type } RS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRS Generator :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . output Dir Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . r File Ġ= Ġr File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . packageName Ġ= Ġr Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . className Ġ= Ġ" RS " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . android Jar File Ġ= Ġandroid Jar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . register Java Generating Task ( generate , Ġoutput Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Application ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// application æĹ¶ æĶ¶éĽĨ layout å¯¹åºĶçļĦ id åĢ¼ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Id OutputFile Ġ= Ġproject . build Dir . resolve ("${ Constants . Q XML _ CACHE _ DIR }${ variant . dir Name } "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . LAYOUT _ ID _ COLLECT _ FILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Id Collector Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" layout Id ${ cur Build Type } Collect ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Id Collector :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġt -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . outputFile Ġ= Ġlayout Id OutputFile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . r File Ġ= Ġr File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . assemble Provider . get (). depends On ( layout Id Collector Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Id Collector Task . must Run After ( variant . merge Resources Provider . get ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid OutputFile Ġ= Ġproject . build Dir . resolve ("${ Constants . Q XML _ CACHE _ DIR }${ variant . dir Name } "). resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . ID _ COLLECT _ FILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic RO ut put File Ġ= Ġproject . build Dir . resolve ( Constants . Q XML _ CACHE _ DIR ). parent File . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . PUBLIC _ FILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Collector Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id ${ cur Build Type } Collect ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠId Collector :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġt -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . public RO ut put File Ġ= Ġpublic RO ut put File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . outputFile Ġ= Ġid OutputFile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . r File Ġ= Ġr File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . packageName Ġ= Ġr Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . cur Build Type Ġ= Ġcur Build Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . assemble Provider . get (). depends On ( id Collector Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Collector Task . must Run After ( variant . merge Resources Provider . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }