package Ġcom . engine er . plugin . transforms Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . build . api . transform .* Ċ import Ġcom . android . build . gradle . internal . pipeline . Transform Manager Ċ import Ġcom . android . builder . utils . isValid Zip Entry Name Ċ import Ġcom . android . utils . FileUtils Ċ import Ġcom . engine er . plugin . utils . Be auty Log Ċ import Ġcom . google . common . io . Files Ċ import Ġorg . gradle . api . Project Ċ import Ġjava . io .* Ċ import Ġjava . util . function . Bi Consumer Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip InputStream Ċ import Ġjava . util . zip . Zip OutputStream Ċ Ċ /** Ċ Ġ* Ġ@ author Ġro ok ie Ċ Ġ* Ġ@ since Ġ 1 2 - 0 3 - 2 0 1 9 Ċ Ġ* Ċ Ġ* ĠæĶ¯æĮģ Ġincremental ĠçļĦ Ġtransform Ċ Ġ*/ Ċ abstract Ġclass ĠBase Transform ( private Ġval Ġproject : ĠProject ) Ġ: ĠTransform () Ġ{ ĊĊĊĠĠĠ Ġ// Ġå°Ĩ å¯¹ Ġclass Ġæĸĩä»¶ çļĦ Ġasm Ġ å¤ĦçĲĨ ï¼Į å¤ĦçĲĨ å®Į ä¹ĭåĲİ çļĦ åĨį æ¬¡ å¤įåĪ¶ ï¼Į æĬ½ è±¡ ä¸º ä¸Ģä¸ª ĠBi Consumer ĊĠĠĠ Ġabstract Ġfun Ġprovide Function (): ĠBi Consumer < InputStream , ĠOutputStream >? ĊĊĠĠĠ Ġ// Ġé»ĺè®¤ çļĦ Ġclass Ġ è¿ĩæ»¤ åĻ¨ ï¼Į å¤ĦçĲĨ Ġ. class Ġ ç»ĵ å°¾ çļĦæīĢæľī åĨħå®¹ Ġ( maybe Ġåı¯ä»¥ æī©å±ķ ) ĊĠĠĠ Ġprivate Ġfun Ġclass Filter ( className : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠclassName . endsWith ( Sdk Constants . DOT _ CLASS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTransform Ġ ä½¿ èĥ½ å¼Ģ åħ³ ĊĠĠĠ Ġopen Ġfun Ġis Enabled () Ġ= Ġtrue ĊĊĠĠĠ Ġ// Ġ< editor - fold Ġdefault state =" collapsed " Ġdesc =" basic Ġfunction "> ĊĠĠĠ Ġoverride Ġfun Ġget Scopes (): ĠMutable Set < in ĠQual ified Content . Scope > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTransform Manager . SCOPE _ FULL _ PROJECT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Input Types (): ĠMutable Set < Qualified Content . ContentType > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTransform Manager . CONTENT _ CLASS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Incremental (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġ</ editor - fold > ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transform Invocation : ĠTransform Invocation ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠBe auty Log . log ( name , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠ Ġsuper . transform ( transform Invocation ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġprovide Function () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( function Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" the Ġfunction Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Provider : ĠTransform Output Provider Ġ= Ġtransform Invocation !!. output Provider ĊĊĠĠĠĠĠĠĠ Ġif Ġ( transform Invocation . is Incremental . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Provider . delete All () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( ti Ġin Ġtransform Invocation . inputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( jar Input Ġin Ġti . jar Inputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Jar Ġ= Ġjar Input . file ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Jar Ġ= Ġoutput Provider . getContent Location ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar Input . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar Input . content Types , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar Input . scopes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . JAR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transform Invocation . is Incremental ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¢ŀ éĩı ç¼ĸè¯ĳ æĶ¯æĮģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( jar Input . status Ġ?: ĠStatus . NOT CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . NOT CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . AD DED , ĠStatus . CHANGED Ġ-> Ġtransform Jar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Jar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Jar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . RE MOVED Ġ-> ĠFileUtils . delete ( output Jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Jar ( input Jar , Ġoutput Jar , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( di Ġin Ġti . directory Inputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Dir Ġ= Ġdi . file ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġoutput Provider . getContent Location ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdi . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdi . content Types , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdi . scopes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . DIRECTORY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transform Invocation . is Incremental ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( inputFile , Ġvalue ) Ġin Ġdi . changed Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġto OutputFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value Ġ?: ĠStatus . NOT CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . NOT CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . AD DED , ĠStatus . CHANGED Ġ-> Ġif Ġ(! inputFile . isDirectory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġclass Filter ( inputFile . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform File ( inputFile , Ġout , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . RE MOVED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġto OutputFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete IfExists ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( inputFile Ġin ĠFileUtils . getAll Files ( input Dir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto OutputFile ( output Dir , Ġinput Dir , Ġinput File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Filter ( inputFile . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform File ( inputFile , Ġout , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" transform Ġ$ name Ġ èĢĹ æĹ¶ : Ġ${ ( System . nano Time () Ġ- Ġstart ) Ġ/ Ġ 1 0 0 0 0 0 0 f } Ġms " ĊĠĠĠĠĠĠĠ ĠBe auty Log . dog ( msg ) ĊĠĠĠĠĠĠĠ ĠBe auty Log . log ( name , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġtransform Jar ( ĊĠĠĠĠĠĠĠ Ġinput Jar : ĠFile , ĊĠĠĠĠĠĠĠ Ġoutput Jar : ĠFile , ĊĠĠĠĠĠĠĠ Ġfunction : ĠBi Consumer < InputStream , ĠOutputStream >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( output Jar ) ĊĠĠĠĠĠĠĠ ĠFileInputStream ( input Jar ). use Ġ{ Ġfis Ġ-> Ġ// TODO Ġuse Ġæĸ¹æ³ķ èĩªåĬ¨ åħ³éĹŃ æµģ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZip InputStream ( fis ). use Ġ{ Ġz is Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( output Jar ). use Ġ{ Ġf os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip OutputStream ( fos ). use Ġ{ Ġz os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġentry Ġ= Ġz is . next Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( entry Ġ!= Ġnull Ġ&& ĠisValid Zip Entry Name ( entry )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! entry . isDirectory Ġ&& Ġclass Filter ( entry . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . put Next Entry ( Zip Entry ( entry . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply ( function , Ġz is , Ġz os ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠDo Ġnot Ġcopy Ġresources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Ġ= Ġz is . next Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġtransform File ( ĊĠĠĠĠĠĠĠ Ġinput File : ĠFile , ĠoutputFile : ĠFile , Ġfunction : ĠBi Consumer < InputStream , ĠOutputStream >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . create Parent Dirs ( outputFile ) ĊĠĠĠĠĠĠĠ ĠFileInputStream ( inputFile ). use Ġ{ Ġfis Ġ-> Ġ// use Ġæĸ¹æ³ķ èĩªåĬ¨ åħ³éĹŃ æµģ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( outputFile ). use Ġ{ Ġf os Ġ-> Ġapply ( function , Ġfis , Ġf os ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto OutputFile ( ĊĠĠĠĠĠĠĠ Ġoutput Dir : ĠFile , Ġinput Dir : ĠFile , Ġinput File : ĠFile ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . relative Po ss ibly Non Existing Path ( inputFile , Ġinput Dir ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġapply ( ĊĠĠĠĠĠĠĠ Ġfunction : ĠBi Consumer < InputStream , ĠOutputStream > ?, ĊĠĠĠĠĠĠĠ ĠinputStream : ĠInputStream , ĠoutputStream : ĠOutputStream ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ?. accept ( inputStream , ĠoutputStream ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn checked IOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe . cause !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }