/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġ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 . tasks Ċ Ċ import Ġcom . android . build . api . transform . Qualified Content . Default ContentType Ċ import Ġcom . android . build . gradle . internal . dsl . A apt Options Ċ import Ġcom . android . build . gradle . internal . pipeline . Extended ContentType Ċ import Ġcom . android . build . gradle . internal . pipeline . Transform Manager Ċ import Ġcom . android . build . gradle . internal . scope . A pk Data Ċ import Ġcom . android . build . gradle . internal . scope . Build Elements Ċ import Ġcom . android . build . gradle . internal . scope . Build Elements Transform Params Ċ import Ġcom . android . build . gradle . internal . scope . Build Elements Transform Runnable Ċ import Ġcom . android . build . gradle . internal . scope . Build Output Ċ import Ġcom . android . build . gradle . internal . scope . Existing Build Elements Ċ import Ġcom . android . build . gradle . internal . scope . Internal Artifact Type Ċ import Ġcom . android . build . gradle . internal . scope . Multiple Artifact Type Ċ import Ġcom . android . build . gradle . internal . scope . Variant Scope Ċ import Ġcom . android . build . gradle . internal . tasks . factory . Variant Task Creation Action Ċ import Ġcom . android . build . gradle . internal . utils . set Dis allow Changes Ċ import Ġcom . android . build . gradle . options . Boolean Option Ċ import Ġcom . android . build . gradle . tasks . Resource Usage Analyzer Ċ import Ġcom . android . utils . FileUtils Ċ import Ġcom . google . common . base . Join er Ċ import Ġorg . gradle . api . file . Configurable File Collection Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . file . Regular File Property Ċ import Ġorg . gradle . api . logging . LogLevel Ċ import Ġorg . gradle . api . logging . Logging Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . tasks . Cache able Task Ċ import Ġorg . gradle . api . tasks . Classpath Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Input Directory Ċ import Ġorg . gradle . api . tasks . Input File Ċ import Ġorg . gradle . api . tasks . Optional Ċ import Ġorg . gradle . api . tasks . Output Directory Ċ import Ġorg . gradle . api . tasks . Path Sensitive Ċ import Ġorg . gradle . api . tasks . Path Sensitivity Ċ import Ġorg . gradle . api . tasks . Task Provider Ċ import Ġorg . xml . sax . SAX Exception Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . xml . parsers . Parser ConfigurationException Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof ĠResource ĠSh rink ing Ġas Ġa Ġtask . Ċ Ġ*/ Ċ @ Cache able Task Ċ abstract Ġclass ĠSh rink Resources Task Ġ: ĠNon Incremental Task () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġbuild TypeName : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġa apt Options : ĠA apt Options ĊĊĠĠĠ Ġ@ get : Input Directory ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . REL ATIVE ) ĊĠĠĠ Ġabstract Ġval Ġun compressed Resources : ĠDirectory Property ĊĊĠĠĠ Ġ@ get : Optional ĊĠĠĠ Ġ@ get : Input File ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . REL ATIVE ) ĊĠĠĠ Ġabstract Ġval Ġlight R Classes : ĠRegular File Property ĊĊĠĠĠ Ġ@ get : Optional ĊĠĠĠ Ġ@ get : Input File ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . NONE ) ĊĠĠĠ Ġabstract Ġval Ġr Txt File : ĠRegular File Property ĊĊĠĠĠ Ġ@ get : Input Directory ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . REL ATIVE ) ĊĠĠĠ Ġabstract Ġval Ġresource Dir : ĠDirectory Property ĊĊĠĠĠ Ġ@ get : Optional ĊĠĠĠ Ġ@ get : Input File ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . REL ATIVE ) ĊĠĠĠ Ġabstract Ġval Ġmapping File Src : ĠRegular File Property ĊĊĠĠĠ Ġ@ get : Input Directory ĊĠĠĠ Ġ@ get : Path Sensitive ( Path Sensitivity . REL ATIVE ) ĊĠĠĠ Ġabstract Ġval Ġmerged Manifest s : ĠDirectory Property ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġabstract Ġval Ġdebug gable Build Type : ĠProperty < Boolean > ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġabstract Ġval Ġenable RT xt Resource Shrink ing : ĠProperty < Boolean > ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġabstract Ġval Ġvariant TypeName : ĠProperty < String > ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġfun Ġget A apt Options AsString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJoin er . on ("; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa apt Options . ignore Assets Pattern Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJoin er . on (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ( a apt Options . no Compress Ġ?: ĠlistOf < String > ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa apt Options . fail On Missing Config Entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJoin er . on (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ( a apt Options . additional Parameters Ġ?: listOf < String > ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa apt Options . c run cher Processes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ get : Classpath ĊĠĠĠ Ġabstract Ġval Ġclasses : ĠConfigur able File Collection ĊĊĠĠĠ Ġ@ get : Output Directory ĊĠĠĠ Ġabstract Ġval Ġcompressed Resources : ĠDirectory Property ĊĊĠĠĠ Ġoverride Ġfun Ġdo Task Action () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmerged Manifest s Outputs Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExisting Build Elements . from ( Internal Artifact Type . MER GED _ MAN IFEST S , Ġmerged Manifest s ) ĊĊĠĠĠĠĠĠĠ ĠExisting Build Elements . from ( Internal Artifact Type . PROC ES SED _ RES , Ġun compressed Resources ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Worker Facade With Workers (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSplit ter Runnable :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġapk Info : ĠA pk Data , Ġbuild Input : ĠFile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSplit ter Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapk Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Input , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Manifest s Outputs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. into ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . SH RUN K _ PROC ES SED _ RES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompressed Resources . get (). as File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCreation Action ( ĊĠĠĠĠĠĠĠ Ġvariant Scope : ĠVariant Scope ĊĠĠĠ Ġ) Ġ: ĠVariant Task Creation Action < Shrink Resources Task >( variant Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype Ġ= ĠSh rink Resources Task :: class . java ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname Ġ= Ġvariant Scope . get Task Name (" shrink ", Ġ" Res ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġclasses Ġ= Ġvariant Scope . transform Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Pipeline Output As File Collection Ġ{ Ġcontent Types , Ġscopes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . intersect ( Transform Manager . SCOPE _ FULL _ PROJECT ). isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( content Types . contains ( Default ContentType . CLASSES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġcontent Types . contains ( Extended ContentType . DEX )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Provider ( task Provider : ĠTask Provider < out ĠSh rink Resources Task >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Provider ( task Provider ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant Scope . artifacts . pro duces Dir ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Type Ġ= ĠInternal Artifact Type . SH RUN K _ PROC ES SED _ RES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Provider Ġ= Ġtask Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Provider Ġ= ĠSh rink Resources Task :: compressed Resources , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= Ġ" out " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconfigure ( task : ĠSh rink Resources Task ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . configure ( task ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Data Ġ= Ġvariant Scope . variant Data ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifacts Ġ= Ġvariant Scope . artifacts ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . set Task Input To Final Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . PROC ES SED _ RES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . un compressed Resources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variant Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. global Scope . project Options [ Boolean Option . ENABLE _ R _ TXT _ RESOURCE _ SH R INK ING ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . set Task Input To Final Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . RUNTIME _ SYMBOL _ LIST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . r Txt File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . set Task Input To Final Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . COMPILE _ AND _ RUNTIME _ NOT _ NAMES P AC ED _ R _ CLASS _ JAR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . light R Classes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . set Task Input To Final Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . MER GED _ NOT _ COMPI LED _ RES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . resource Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( artifacts . has Final Product ( Internal Artifact Type . AP K _ MAPPING )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . set Task Input To Final Product ( Internal Artifact Type . AP K _ MAPPING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . mapping File Src ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . set Task Input To Final Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . MER GED _ MAN IFEST S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . merged Manifest s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . a apt Options Ġ= Ġvariant Scope . global Scope . extension . a apt Options ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . build TypeName Ġ= Ġvariant Data . variant Dsl Info . component Identity . build Type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . variant TypeName . set Dis allow Changes ( variant Data . type . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . debug gable Build Type . set Dis allow Changes ( variant Data . variant Dsl Info . isDebug gable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . enable RT xt Resource Shrink ing . set ( variant Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. global Scope . project Options [ Boolean Option . ENABLE _ R _ TXT _ RESOURCE _ SH R INK ING ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĠR 8 Ġproduces Ġdex Ġfiles , Ġthis Ġtask Ġanaly zes Ġthem . ĠIf ĠR 8 Ġor ĠPro guard Ġproduce ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass Ġfiles , Ġthis Ġtask Ġwill Ġanalyze Ġthose . ĠThat Ġis Ġwhy Ġboth Ġtypes Ġare Ġspecified . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . has Final Product ( Internal Artifact Type . SH RUN K _ CLASSES ) Ġ-> Ġtask . classes . from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . get Final Product As File Collection ( Internal Artifact Type . SH RUN K _ CLASSES )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . has Final Products ( Multiple Artifact Type . DEX ) Ġ-> Ġtask . classes . from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant Scope . global Scope . project . files ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . get Operations (). getAll ( Multiple Artifact Type . DEX ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtask . classes . from ( classes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠSplit ter Runnable Ġ@ Inject ĊĠĠĠ Ġconstructor ( params : ĠSplit ter Params ) Ġ: ĠBuild Elements Transform Runnable ( params ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġparams Ġas ĠSplit ter Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreport File : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . mapping File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Dir Ġ= Ġparams . mapping File . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport File Ġ= ĠFile ( log Dir , Ġ" resources . txt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . mkdir s ( params . output . parent File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . merged Manifest Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . copy File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . un compressed Resource File , Ġparams . output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogging . getLogger ( Shrink Resources Task :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error (" Failed Ġto Ġcopy Ġun compressed Ġresource Ġfile Ġ: ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcopy Ġun compressed Ġresource Ġfile ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn alyze Ġresources Ġand Ġusage s Ġand Ġstrip Ġout Ġunused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠResource Usage Analyzer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . r Source Variant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . classes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . merged Manifest . outputFile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . mapping File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . resource Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource Usage Analyzer . A pk Format . BINARY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . is Verbose Ġ= Ġparams . is Info Logging Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . isDebug Ġ= Ġparams . isDebug Logging Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . analyze () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParser ConfigurationException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSAX Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġrewrite Ġthe Ġ. ap _ Ġfile Ġto Ġstrip Ġout Ġthe Ġres / Ġfiles Ġfor Ġunused Ġresources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . rewrite Resource Zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . un compressed Resource File , Ġparams . output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDump Ġsome Ġstats ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunused Ġ= Ġanalyzer . unused Resource Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( unused Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Removed Ġunused Ġresources ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġa Ġbit Ġmis leading Ġuntil Ġwe Ġcan Ġstrip Ġout Ġall Ġresource Ġtypes : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// int Ġtotal Ġ= Ġanalyzer . getTotal Resource Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// sb . append (" (" Ġ+ Ġunused Ġ+ Ġ"/" Ġ+ Ġtotal Ġ+ Ġ") ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= Ġparams . un compressed Resource File . length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Ġ= Ġparams . output . length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= Ġ(( before Ġ- Ġafter ) Ġ* Ġ 1 0 0 Ġ/ Ġbefore ). toInt (). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (": ĠBinary Ġresource Ġdata Ġreduced Ġfrom Ġ${ to Kb String ( before )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" KB Ġto Ġ${ to Kb String ( after )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" KB : ĠRemoved Ġ${ percent }% ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! our Warn ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġour Warn ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNote : ĠIf Ġnecessary , Ġyou Ġcan Ġdisable Ġresource Ġshrink ing Ġby Ġadding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Types Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ params . build TypeName } Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshrink Resources Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} """. trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogging . getLogger ( Splitter Runnable :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. log ( LogLevel . INFO , Ġsb . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠSplit ter Params Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġapk Info : ĠA pk Data , ĊĠĠĠĠĠĠĠ Ġval Ġun compressed Resource File : ĠFile , ĊĠĠĠĠĠĠĠ Ġmerged Manifest s : ĠBuild Elements , ĊĠĠĠĠĠĠĠ Ġval Ġclasses : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġtask : ĠSh rink Resources Task ĊĠĠĠ Ġ) Ġ: ĠBuild Elements Transform Params () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġoutput : ĠFile Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . compressed Resources . get (). as File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" resources -${ apk Info . base Name }- stri pped . ap _" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġmerged Manifest : ĠBuild Output ? Ġ= Ġmerged Manifest s . element ( apk Info ) ĊĠĠĠĠĠĠĠ Ġval Ġmapping File : ĠFile ? Ġ= Ġtask . mapping File Src . or Null ?. as File ĊĠĠĠĠĠĠĠ Ġval Ġbuild TypeName : ĠString ? Ġ= Ġtask . build TypeName ĊĠĠĠĠĠĠĠ Ġval Ġr Source Variant : ĠFile Ġ= Ġif Ġ( task . enable RT xt Resource Shrink ing . get ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . r Txt File . get (). as File ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . light R Classes . get (). as File ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresource Dir : ĠFile Ġ= Ġtask . resource Dir . get (). as File ĊĠĠĠĠĠĠĠ Ġval Ġis Info Logging Enabled : ĠBoolean Ġ= Ġtask . logger . isEnabled ( LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġval Ġis Debug Logging Enabled : ĠBoolean Ġ= Ġtask . logger . isEnabled ( LogLevel . DEBUG ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhether Ġwe 've Ġalready Ġwarn ed Ġabout Ġhow Ġto Ġturn Ġoff Ġshrink ing . ĠUsed Ġto Ġavoid ĊĠĠĠĠĠĠĠĠ Ġ* Ġrepe ating Ġthe Ġsame Ġmulti - line Ġmessage Ġfor Ġevery Ġrepeated Ġabi Ġsplit . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġour Warn ed Ġ= Ġtrue Ġ// ĠLogging Ġdisabled Ġuntil Ġshrink ing Ġis Ġon Ġby Ġdefault . ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Kb String ( size : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( size . toInt () Ġ/ Ġ 1 0 2 4 ). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }