/* Ċ Ġ* Ġ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 . builder . internal . packaging Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . sign fl inger . Signed A pk Ċ import Ġcom . android . sign fl inger . Signed A pk Options Ċ import Ġcom . android . tools . build . apk zlib . sign . Signing Options Ċ import Ġcom . android . tools . build . apk zlib . z file . A pk Creator Ċ import Ġcom . android . tools . build . apk zlib . z file . A pk Creator Factory Ċ import Ġcom . android . tools . build . apk zlib . z file . Native Libraries Pack aging Mode Ċ import Ġcom . android . zip fl inger . Bytes Source Ċ import Ġcom . android . zip fl inger . Zip Archive Ċ import Ġcom . android . zip fl inger . Zip Source Ċ import Ġcom . google . common . base . Function Ċ import Ġcom . google . common . base . Preconditions Ċ import Ġcom . google . common . base . Predicate Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Invalid Path Exception Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . Fork Join Pool Ċ import Ġjava . util . concurrent . Fork Join Task Ċ import Ġjava . util . zip . De flater Ċ Ċ // ĠTODO Ġensure Ġthat Ġall Ġinput Ġzip Ġentries Ġhave Ġdesired Ġcompression Ġ- Ċ // Ġ Ġhttps :// issue tracker . google . com / 1 3 5 2 7 5 5 5 8 Ċ Ċ /** ĠAn Ġimplementation Ġof Ġ[ A pk Creator ] Ġusing Ġthe Ġzip fl inger Ġlibrary Ġ*/ Ċ class ĠA pk Fl inger ( ĊĠĠĠ Ġcreation Data : ĠA pk Creator Factory . Creation Data , ĊĠĠĠ Ġprivate Ġval Ġcompression Level : ĠInt Ċ ) Ġ: ĠA pk Creator Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġarchive Ġfile , Ġwhich Ġmust Ġbe Ġsynchronized Ġbecause Ġwe Ġmake Ġasync Ġcalls Ġto Ġit Ġin Ġthe ĊĠĠĠĠ Ġ* Ġwrite File Ġmethod Ġbelow , Ġin Ġorder Ġto Ġdo Ġcompression Ġin Ġparallel . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġarchive : ĠSynchron ized Archive ĊĊĠĠĠ Ġ/** ĠPredicate Ġdefining Ġwhich Ġfiles Ġshould Ġnot Ġbe Ġcompressed . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġno Compress Predicate : ĠPredicate < String > ĊĊĠĠĠ Ġ/** ĠPredicate Ġdefining Ġwhich Ġfiles Ġshould Ġbe Ġpage Ġaligned . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpage Align Predicate : ĠPredicate < String > ĊĊĠĠĠ Ġ/** Ġfork Join Pool Ġused Ġso Ġthat Ġcompression Ġcan Ġoccur Ġin Ġparallel Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġfork Join Pool Ġ= ĠFork Join Pool . common Pool () ĊĠĠĠ Ġprivate Ġval Ġsub Tasks Ġ= Ġmutable ListOf < Fork Join Task < Unit >>() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( creation Data . native Libraries Pack aging Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNative Libraries Pack aging Mode . COMPRESSED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Compress Predicate Ġ= Ġcreation Data . no Compress Predicate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Align Predicate Ġ= ĠPredicate Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNative Libraries Pack aging Mode . UN COMPRESSED _ AND _ ALIGN ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase No Compress Predicate Ġ= Ġcreation Data . no Compress Predicate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Compress Predicate Ġ= ĠPredicate Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase No Compress Predicate . apply ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġname ?. endsWith ( Sdk Constants . DOT _ NATIVE _ LIBS ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Align Predicate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPredicate Ġ{ Ġit ?. endsWith ( Sdk Constants . DOT _ NATIVE _ LIBS ) Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsigning Options : ĠSign ing Options ? Ġ= Ġcreation Data . signing Options . or Null () ĊĠĠĠĠĠĠĠ Ġif Ġ( signing Options Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Ġ= ĠSynchron ized Archive ( Zip Archive ( creation Data . apk Path )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned A pk Options Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSigned A pk Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificates ( signing Options . certificates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Min Sdk Version ( signing Options . min Sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set PrivateKey ( signing Options . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set V 1 Enabled ( signing Options . is V 1 Signing Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set V 2 Enabled ( signing Options . is V 2 Signing Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set V 1 CreatedBy ( creation Data . created By Ġ?: ĠDEFAULT _ CREATED _ BY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set V 1 Trust Manifest ( creation Data . is Incremental ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( signing Options . executor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned A pk Options Builder . set Executor ( signing Options . executor !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSynchron ized Archive ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSigned A pk ( creation Data . apk Path , Ġsigned A pk Options Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCop ies Ġthe Ġcontent Ġof Ġa ĠJar / Zip Ġarchive Ġinto Ġthe Ġreceiver Ġarchive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > An Ġoptional Ġpredicate Ġallows Ġto Ġselect ively Ġchoose Ġwhich Ġfiles Ġto Ġcopy Ġover Ġand Ġan ĊĠĠĠĠ Ġ* Ġoptional Ġfunction Ġallows Ġrenaming Ġthe Ġfiles Ġas Ġthey Ġare Ġcopied . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > If Ġany Ġentries Ġin Ġzip Ġalready Ġexist Ġin Ġthis Ġarchive , Ġthey Ġmust Ġbe Ġdeleted Ġwith ĊĠĠĠĠ Ġ* Ġ[ delete File ] Ġbefore Ġcalling Ġthis Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > After Ġcalling Ġthis Ġmethod , Ġany Ġcalls Ġat Ġall Ġto Ġ[ delete File ] Ġwill Ġresult Ġin Ġan Ġerror . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġzip Ġthe Ġzip Ġto Ġcopy Ġdata Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġtransform Ġan Ġoptional Ġtransform Ġto Ġapply Ġto Ġfile Ġnames Ġbefore Ġcopying Ġthem ĊĠĠĠĠ Ġ* Ġ@ param Ġis Ignored Ġan Ġoptional Ġfilter Ġor Ġ{@ code Ġnull } Ġto Ġmark Ġwhich Ġout Ġfiles Ġshould Ġnot Ġbe ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġadded , Ġeven Ġthrough Ġthey Ġare Ġon Ġthe Ġzip ; Ġif Ġ{@ code Ġtransform } Ġis Ġspecified , Ġthen Ġthis ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġpredicate Ġapplies Ġafter Ġtransformation ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠI / O Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġwrite Zip ( ĊĠĠĠĠĠĠĠ Ġzip : ĠFile , Ġtransform : ĠFunction < String , ĠString > ?, Ġis Ignored : ĠPredicate < String >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPreconditions . check Argument ( zip . isFile , Ġ"! zip . isFile () ") ĊĊĠĠĠĠĠĠĠ Ġval Ġignore Predicate Ġ: ĠPredicate < String > Ġ= Ġis Ignored Ġ?: ĠPredicate Ġ{ Ġfalse Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġzip Source Ġ= ĠZip Source ( zip ) ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġzip Source . entries (). values ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . isDirectory Ġ|| Ġignore Predicate . apply ( entry . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġtransform ?. apply ( entry . name ) Ġ?: Ġentry . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . contains ("../ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Path Exception ( name , Ġ" Entry Ġname Ġcontains Ġinvalid Ġcharacters ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Source Entry Ġ= Ġzip Source . select ( entry . name , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! entry . is Compressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Align Predicate . apply ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Source Entry . align ( PAGE _ ALIGNMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġdefault Ġall Ġun compressed Ġentries Ġare Ġaligned Ġat Ġ 4 Ġbyte Ġboundaries . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Source Entry . align ( DEFAULT _ ALIGNMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġarchive . add ( zip Source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrites Ġa Ġnew Ġ[ File ] Ġinto Ġthe Ġarchive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > If Ġthis Ġfile Ġentry Ġalready Ġexists Ġin Ġthis Ġarchive , Ġit Ġmust Ġbe Ġdeleted Ġwith Ġ[ delete File ] ĊĠĠĠĠ Ġ* Ġbefore Ġcalling Ġthis Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > After Ġcalling Ġthis Ġmethod , Ġany Ġcalls Ġat Ġall Ġto Ġ[ delete File ] Ġwill Ġresult Ġin Ġan Ġerror . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput File Ġthe Ġ{@ link ĠFile } Ġto Ġwrite . ĊĠĠĠĠ Ġ* Ġ@ param Ġapk Path Ġthe Ġfilepath Ġinside Ġthe Ġarchive . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠI / O Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġwrite File ( inputFile : ĠFile , Ġapk Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsub Tasks . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfork Join Pool . submit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmay Compress Ġ= Ġ! no Compress Predicate . apply ( apk Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Source Ġ= ĠBytes Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . read All Bytes ( inputFile . to Path ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapk Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( may Compress ) Ġcompression Level Ġelse ĠDe flater . NO _ COMPRESS ION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! may Compress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Align Predicate . apply ( apk Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Source . align ( PAGE _ ALIGNMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġdefault Ġall Ġun compressed Ġentries Ġare Ġaligned Ġat Ġ 4 Ġbyte Ġboundaries . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Source . align ( DEFAULT _ ALIGNMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive . add ( bytes Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġthe Ġentry Ġwith Ġthe Ġgiven Ġapk Path Ġfrom Ġthe Ġ[ Zip Archive ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > If Ġthis Ġmethod Ġis Ġcalled Ġafter Ġany Ġwrite Zip () Ġor Ġwrite File () Ġcalls , Ġan Ġerror Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġthrown . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġapk Path Ġthe Ġpath Ġto Ġremove ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġfailed Ġto Ġremove Ġthe Ġentry ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġdelete File ( apk Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarchive . delete ( apk Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġis Ġnever Ġcalled . ĠWe Ġcan Ġdelete Ġthis Ġmethod Ġonce Ġwe Ġmigrate Ġaway Ġfrom Ġimplementing ĊĠĠĠ Ġ// Ġap kz lib 's ĠA pk Creator ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġhas Pending Change sWith Wait (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" not Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsub Tasks . forEach Ġ{ Ġit . join () Ġ} ĊĠĠĠĠĠĠĠ Ġarchive . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠA pk Creator Type Ġ{ ĊĠĠĠ ĠA PK _ FL ING ER , ĊĠĠĠ ĠA PK _ Z _ FILE _ CRE ATOR Ċ } Ċ Ċ private Ġconst Ġval ĠDEFAULT _ ALIGNMENT Ġ= Ġ 4 L Ċ private Ġconst Ġval ĠPAGE _ ALIGNMENT Ġ= Ġ 4 0 9 6 L Ċ Ċ private Ġconst Ġval ĠDEFAULT _ CREATED _ BY Ġ= Ġ" Generated - by - AD T " Ċ