/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 Ġ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 . lint Ċ Ċ import Ġorg . gradle . api . file . Configurable File Collection Ċ import Ġorg . gradle . api . logging . Logging Ċ import Ġorg . gradle . api . provider . List Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . workers . Work Action Ċ import Ġorg . gradle . workers . Work Parameters Ċ import Ġjava . net . URL ClassLoader Ċ Ċ @ Suppress (" Un stable Api Usage ") Ċ abstract Ġclass ĠAndroid Lint Work Action Ġ: ĠWork Action < Android Lint Work Action . Lint Work Action Parameters > Ġ{ ĊĊĠĠĠ Ġabstract Ġclass ĠL int Work Action Parameters Ġ: ĠWork Parameters Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġmain Class : ĠProperty < String > ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġarguments : ĠList Property < String > ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġclasspath : ĠConfigur able File Collection ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġandroid : ĠProperty < Boolean > ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġfatal Only : ĠProperty < Boolean > ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġcache ClassLoader : ĠProperty < Boolean > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠLogging . getLogger ( this . java Class ) ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġparameters . arguments . get () ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Running Ġlint Ġ" Ġ+ Ġarguments . join ToString (" Ġ")) ĊĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Max Ġmemory Ġfor ĠAndroid ĠL int : Ġ{} m \ n ( can Ġbe Ġconfigured Ġby Ġ{} = 2 G Ġin Ġgradle . properties )", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). max Memory () Ġ/ Ġ 1 0 2 4 Ġ/ Ġ 1 0 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcom . android . build . gradle . options . String Option . L INT _ HEAP _ SIZE . propertyName ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġexec Result Ġ= Ġrun Lint ( arguments ) ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Lint Ġreturned Ġ$ exec Result ") ĊĠĠĠĠĠĠĠ Ġif Ġ( exec Result Ġ== ĠERR NO _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! parameters . android . get () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL int Ġfound Ġerrors Ġin Ġthe Ġproject ; Ġabort ing Ġbuild . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFix Ġthe Ġissues Ġidentified Ġby Ġlint , Ġor Ġadd Ġthe Ġfollowing Ġto Ġyour Ġbuild Ġscript Ġto Ġproceed Ġwith Ġerrors : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlint Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabort OnError Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . fatal Only . get () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL int Ġfound Ġfatal Ġerrors Ġwhile Ġassemb ling Ġa Ġrelease Ġtarget . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTo Ġproceed , Ġeither Ġfix Ġthe Ġissues Ġidentified Ġby Ġlint , Ġor Ġmodify Ġyour Ġbuild Ġscript Ġas Ġfollows : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlint Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Release Build s Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOr , Ġif Ġyou Ġprefer , Ġyou Ġcan Ġcontinue Ġto Ġcheck Ġfor Ġerrors Ġin Ġrelease Ġbuilds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġcontinue Ġthe Ġbuild Ġeven Ġwhen Ġerrors Ġare Ġfound : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabort OnError Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL int Ġfound Ġerrors Ġin Ġthe Ġproject ; Ġabort ing Ġbuild . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFix Ġthe Ġissues Ġidentified Ġby Ġlint , Ġor Ġadd Ġthe Ġfollowing Ġto Ġyour Ġbuild Ġscript Ġto Ġproceed Ġwith Ġerrors : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlint Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabort OnError Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( exec Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ ERRORS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameters . android . get () Ġ&& Ġparameters . fatal Only . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lint Ġfound Ġfatal Ġerrors Ġwhile Ġassemb ling Ġa Ġrelease Ġtarget ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lint Ġfound Ġerrors Ġin Ġthe Ġproject ; Ġabort ing Ġbuild ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ USAGE Ġ-> Ġthrow ĠIllegalStateException (" Internal ĠError : ĠUnexpected Ġlint Ġusage ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ EXISTS Ġ-> Ġthrow ĠRuntimeException (" Unable Ġto Ġwrite Ġlint Ġoutput ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ HELP Ġ-> Ġthrow ĠIllegalStateException (" Internal Ġerror : ĠUnexpected Ġlint Ġhelp Ġcall ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ INVALID _ ARGS Ġ-> Ġthrow ĠIllegalStateException (" Internal Ġerror : ĠUnexpected Ġlint Ġinvalid Ġarguments ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ CREATED _ BASE LINE Ġ-> Ġthrow ĠRuntimeException (" Abort ing Ġbuild Ġsince Ġnew Ġbaseline Ġfile Ġwas Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERR NO _ APP LIED _ SU G GEST IONS Ġ-> Ġthrow ĠRuntimeException (" Abort ing Ġbuild Ġsince Ġsources Ġwere Ġmodified Ġto Ġapply Ġquick fixes Ġafter Ġcompilation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Internal Ġerror : Ġunexpected Ġlint Ġreturn Ġvalue Ġ${ exec Result }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Lint ( arguments : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameters . cache ClassLoader . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached ClassLoader Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached ClassLoader Ġ= Ġcreate ClassLoader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke Lint Main Run Method ( cached ClassLoader !! , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate ClassLoader (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke Lint Main Run Method ( it , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ClassLoader (): ĠURL ClassLoader Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclasspath Urls Ġ= Ġparameters . classpath . files . map Ġ{ Ġit . to URI (). to URL () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġreturn ĠURL ClassLoader ( classpath Urls , Ġget Platform ClassLoader ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinvoke Lint Main Run Method ( class Loader : ĠClassLoader , Ġarguments : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġval ĠreturnValue : ĠInt Ġ= ĠMain (). run ( arguments . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġval Ġcls Ġ= Ġclass Loader . load Class ( parameters . main Class . get ()) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcls . getMethod (" run ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġlint Main Ġ= Ġcls . getDeclared Constructor (). newInstance () ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue Ġ= Ġmethod . invoke ( lint Main , Ġarguments . to Typed Array ()) Ġas ĠInt ĊĊĠĠĠĠĠĠĠ Ġ// ĠU ast Environment . dispose Application Environment () ĊĠĠĠĠĠĠĠ Ġval Ġu ast Environment Ġ= Ġclass Loader . load Class (" com . android . tools . lint . U ast Environment ") ĊĠĠĠĠĠĠĠ Ġval Ġdispose Method Ġ= Ġu ast Environment . getDeclared Method (" dispose Application Environment ") ĊĠĠĠĠĠĠĠ Ġdispose Method . invoke ( null ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠreturnValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Platform ClassLoader (): ĠClassLoader Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠA GP Ġis Ġcurrently Ġcompiled Ġagainst Ġjava Ġ 8 ĠAPIs , Ġso Ġdo Ġthis Ġby Ġreflection Ġ( b / 1 6 0 3 9 2 6 5 0 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠClassLoader :: class . java . getMethod (" get Platform ClassLoader "). invoke ( null ) Ġas ĠClassLoader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ SUCCESS Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ ERRORS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ USAGE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ EXISTS Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ HELP Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ INVALID _ ARGS Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ CREATED _ BASE LINE Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERR NO _ APP LIED _ SU G GEST IONS Ġ= Ġ 7 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcached ClassLoader : ĠURL ClassLoader ? Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ