/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . build . gradle . internal . dependency Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . build . gradle . internal . Logger Wrapper Ċ import Ġcom . android . build . gradle . internal . tasks . J aco co Task Ċ import Ġcom . android . build . gradle . tasks . to Serializable Ċ import Ġcom . android . builder . files . Relative File Ċ import Ġcom . android . builder . files . Relative Files Ċ import Ġcom . android . builder . files . Serializable Change Ċ import Ġcom . android . builder . files . Serializable File Changes Ċ import Ġcom . android . ide . common . resources . File Status Ċ import Ġcom . android . utils . FileUtils Ċ import Ġcom . google . common . io . Byte Streams Ċ import Ġorg . gradle . api . artifacts . Artifact View Ċ import Ġorg . gradle . api . artifacts . transform . Cache able Transform Ċ import Ġorg . gradle . api . artifacts . transform . Input Artifact Ċ import Ġorg . gradle . api . artifacts . transform . Transform Action Ċ import Ġorg . gradle . api . artifacts . transform . Transform Outputs Ċ import Ġorg . gradle . api . file . Configurable File Collection Ċ import Ġorg . gradle . api . file . FileSystem Location Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . api . tasks . Classpath Ċ import Ġorg . gradle . api . tasks . Internal Ċ import Ġorg . gradle . api . tasks . Path Sensitive Ċ import Ġorg . gradle . api . tasks . Path Sensitivity Ċ import Ġorg . gradle . work . Incremental Ċ import Ġorg . gradle . work . Input Changes Ċ import Ġorg . jetbrains . kotlin . gradle . internal . ensure Parent Dirs Created Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Unchecked IOException Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip File Ċ import Ġjava . util . zip . Zip OutputStream Ċ import Ġjavax . inject . Inject Ċ Ċ @ Cache able Transform Ċ abstract Ġclass ĠJ aco co Transform Ġ: ĠTransform Action < J aco co Transform . Params > Ġ{ ĊĊĠĠĠ Ġabstract Ġclass ĠParams Ġ: ĠGeneric Transform Parameters Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ get : Internal ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġj aco co Version : ĠProperty < String > ĊĊĠĠĠĠĠĠĠ Ġ@ get : Classpath ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġj aco co Configuration : ĠConfigur able File Collection ĊĊĠĠĠĠĠĠĠ Ġ@ get : Internal ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġj aco co Instrumentation Service : ĠProperty < J aco co Instrumentation Service > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ get : Inject ĊĠĠĠ Ġabstract Ġval Ġinput Changes : ĠInput Changes ĊĊĠĠĠ Ġ@ get : Input Artifact ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . REL ATIVE ) ĊĠĠĠ Ġ@ get : Incremental ĊĠĠĠ Ġabstract Ġval Ġinput Artifact : ĠProvider < FileSystem Location > ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transform Outputs : ĠTransform Outputs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠLogger Wrapper . getLogger ( this :: class . java ) ĊĠĠĠĠĠĠĠ Ġtransform Non Increment ally ( input Artifact . get (). as File , Ġtransform Outputs , Ġlogger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Jar File ( candidate File : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠ Ġcandidate File . isFile Ġ&& Ġcandidate File . extension Ġ== ĠS dk Constants . EXT _ JAR ĊĊĠĠĠ Ġprivate Ġfun Ġtransform Non Increment ally ( ĊĠĠĠĠĠĠĠ Ġfile : ĠFile , ĊĠĠĠĠĠĠĠ Ġtransform Outputs : ĠTransform Outputs , ĊĠĠĠĠĠĠĠ Ġlogger : ĠLogger Wrapper ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . isDirectory Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Out Dir Ġ= Ġtransform Outputs . dir (" instrument ed _ classes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Out Dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Instrument ing Ġfile : Ġ${ file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument Dir ( file , Ġclass Out Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Jar File ( file ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġtransform Outputs . file ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" instrument ed _${ file . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Instrument ing Ġjar : Ġ${ file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument Jar ( file , ĠoutputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" $ file Ġis Ġnot Ġsupported Ġas Ġa ĠJ aco co Transform Ġinput . Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Input Ġartifacts Ġmust Ġbe Ġsingle Ġa Ġdirectory Ġor Ġfile .""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstrument Dir ( in Dirs : ĠFile , Ġoutput Dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRelative Files . from Directory ( in Dirs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġrelative File Ġ-> Ġ Ġrelative File . file . extension Ġ== ĠS dk Constants . EXT _ CLASS Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġclass File Ġ-> Ġinstrument Class File ( class File , Ġoutput Dir ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstrument Jar ( input Jar : ĠFile , Ġoutput Jar : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZip OutputStream ( Buffered OutputStream ( File OutputStream ( output Jar ))). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ed Jar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip File ( input Jar ). use Ġ{ Ġzip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġzip . entries () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( entries . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġentries . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Name Ġ= Ġentry . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġwhen Ġ( get Instrumentation Action ( entry Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Task . Action . IGNORE Ġ-> Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Task . Action . COPY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte Streams . toByteArray ( zip . getInputStream ( entry )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Task . Action . INSTR UMENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . jac oco Instrumentation Service . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. instrument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip . getInputStream ( entry ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . jac oco Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . jac oco Version . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Entry Ġ= ĠZip Entry ( entry Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAny Ġnegative Ġtime Ġvalue Ġsets ĠZip Entry 's Ġx d ost ime Ġto ĠDO ST IME _ BEFORE _ 1 9 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconstant . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Entry . time Ġ= Ġ- Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ed Jar . put Next Entry ( next Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ed Jar . write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ed Jar . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn checked IOException (" Unable Ġto Ġinstrument Ġfile Ġwith ĠJ aco co : Ġ$ input Jar ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstrument Class File ( class File : ĠRelative File , Ġoutput Dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġoutput Dir . resolve ( class File . relative Path ) ĊĠĠĠĠĠĠĠ ĠoutputFile . ensure Parent Dirs Created () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( get Instrumentation Action ( class File )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Task . Action . IGNORE Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Task . Action . COPY Ġ-> ĠFileUtils . copy File ( class File . file , ĠoutputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ aco co Task . Action . INSTR UMENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . write Bytes ( class File . file . inputStream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . jac oco Instrumentation Service . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. instrument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass File . relative Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . jac oco Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . jac oco Version . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Instrumentation Action ( relative File : ĠRelative File ): ĠJ aco co Task . Action Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Instrumentation Action ( relative File . relative Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Instrumentation Action ( relative Path : ĠString ): ĠJ aco co Task . Action Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJ aco co Task . calculate Action ( relative Path ) ĊĠĠĠ Ġ} Ċ } Ċ