/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 Ġ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 . gradle . internal . fixtures . Fake Configurable File Collection Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake File Change Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake File Collection Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Property Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Provider Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Work Executor Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Input Changes Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake No Op Analytics Service Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake ObjectFactory Ċ import Ġcom . android . build . gradle . internal . profile . Analytics Service Ċ import Ġcom . android . build . gradle . internal . transforms . No Op Message Receiver Ċ import Ġcom . android . build . gradle . options . Sync Options Ċ import Ġcom . android . build . gradle . tasks . to Serializable Ċ import Ġcom . android . builder . dex ing . Class File Inputs Ċ import Ġcom . android . builder . dex ing . Dex Archive Builder Ċ import Ġcom . android . builder . dex ing . Dex Parameters Ċ import Ġcom . android . builder . dex ing . Dex ing Type Ċ import Ġcom . android . builder . dex ing . r 8 . Class File Provider Factory Ċ import Ġcom . android . test utils . Test Inputs Generator Ċ import Ġcom . android . test utils . TestUtils Ċ import Ġcom . android . test utils . truth . Dex Subject . assertThat Dex Ċ import Ġcom . android . test utils . truth . Path Subject . assertThat Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . gradle . api . file . Regular File Ċ import Ġorg . gradle . test fixtures . Project Builder Ċ import Ġorg . gradle . work . Change Type Ċ import Ġorg . gradle . work . Input Changes Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġjava . io . File Ċ Ċ class ĠDex Mer ging Task Test Ġ{ ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġtmp Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Mono Dex () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Dirs Ġ= ĠlistOf ( generate Dex Archive ( listOf (" test / A ", Ġ" test / B ", Ġ" test / C "))) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input Dirs , Ġoutput Dir , Ġde xing Type Ġ= ĠDex ing Type . MON O _ DEX ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Dex ( output Dir . resolve (" classes . dex ")). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L test / A ;", Ġ" L test / B ;", Ġ" L test / C ; ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Legacy Multi Dex () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Dirs Ġ= ĠlistOf ( generate Dex Archive ( listOf (" test / A ", Ġ" test / B ", Ġ" test / C "))) ĊĠĠĠĠĠĠĠ Ġval Ġmulti dex Pro guard Rules File Ġ= Ġtmp . new File (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text (" Ġ- keep Ġclass Ġtest . A ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuser Multi dex Keep File Ġ= Ġtmp . new File (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text (" test / B . class ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Dirs , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġde xing Type Ġ= ĠDex ing Type . LEG ACY _ MULT ID EX , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Sdk Version Ġ= Ġ 1 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti dex Pro guard Rules File Ġ= Ġmulti dex Pro guard Rules File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Classes Ġ= ĠlistOf ( TestUtils . resolve Platform Path (" android . jar "). to File ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Multi dex Keep File Ġ= Ġuser Multi dex Keep File ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( output Dir . resolve (" classes . dex ")). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L test / A ;", Ġ" L test / B ; ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( output Dir . resolve (" classes 2 . dex ")). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L test / C ; ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Native Multi Dex () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Input Dirs Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġinput Dirs Ġ= Ġ( 0 Ġuntil Ġnum Input Dirs ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" test / A $ it ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input Dirs , Ġoutput Dir , Ġde xing Type Ġ= ĠDex ing Type . NATIVE _ MULT ID EX ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Dex ( output Dir . resolve (" classes . dex ")). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġnum Input Dirs ). map Ġ{ Ġ" L test / A $ it ;" Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġnon - incremental Ġbuild Ġwith Ġbuckets `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Dirs Ġ= Ġ( 0 Ġuntil Ġ 2 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" package $ it / Class 0 ", Ġ" package $ it / Class 1 "), Ġoutput To Dir Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinput J ars Ġ= Ġ( 2 Ġuntil Ġ 4 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" package $ it / Class 0 ", Ġ" package $ it / Class 1 "), Ġoutput To Dir Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input Dirs Ġ+ Ġinput J ars , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġdex Ġfiles Ġare Ġput Ġinto Ġbuckets ĊĠĠĠĠĠĠĠ ĠassertThat ( output Dir . list Files ()). has Length ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlso Ġcheck Ġthat Ġclasses Ġof Ġthe Ġsame Ġpackage Ġare Ġput Ġin Ġthe Ġsame Ġbucket / merged Ġdex ĊĠĠĠĠĠĠĠ Ġ// Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġbucket 0 Ġ= Ġoutput Dir . resolve (" 0 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Ġ= Ġoutput Dir . resolve (" 1 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Ġ= Ġoutput Dir . resolve (" 2 / classes . dex ") ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 0 / Class 1 ;", Ġ" L package 2 / Class 0 ;", Ġ" L package 2 / Class 1 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 0 ;", Ġ" L package 1 / Class 1 ;", Ġ" L package 3 / Class 0 ;", Ġ" L package 3 / Class 1 ; ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġincremental Ġbuild Ġwith Ġchanged Ġdex Ġfile `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Dirs Ġ= Ġ( 0 Ġuntil Ġ 4 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" package $ it / Class $ it ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġfull Ġbuild ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input Dirs , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbucket 0 Ġ= Ġoutput Dir . resolve (" 0 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Ġ= Ġoutput Dir . resolve (" 1 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Ġ= Ġoutput Dir . resolve (" 2 / classes . dex ") ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Timestamp Ġ= Ġbucket 1 . lastModified () ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Timestamp Ġ= Ġbucket 2 . lastModified () ĊĊĠĠĠĠĠĠĠ Ġ// ĠChange Ġa Ġdex Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġinput Changes Ġ= ĠFake Input Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Changes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake File Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġinput Dirs [ 0 ]. resolve (" package 0 / Class 0 . dex "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Path Ġ= Ġ" package 0 / Class 0 . dex ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Type Ġ= ĠChange Type . MODI FIED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġincremental Ġbuild ĊĠĠĠĠĠĠĠ ĠTestUtils . waitFor FileSystem Tick () ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input Dirs , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 , Ġinput Changes Ġ= Ġinput Changes ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġonly Ġthe Ġimpact ed Ġbucket ( s ) Ġare Ġre - merged ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 1 Timestamp ). is LessThan ( bucket 1 . lastModified ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 2 Timestamp ). isEqualTo ( bucket 2 . lastModified ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġincremental Ġbuild Ġwith Ġadded Ġjar `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput J ars Ġ= Ġ( 0 Ġuntil Ġ 4 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" package $ it / Class $ it "), Ġoutput To Dir Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġfull Ġbuild ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input J ars , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbucket 0 Ġ= Ġoutput Dir . resolve (" 0 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Ġ= Ġoutput Dir . resolve (" 1 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Ġ= Ġoutput Dir . resolve (" 2 / classes . dex ") ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Timestamp Ġ= Ġbucket 1 . lastModified () ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Timestamp Ġ= Ġbucket 2 . lastModified () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġjar ĊĠĠĠĠĠĠĠ Ġval Ġadded Input Jar Ġ= Ġgenerate Dex Archive ( listOf (" package 4 / Class 4 "), Ġoutput To Dir Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġinput Changes Ġ= ĠFake Input Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Changes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake File Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġadded Input Jar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Path Ġ= Ġadded Input Jar . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Type Ġ= ĠChange Type . AD DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġincremental Ġbuild ĊĠĠĠĠĠĠĠ ĠTestUtils . waitFor FileSystem Tick () ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input J ars Ġ+ Ġadded Input Jar , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 , Ġinput Changes Ġ= Ġinput Changes ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ;", Ġ" L package 4 / Class 4 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġonly Ġthe Ġimpact ed Ġbucket ( s ) Ġare Ġre - merged ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 1 Timestamp ). is LessThan ( bucket 1 . lastModified ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 2 Timestamp ). isEqualTo ( bucket 2 . lastModified ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġincremental Ġbuild Ġwith Ġmodified Ġjar `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput J ars Ġ= Ġ( 0 Ġuntil Ġ 4 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" package $ it / Class $ it "), Ġoutput To Dir Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġfull Ġbuild ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input J ars , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbucket 0 Ġ= Ġoutput Dir . resolve (" 0 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Ġ= Ġoutput Dir . resolve (" 1 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Ġ= Ġoutput Dir . resolve (" 2 / classes . dex ") ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Timestamp Ġ= Ġbucket 1 . lastModified () ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Timestamp Ġ= Ġbucket 2 . lastModified () ĊĊĠĠĠĠĠĠĠ Ġ// ĠModify Ġa Ġjar ĊĠĠĠĠĠĠĠ Ġval Ġinput Changes Ġ= ĠFake Input Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Changes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake File Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġinput J ars [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Path Ġ= Ġinput J ars [ 0 ]. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Type Ġ= ĠChange Type . MODI FIED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġincremental Ġbuild ĊĠĠĠĠĠĠĠ ĠTestUtils . waitFor FileSystem Tick () ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input J ars , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 , Ġinput Changes Ġ= Ġinput Changes ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġall Ġthe Ġbuckets Ġare Ġre - merged ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 1 Timestamp ). is LessThan ( bucket 1 . lastModified ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 2 Timestamp ). is LessThan ( bucket 2 . lastModified ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġincremental Ġbuild Ġwith Ġremoved Ġjar `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput J ars Ġ= Ġ( 0 Ġuntil Ġ 4 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( listOf (" package $ it / Class $ it "), Ġoutput To Dir Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġtmp . new Folder () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġfull Ġbuild ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input J ars , Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbucket 0 Ġ= Ġoutput Dir . resolve (" 0 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Ġ= Ġoutput Dir . resolve (" 1 / classes . dex ") ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Ġ= Ġoutput Dir . resolve (" 2 / classes . dex ") ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 0 / Class 0 ;", Ġ" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĠĠĠĠĠĠĠ Ġval Ġbucket 1 Timestamp Ġ= Ġbucket 1 . lastModified () ĊĠĠĠĠĠĠĠ Ġval Ġbucket 2 Timestamp Ġ= Ġbucket 2 . lastModified () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġa Ġjar ĊĠĠĠĠĠĠĠ Ġval Ġinput Changes Ġ= ĠFake Input Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Changes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake File Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġinput J ars [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Path Ġ= Ġinput J ars [ 0 ]. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Type Ġ= ĠChange Type . RE MOVED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġincremental Ġbuild ĊĠĠĠĠĠĠĠ ĠTestUtils . waitFor FileSystem Tick () ĊĠĠĠĠĠĠĠ Ġrun Dex Mer ging ( input J ars . drop ( 1 ), Ġoutput Dir , ĠnumberOf Buckets Ġ= Ġ 3 , Ġinput Changes Ġ= Ġinput Changes ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 0 ). does NotExist () ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 1 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 2 / Class 2 ; ")) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( bucket 2 ). contains Exactly Classes In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" L package 1 / Class 1 ;", Ġ" L package 3 / Class 3 ; ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġall Ġthe Ġbuckets Ġare Ġre - merged ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 1 Timestamp ). is LessThan ( bucket 1 . lastModified ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( bucket 2 Timestamp ). is LessThan ( bucket 2 . lastModified ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Un stable Api Usage ") ĊĠĠĠ Ġprivate Ġfun Ġrun Dex Mer ging ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Dirs Or J ars : ĠList < File >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġde xing Type : ĠDex ing Type Ġ= ĠDex ing Type . NATIVE _ MULT ID EX , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Sdk Version : ĠInt Ġ= Ġ 2 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Multi dex Keep File : ĠFile ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Buckets : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Changes : ĠInput Changes Ġ= ĠFake Input Changes (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Classes : ĠList < File > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti dex Pro guard Rules File : ĠFile ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Dex List Output : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= ĠProject Builder . builder (). with Project Dir ( tmp . new Folder ()). build () ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠDex Mer ging Task Delegate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Parameters (): ĠParams Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠParams () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġshared Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . objects . property ( Dex Mer ging Task . Shared Params :: class . java ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set ( object Ġ: ĠDex Mer ging Task . Shared Params () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġde xing Type Ġ= ĠFake Gradle Property ( dex ing Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmin Sdk Version Ġ= ĠFake Gradle Property ( min Sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġdebug gable Ġ= ĠFake Gradle Property ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġerror Format Mode Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Property ( Sync Options . Error Format Mode . HUM AN _ READ ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmain Dex List Config : ĠMain Dex List Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠMain Dex List Config () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġuser Multi dex Keep File Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Property ( user Multi dex Keep File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġa apt Generated Rules Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake ObjectFactory . factory . file Property () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġuser Multi dex Pro guard Rules Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake ObjectFactory . factory . list Property ( Regular File :: class . java ). also Ġ{ Ġlist Property Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti dex Pro guard Rules File ?. let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Property . add ( Fake ObjectFactory . factory . file Property () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. file Value ( file )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġlibrary Classes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake Configurable File Collection ( library Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġplatform Multi dex Pro guard Rules Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake ObjectFactory . factory . list Property ( String :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval ĠnumberOf Buckets Ġ= ĠFake Gradle Property ( numberOf Buckets ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġdex Dirs Or J ars Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake ObjectFactory . factory . list Property ( File :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( input Dirs Or J ars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġoutput Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake ObjectFactory . factory . directory Property (). file Value ( output Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmain Dex List Output Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake ObjectFactory . factory . file Property (). file Value ( main Dex List Output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġincremental Ġ= ĠFake Gradle Property ( input Changes . is Incremental ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġfile Changes Ġ= ĠFake Gradle Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Changes . getFile Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake File Collection ( dex Dirs Or J ars . get ())). to Serializable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval ĠprojectName Ġ= ĠFake Gradle Property (" projectName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtask Owner Ġ= ĠFake Gradle Property (" task Owner ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġworker Key Ġ= ĠFake Gradle Property (" worker Key ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġanalytics Service Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . objects . property ( Analytics Service :: class . java ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set ( Fake No Op Analytics Service ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġworker Executor Ġ= ĠFake Gradle Work Executor ( project . objects , Ġtmp . new Folder ()) ĊĠĠĠĠĠĠĠ Ġ}. execute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Dex Archive ( empty ClassNames : ĠList < String >, Ġoutput To Dir : ĠBoolean Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdex Archive Path Ġ= Ġif Ġ( output To Dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . new Folder () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . new Folder (). resolve (" file . jar ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( empty ClassNames , Ġdex Archive Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdex Archive Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Dex Archive ( empty ClassNames : ĠList < String >, Ġdex Archive Path : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Classes Dir Ġ= Ġtmp . new Folder (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Inputs Generator . dir With Empty Classes ( it . to Path (), Ġempty ClassNames ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgenerate Dex Archive ( empty Classes Dir , Ġdex Archive Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Dex Archive ( classes Dir Or Jar : ĠFile , Ġdex Archive Path : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠDex Archive Builder . create D 8 Dex Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDex Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Sdk Version Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug gable Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdex Per Class Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Des ug aring Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdes ugar Boot classpath Ġ= ĠClass File Provider Factory ( emptyList ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdes ugar Classpath Ġ= ĠClass File Provider Factory ( emptyList ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcore Lib Des ugar Config Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcore Lib Des ugar Output Keep Rule File Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Receiver Ġ= ĠNo Op Message Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠClass File Inputs . from Path ( classes Dir Or Jar . to Path ()). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . convert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . entries Ġ{ Ġ_, Ġ_ Ġ-> Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdex Archive Path . to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ